ZD微机原理Ch04程序设计(第三次课)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ZD微机原理Ch04程序设计(第三次课)
第4章89C51汇编语言程序的设计与调试
知识回顾汇编语言实用程序设计
1 顺序结构:程序执行时,程序流向不变,按顺序一条一条执行指令例将R2寄存器中的两位压缩的BCD 码转换成相应的ASCII 码,存入R1和R0寄存器中。
算法1 ANL 拆字、ORL #30H
拼字
算法2 DIV 拆字、ORL #30H 拼字
2子程序:程序中多次应用、完成相同的某种运算或操作的程序段。
单字节有符号数的加减法子程序
算法:1)减数符号位求反
转化为加法运算
2)加数补码+被加数补码
结果求补
ORG 0000H
MAIN:MOV A,#0FEH ;送显示初值
LP:MOV R0,#10;送闪烁次数LP0:MOV P1,A ;点亮LED
LCALL DELAY ;延时MOV P1,#0FFH ;熄灭灯LCALL DELAY ;延时DJNZ R0,LP0
RL A SJMP LP
DELAY: MOV R3,#0FFH ;延时子程序DEL2: MOV R4,#0FFH DEL1: NOP
DJNZ R4,DEL1DJNZ R3,DEL2RET END
例1:LED 灯的闪烁点亮
延时
次数-1=0
点亮相应的LED
Y
N
熄灭相应的LED
延时
初值左移1位指向下一个LED
设闪烁次数
送显示初值
开始
查表就是根据自变量x ,在表格中寻找y ,使y =f (x ) 优点:避免复杂运算,程序简单、执行速度快等。
执行查表指令时,发出读程序存储器选通脉冲/PSEN 。
查表指令:
MOVC A ,@A+DPTR ;A ←((A)+(DPTR))?MOVC A ,@A+PC ;A ←((A)+(PC))
优点:不影响其他SFR 的值,不需保护其初始值
缺点:表格所在的程序空间受到了限制。
该表格只能存放在这条指令的地址X3X2X1X0以下的00~FFH 之中。
4.3.3 查表程序设计
例4-4 子程序的功能为
根据累加器A 中的数x (0~9之间)查x 的平方表y ,根据x 的值查出相应的平方y 。
x 和y 均为单字节数。
地址子程序
Y3Y2Y1Y0 ADD A,#01H
Y3Y2Y1Y0+2 MOVC A,@A+PC Y3Y2Y1Y0+3 RET
Y3Y2Y1Y0+4 DB 00H,01H,04H,09H,10H
DB 19H,24H,31H,40H,51H
第1条指令ADD A ,#01H 的作用是加上偏移量,可以根据A 的内容查出x 对应的平方。
偏移量=表首地址-(查表指令所在地址+1)表首地址
指令地址偏移量7402240383
F880FE 30313233
PC
ASCTAB +0
0123
ASCTAB +2
3B
PC 当前值+3=PC 当前值+3+2=表头
(A)
表中偏移量
PC 当前值
30 31 32 33
80 FE F88324 0374 02机器码ASCTAB:
DB ‘0’,‘1’,‘2’,‘3’
SJMP $
MOV R0, A MOVC A, @A+PC ADD A, #03H MOV A, #2源程序;存结果
;查表;计算偏移量注释ORG 0100H
MOV A ,R0;取转换值ANL A ,# 0FH ;屏蔽高四位ADD A ,# 03H ;计算偏移量MOVC A ,@A+PC
;查表
MOV R0 ,A ;存结果SJMP $
ASCTAB : DB
‘0’,‘1’,‘2’,‘3’DB ‘4’,‘5’,‘6’,‘7’DB ‘8’,‘9’,‘A ’,‘B ’DB ‘C ’,‘D ’,‘E ’,‘F ’
END
303132333435363738394142
ASCTAB
1B 2B
PC 当前值3B
4.3.3 查表程序设计
一般情况下, 常使用MOVC A ,@+DPTR 指令优点:表格可以设在64K 程序存储器空间内的任何地方,使用较方便。
不像MOVC A ,
@A+PC 那样表格只设在PC 下面的256个单元中,否则需要计算偏移量。
程序设计一般规则: 先确定表格存放的位置在表格中填入相应的数据
查表时先将表格的首地址给DPTR ,再将要查表的数据送给A ,最后用: MOVC A, @A+DPTR
4.3.3 查表程序设计
PUSH DPH ;保存DPH PUSH DPL ;保存DPL MOV DPTR ,#TAB1MOVC A ,@A+DPTR POP DPL ;恢复DPL POP DPH ;恢复DPH RET
TAB1: DB 00H ,01H ,04H ,09H ,10H
DB 19H ,24H ,31H ,40H ,51H
4.3.3 查表程序设计
查表程序实现查表算法。
该方法把事先计算或实验数据按一定顺序编成表格,存于程序存储器内,然后根据输入参数值,从表中取得结果。
查表指令:
MOVC A ,@A+DPTR 查表前
数据表格表头地址存入DPTR ,要查得的数在表中相对表头地址的偏移量送入累加器A ,
最后MOVC A ,@A+DPTR 完成查表,可在64KB 内查表因为DPTR 可以人为修改。
MOVC A ,@A+PC 分为三步:
1)用传送指令把所查数据的项数送入累加器A ;
2)使用ADD A ,#data 指令对累加器A 进行修正,data 值由下式确定:PC 当前值+data=数据表头地址
实际上data 值等于查表指令和数据表格之间的字节数;
3)用指令MOVC A , @A+PC 完成查表由于PC 指针只能在A 中提供的偏移地址的范围内查表,故查表范围共在一页内。
4.3.3 查表程序设计
例4-5 在一个以89C51为核心的温度控制器中,温度传感器输出的电压与温度为非线性关系,传感器输出的电压已由A/D 转换为10位
二进制数。
根据测得的不同温度下的电压值数据构成一个表,表中放温度值y ,x 为电压值数据。
设测得的电压值x 放入R2R3中,根据电压值x ,查找对应的温度值y ,仍放入R2R3中。
本例的x 和y 均为双字节无符号数。
4.3.3 查表程序设计
2高位字节存入
例4-6 设有一个巡回检测报警装置,需对16路输入进行检测,每路有一最大允许值为双字节数。
运行时,需根据测量的路数,找出每路的最大允许值。
看输入值是否大于最大允许值,如大于就报警。
根据上述要求,编一个查表程序。
解:取路数为x (0≤x ≤15),y 为最大允许值,放在表格中。
设进入查表程序前,路数x 已放于R2中,查表后最大值y 放于R3R4中。
本例中的x 为单字节数,y 为双字节数。
查表程序如下:
4.3.3 查表程序设计
4.3.3 查表程序设计
…
994388332657348375804264537211520最大值y 0373H 626D7H 7…
…
7F91H 50D9BH 41D9CH 3A695H 20E89H 105F0H 0
最大值y (H)路数x MOVC A,@A+PC 个字节个字节1个字节
1个字节∑
升序(降序)排列。