第3章 51单片机汇编程序设计
第三章 编程语言程序设计
要求:会用汇编写简单的代码,会画流程图
例题1
假设两个双字节无符号数,分别存放在R1R0和R3R2中,高字节在前,低字节在后。编程使两数相加,和数存放回R2R1R0中。
ORG 1000H
ADD2: CLR C
MOV A,R0 ;取被加数低字节至A
ADD A,R2 ;与加数低字节相加
MOV R0,A ;存和数低字节
MOV A,R1 ;取被加数高字节至A
ADDC A,R3 ;与加数高字节相加
MOV R1,A ;存和数高字节
MOV A,#0
ADDC A,#0 ;加进位位
MOV R2,A ;存和数进位位
SJMP $ ;原地踏步
END
例题2
将内部RAM 20H单元中的8位无符号二进制数转换为三位BCD码,并将结果存放在FIRST(百位)和SECOND(十位、个位)两单元中。
FIRST EQU 22H
SECOND EQU 21H
ORG 1000H
HBCD: MOV A,20H ;取数
MOV B,#64H ;除数设置为100
DIV AB ;除以100
MOV FIRST,A ;百位BCD
MOV A,B
MOV B,#0AH ;除数设置为10
DIV AB ;除以10,A为商,B为余数
SWAP A ;十位数送高位
ORL A,B ;A为(十位、个位)BCD
MOV SECOND,A ;存十位、个位数
SJMP $
END
例题3
将一个字节内的两个BCD码(即一个压缩BCD码)拆开并转换成ASCII码,存入两个RAM单元。设一个压缩BCD码已存放在内部RAM的20H单元,将高半字节的ASCII码存放到21H中,低半字节的ASCII码存放到22H中。
因为BCD数中的0~9对应的ASCII码为30H~39H,所以,转换时,只需将20H中的BCD码拆开后,将BCD的高四位置成“0011”即可。
法一:
ORG 1000H
MOV R0,#22H ;R0←22H
MOV @R0,#0 ;22H←0
MOV A,20H ;压缩BCD数送A
XCHD A,@R0 ;BCDL送22H单元
ORL 22H,#30H ;完成转换
SWAP A ;BCDH至A的低四位
ORL A,#30H ;完成转换
MOV 21H,A ;存数
SJMP $
END
法二:
ORG 1000H
MOV A,20H ;取BCD码
ANL A,#0FH ;屏蔽高四位
ORL A,#30H ;完成转换
MOV 22H,A ;存ASCII码
MOV A,20H ;取BCD码
ANL A,#0F0H ;屏蔽低四位
SWAP A ;交换至低四位
ORL A,#30H ;完成转换
MOV 21H,A ;存ASCII码
SJMP $
END
例题4
软件延时20ms
更多例题请参照ppt
历年题目及参考答案
23-24春夏
1.片外ROM有32字节数据存在TABLE处开始的位置,查询其中有无数值80H,有则将地址保存到R1(高8位)R0(低8位),没有则将R0与R1均置0
2.实现DPTR自减
3.微机控制系统,按下按钮,延时10s亮红灯,再延时30s亮绿灯,同时数码管在延时小于10s时显示9 ~ 1的数字倒数,DELAY_1S
可以直接使用
(1)画出硬件图(7pts)
(2)写出数码管控制代码(5pts)
22-23春夏
1.片外RAM中以TAB地址开始有10个字节数据,把它们的最高位都置1
2.P1.0口输出周期20ms的方波,使用软件定时
3.给了电路连接图,P0口连数码管a、b、c、d...dp,共阳极数码管。编写程序实现0-9循环显示,每个数显示1s。并且给出程序框图和代码注释。
21-22春夏
1.将ROM中2000H开始的16字节移到RAM的8000H开始
2.将R7R6内的两位数求补并放回去
3.8051外接8个LED,实现LED循环亮起的效果,要求延时1s。画硬件、写流程图、源码和注释
20-21春夏
1.两位BCD码分别存在单片机内部RAM20H的低四位和高四位,设计程序将BCD码拆分并转换为ASCII码,其中高位存在21H,低位存在22H
2.设计1KHz音频在P1.1单音输出,时钟频率12kHz,要求流程框图和注释