第17-18讲

  • 格式:doc
  • 大小:77.00 KB
  • 文档页数:4

第17讲
延时程序在单片机中用途很广,例如,有时为了协调计算机与外设之间工作速度上的差异,需要等待外设工作的完成;有时片内定时器资源不足,这些都可以用延时程序来解决。

所谓延时程序,就是让计算机执行一些无用的操作,消耗一定的时间。

例4-5编写延时1ms子程序,设晶振频率fosc=6MHz。

解:fosc=6MHz时,机器周期Tm=2μs。

DJNZ是双周期指令,即4μs,循环执行250次需时4μs*250=1000μs=1ms。

参考程序如下:
DEL1MS:MOV R7,#250 ;1*1*2μs=2μs
DEL1: DJNZ R7,DEL1;250*2*2μs=1000μs
RET ;1*2*2μs=4μs
以上程序实际延时时间为1000μs+1*1*2μs+1*2*2μs=1006μs,若要获得准确延时时间,程序可修改为:
DEL1MS:MOV R7,#248 ;1*1*2μs=2μs
DEL1: DJNZ R7,DEL1 ;248*2*2μs=992μs
NOP ;1*1*2μs=2μs
RET ;1*2*2μs=4μs
例4-6编写延时1s子程序,设晶振频率fosc=12MHz。

解:fosc=12MHz时,机器周期Tm=1μs。

DEL1S:MOV R2,#10 ;1次*1μs=1μs
DEL1: MOV R3,#200 ;10次*1μs=10μs
DEL2: MOV R4,#248 ;10*200次*1μs=2000μs
DEL3: DJNZ R4,DEL3;10*248*200次*2μs=992000μs NOP ;10*200次*1μs=2000μs
DJNZ R3,DEL2;10*200次*2μs=4000μs
DJNZ R2,DEL1;10次*2μs=20μs
RET ;1次*2μs=2μs
延时时间为:1000033μs≈1s
4.2.4查表程序
查表程序是把事先计算的数据或实验数据按一定顺序编成表格,存放在ROM中,然后根据输入参数值,从表中获取结果。

查表程序可以完成数据补偿、计算和转换等功能。

专用于查表的指令有两条:MOVC A,@A+DPTR
MOVC A,@A+PC
1使用DPTR作为基址的查表操作步骤:
(1)把数据表格的首地址送入DPTR。

(2)把要查得的数在表中相对于表首地址的偏移量送入A。

(3)执行“MOVC A,@A+DPTR”指令,查得结果在A中。

2使用PC作为基址的查表操作步骤:
(1)把要查得的数在表中相对于表首地址的偏移量送入A。

(2)使用“ADD A,#data”指令对A值进行修正。

其中data=表首地址-PC当前值,即MOVC指令和数据表格首地址之间的字节数。

(3)执行“MOVC A,@A+PC”指令,查得结果在A中。

例4-7设有一个巡回检测报警装置,需对16路输入进行控制,每路有一个双字节的最大允许值。

控制时,需根据测量路数,找出该路的最大允许值,看输入值是否大于最大允许值,如大于则报警。

(1)题目分析:路数为X(0≤X≤15),Y为最大允许值,放在数据表中。

根据X查出Y。

由于Y值为双字节,故需执行两次查表指令。

(2)硬件资源分配:R2:巡回检测路数(X)
R3、R4存放查表结果(Y)
(3)参考程序如下:
TB1: MOV A,R2 ;输入路数X值
ADD A,R2 ;X乘2与双字节Y相对应
MOV R3,A ;保存变址指针
ADD A,#6 ;查表指令与表首地址相差6字节
MOVC A,@A+PC ;查第1字节字节数
XCH A,R3 ;查表结果存R3,取变址指针1
ADD A,#3 ;查表指令与表首第2字节地址相差3字节2
MOVC A,@A+PC ;查第1字节1
MOV R4,A ;查表结果存R4 1
RET 1 TAB1:DW 1520,3721,4264,7850,3483,32657,883,9943 DW 1000,4051,6785,8931,4468,5871,13284,27808
(4)说明:上述查表程序有一个局限,表格长度不能超过255个字节。

超过时必须使用指令“MOVC A,@A+DPTR”,并且需要对DPH、DPL
进行运算处理,求出表格的地址,下面举例说明。

第18讲
例4-8温控系统中,检测的电压与温度呈非线性关系,为此要做线性化补偿。

测得的电压已由A/D转换为10位二进制数。

根据实验测得数据来构成温度线性化补偿表。

(1)题目分析:采样电压值X为输入,根据X查出线性温度值Y。

(2)硬件资源分配:R2、R3:查表前放X,查表后放Y
DPTR:数据表格的地址指针
(3)参考程序如下:
CHAB:MOV DPTR,#TAB;赋值表首地址
MOV A,R3 ;R2R3←(R2R3)*2,X*2与双字节Y相对应
CLR C ;CY=1时,“RLC A”指令不能实现A*2
RLC A ;左移一位相当于乘2
MOV R3,A ;R3←R3*2
XCH A,R2 ;R2←R3*2,A←R2
RLC A ;R2*2(R3中移出的D7(CY)进入R2的D0)XCH A,R2 ;R2←R2*2,A←暂存于R2的R3*2
ADD A,DPL ;计算查表地址低8位
MOV DPL,A
MOV A,DPH ;计算查表地址高8位
ADDC A,R2
MOV DPH,A
CLR A ;计算后的偏移量已在DPTR中,故需A=0
MOVC A,@A+DPTR ;查Y值高字节
MOV R2,A
CLR A
INC DPTR ;指向表的下一单元
MOVC A,@A+DPTR ;查Y值低字节
MOV R3,A
RET
TAB: DW …
4.2.5散转程序
散转程序是分支程序的一种,使用指令“JMP @A+DPTR”可实现多分支转移。

例4-10根据R2的内容,转向各个处理程序。

即(R2)=0,转向PRG0程序;(R2)=1,转向PRG1程序…(R2)=255,转向PRG255程序。

(1)参考程序如下:
MOV DPTR,#TAB1;置转移表首地址
MOV A,R2 ;输入分支序号
ADD A,R2 ;分支序号乘2与表中AJMP双字节相对应
JNC NADD;R2*2≤255跳到NADD
INC DPH ;R2*2>255处理地址表高8位
NADD:JMP @A+DPTR ;散转至地址表
TAB1:AJMP PRG0 ;转向各个处理程序
AJMP PRG1

AJMP PRG255
(2)程序说明
1)由于使用的AJMP指令为双字节指令,故R2中的分支序号需要乘2才能保证正确地实现散转,若使用三字节的LJMP指令,R2中的分支序号需要乘3。

当R2*3>255时,需要修改DPTR的高8位。

2)由于使用了AJMP指令,故所有处理程序PRG0、…、PRG255和散转表首址TAB1必须在同一2kB范围内。

如果2kB范围内放不下所有处理程序,可以在2kB范围内用LJMP转向处理程序的实际地址。