内容正文:
四川省(电子信息大类)对口招生《单片机原理与应用》
复习讲义
模块 4 程序设计方法
考点三 循环和查表程序
【考纲要求】
1. 能够识读和编写循环程序,知道延时程序的控制原理。
2. 知道查表程序的编写方法,能够识读和编写查表程序。
3. 了解子程序的编写基础,掌握子程序调周用和返回的方法,理解延时子程序的功能。
【知识网络】
【知识和技能要点】
一、循环程序的组成
特点是程序中含有可以反复执行的程序段,该程序段通常称为循环体。
(1)可大大缩短程序长度(2)使程序所占的内存单元数量少(3)使程序结构紧凑和可读性变好。循环结构程序主要由以下四部分组成。
1.循环初始化,循环初始化程序段用于完成循环前的的准备工作。例如,循环控制计数初值的设置、地址指针的起始地址的设置、为变量预置初值等。
2.循环处理,循环程序结构的核心部分,完成实际的处理工作,是需反复循环执行的部分,故又称循环体。这部分程序的内容,取决于实际处理问题的本身。
3.循环控制,在重复执行循环体的过程中,不断修改循环控制变量,直到符合结束条件,就结束循环程序的执行。循环结束控制方法分为循环计数控制法和条件控制法
4.循环修改,修改循环参数,为下次循环做准备。
2、 单重循环
只循环一次的循环称为单重循环。
循环程序中,控制循环次数的方式有多种:如果循环次数已知,常用DJNZ指令来控制循环,这种循环程序为“先执行,后判断”结构;如果循环次数未知,可以按条件控制循环,常用条件转移指令来控制,这种循环程序为“先判断,后执行”结构。
1.“先执行,后判断”结构
在这种结构中,进入循环体后,先执行一次循环体后,再判断循环是否结束。对“先执行,后判断”结构而言,至少要执行一次循环体,如图所示:
2.“先判断,后执行”结构
进入这种结构循环后,首先判断循环结束的条件,根据判断结果决定是否执行循环体,如果一进人循环就满足循环结束条件,循环体将一次也不执行,即循环次数为0。如图所示:
三、多重循环
遇到复杂问题时,采用单循环往往是不够的,还必须采用多重循环才能解决。所谓多重循环是指在循环程序中还嵌套其他循环。使用多重循环时,必须注意以下事项:
①循环嵌套,必须层次分明,不允许产生内外层循环交叉。
②外循环可以一层层向内循环进入,结束时由里往外一层层退出。
③内循环可以直接转入外循环,实现一个循环由多个条件控制的方式。
在一个循环的循环体内部,又完整包含另一个或多个循环结构,外层循环每执行一次,内层循环就完整执行一遍,用于实现复杂的重复操作,是程序设计中常用的高级循环形式。
计数循环结构
计数循环控制结构是依据计数器的值来决定循环次数,一般为减“ 1” 计数器,计数器减到“0”时,结束循环。计数器的初值是在初始化时设定。
MCS-51的指令系统提供了功能极强的循环控制指令:
DJNZ Rn,rel;工作寄存器作控制计数器
DJNZ direct,rel;以直接寻址单元作控制计数器。
最常见的多重循环是由DJNZ指令构成的软件延时程序,它是常用的程序之一。
四、查表程序设计
数据补偿、修正、计算、转换等各种功能,具有程序简单、执行速度快等优点。
查表就是根据自变量x,在表格中寻找y,使y=f(x)。
执行查表指令时,发出读程序存储器选通脉冲PSEN。在MCS-51的指令系统中,给用户提供了两条极为有用的查表指令:
(1) MOVC A,@A+DPTR
(2) MOVC A,@A+PC
指令“MOVC A,@A+DPTR”
完成把A中的内容作为一个无符号数与DPTR中的内容相加,所得结果为某一程序存储单元的地址,然后把该地址单元中的内容送到累加器A中。使用该指令的优点是表格可以设在64K程序存储器空间内的任何地方
指令“MOVC A,@A+PC”
以PC作为基址寄存器,PC的内容和A的内容作为无符号数,相加后所得的数作为某一程序存储器单元的地址,根据地址取出程序存储器相应单元中的内容送到累加器A中。
指令执行完,PC的内容不发生变化,仍指向查表指令的下一条指令。缺点在于该表格只能存放在这条指令的地址XXXX以下的00~FFH(即256个单元)之中。表格所在的程序空间受到了限制。
【练习题】
1、 填空题
1.定义字节表格数据采用的伪指令是_______________。
2.机器周期是1us 时,执行下列程序
MOV R3,#100
LOOP:NOP
DJNZ R3,LOOP
延时时间为______________。
3.循环结构的程序包括________________,_________________,___________________,______________四个部分。
4.判断开关或按键是否按下可采用的指令是____________、____________。
5..假定外部数据存储器2000H单元的内容为60H,执行下列指令后,累加器A的内容为___________。
MOV DPTR,#2000H
MOV A,#00H
MOV A,@DPTR
6.下列程序段执行后,R0=_________,(7EH)=_________,(7FH)=_________。
MOV R0,#7FH
MOV 7EH,#0
MOV 7FH,#40H
DEC @R0
二、选择题
1. 单片机指令中不生成机器码的指令是( )。
A. 数据传送指令 B. 控制转移指令
C. 伪指令 D.控制转移指令
2.下列哪个是赋值伪指令( )。
A.ORG B. EQU C. DB D.BIT
3.重复执行某一操作采用( )。
A.顺序结构 B.分支结构 C. 循环结构 D.以上都可以
4.循环次数已知的程序一般采用什么指令 ( )。
A. CJNE B.DJNZ C. JC D. JB
5.以下哪条指令是以直接寻址单元作控制计数器( )
A. MOVC A,@A+DPTR
B. MOVC A,@A+PC
C. DJNZ Rn,rel
D. DJNZ direct,rel
6.查表程序的优点不包括( )
A. 程序简单 B. 执行速度快
C. 表格位置不受限制 D. 可实现数据补偿、转换等功能
7.指令“MOVC A,@A+PC”的缺点是( )
A. 执行速度慢
B. 表格只能存放在查表指令下00~FFH单元中
C. 不能实现查表功能
D. 需要占用大量内存
8.最常见的多重循环是由( )指令构成的软件延时程序
A. MOVC B. MOV
C. DJNZ D. 条件转移
三、判断题
1.MCS—51指令系统中,指令CJNE A,#data, rel的作用相当于SUBB A,#data与JNC rel的作用。( )
2.MCS—51指令系统中,指令JNB bit,rel是判位转移指令,即表示bit=1时转。( )
3.8031单片机的PC与DPDR都在CPU片内,因此指令MOVC A,@A+PC与指令MOVC A,@A+DPTR执行时只在单片机内部操作,不涉及片外存储器。( )
4.MCS—51指令系统中,指令AJMP addr11 称绝对转移指令,指令包含有11位的转移地址;它是把PC的高5位与指令第一字节中的第7~5位(第4~0位为00001)和指令的第二字中的8位合并在一起构成16位的转移地址。 ( )
5.MCS—51单片机中PUSH和POP指令只能保护现场,不能保护断点。( )
6.绝对调用指令ACALL addr11能在本指令后一字节所在的2K字节程序存贮区内调用子程序。( )
7.指令LCALL addr16能在64K字节范围内调用子程序。( )
8.设PC的内容为35H,若要把程序存贮器08FEH单元的数据传送至累加器A,则必须使用指令MOVC A,@A+PC。( )
四、分析题
1.内部RAM的BLOCK开始的单元中有一无符号数据块,数据块长度存人LEN单元,试编程求其中的最大数并存人MAX单元中。
2.试编写一程序实现数据块传送,将外部数据区DATA1单元开始的50个单字节数依次移至内部RAM中DATA2单元开始的数据区中。
3.编写一个延时1s的子程序(时钟频率为12MHz)
【答案】
一、填空题
1.DB
2.301us
解析:
MOV R3,#100 ;1us
LOOP:NOP ;1us
DJNZ R3,LOOP ;(2+1)*100=300us
总时间300+1=301us
3.循环初始化、循环处理、循环控制、循环修改
4.JB、JNB(或CJNE,合理即可)
5.60H
6.7FH、0、3FH(解析:DEC @R0指令修改7FH单元内容,40H减1为3FH,R0值不变)
二、选择题
1.1.C 2.B 3.C 4.B 5.D 6.C 7.B 8.C
三、判断题
1.× 2.× 3.× 4.√ 5.√ 6.√ 7.√ 8.×
四、分析题(参考答案)
1.
LEN EQU 30H ; 数据长度单元
BLOCK EQU 31H ; 数据块起始单元
MAX EQU 40H ; 最大值存放单元
ORG 0000H ; 程序起始地址
LJMP MAIN ; 跳转到主程序
ORG 0030H ; 主程序存放地址
MAIN:
MOV R0, #BLOCK ; R0指向数据块起始地址
MOV R1, LEN ; R1 = 数据长度(循环计数器)
DEC R1 ; 第一个数作为初值,比较次数=长度-1
MOV A, @R0 ; 取第一个数作为初始最大值
LOOP:
INC R0 ; 指向下一个数据
CLR C ; 清进位位
SUBB A, @R0 ; A - 下一个数(无符号比较)
JC NEXT ; C=1,说明下一个数更大,跳转更新最大值
MOV A, @R0 ; C=0,当前数更大,保持A不变
NEXT:
DJNZ R1, LOOP ; 循环比较,直到所有数遍历完成
MOV MAX, A ; 最终最大值存入MAX单元
SJMP $ ; 程序暂停
END
2.编程思路:利用DPTR指向外部数据区起始地址,R0指向内部数据区起始地址,循环50次,每次将外部数据读入累加器A,再送入内部RAM对应单元,依次完成传送。
程序如下:
MOV DPTR,#DATA1 ;DPTR指向外部数据区DATA1
MOV R0,#DATA2 ;R0指向内部数据区DATA2
MOV R1,#50 ;R1存放传送长度(50个字节)
LOOP:MOVX A,@DPTR ;读取外部数据送入A
MOV @R0,A ;将A中数据送入内部RAM
INC DPTR ;外部地址指针加1
INC R0 ;内部地址指针加1
DJNZ R1,LOOP ;循环50次,完成传送
RET
3.
DELAY_1S:
MOV R5, #10
LOOP1: MOV R6, #200
LOOP2: MOV R7, #248
LOOP3: DJNZ R7, LOOP3
DJNZ R6, LOOP2
DJNZ R5, LOOP1
RET
1. 内层核心 (LOOP3): 248 * 2 = 496 μs
2. 中层核心 (LOOP2): 200 * (1 + 496 + 2) = 200 * 499 = 99,800 μs
3. 外层核心 (LOOP1): 10 * (1 + 99,800 + 2) = 10 * 99,803 = 998,030 μs
4. 进出开销: MOV_R5(1) + RET(2) = 3μs
最终总计: 998,030 + 3= 998,033 μs (约 998ms)
原创精品资源学科网独家享有版权,侵权必究
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$