第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
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:
MOV DPTR,#TABLE
MOV R7,#32H
MOV R0,#00H
MOV R1,#00H
LOOP:
MOV A,#00H
MOVC A,@A+DPTR
CJNE A,#80H,NOTFIND
MOV R1,DPH
MOV R0,DPL
END
NOTFIND:
INC DPTR
DJNZ R7,LOOP
END
2.实现DPTR自减
CLR C
MOV A,DPL
SUBB A,#1
MOV DPL,A
MOV A,DPH
SUBB A,#0
MOV DPH,A
3.微机控制系统,按下按钮,延时10s亮红灯,再延时30s亮绿灯,同时数码管在延时小于10s时显示9 ~ 1的数字倒数,DELAY_1S
可以直接使用
(1)画出硬件图(7pts)
连好晶振接到时钟端,P3.2通过按钮接地,也可接上拉电阻
P1.0,P1.1分别接红LED和绿LED,再连接一个电阻接地
P2口驱动数码管
(2)写出数码管控制代码(5pts)
ORG 0100H
MOV R5,#9
LOOP:
MOV DPTR,#1000H
MOV A,R5
MOVC A,@A+DPTR
MOV P2,A
LCALL DELAY_1S
DJNZ R5,LOOP
ORG 1000H
DB C0H,F9H,A4H,B0H,99H,92H,82H,0F8H,80H,90H
22-23春夏
1.片外RAM中以TAB地址开始有10个字节数据,把它们的最高位都置1
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:
MOV DPTR,#TAB
MOV R7,#10
MOV A,#00H
LOOP:
MOVX A,@DPTR
ORL A,#80H
MOVX @DPTR,A
INC DPTR
DJNZ R7,LOOP
END
2.P1.0口输出周期20ms的方波,使用软件定时
ORG 0000H
LJMP START
ORG 0200H
START:SETB P1.0
LOOP:LCALL DELAY
LJMP LOOP
DELAY:MOV R7,#100
DELY1:MOV R6,#48
NOP
DELY2:DJNZ R6,DELY2
DJNZ R7,DELY1
CPL P1.0
RET
3.给了电路连接图,P0口连数码管a、b、c、d...dp,共阳极数码管。编写程序实现0-9循环显示,每个数显示1s。并且给出程序框图和代码注释。
ORG 0000H
LJMP START
START:
ORG 0100H
MOV R0,#0 ;设定R0初值
LOOP:
MOV DPTR,#1000H ;查表地址
MOV A,R0
MOVC A,@A+DPTR ;查表访问数码管段码值
MOV P0,A ;输出到P0口控制
LCALL DELAY_1S ;延时1秒
INC R0 ;进行下一次循环
CJNE R0,#10,LOOP ;R0=10时,结束循环
DELAY_1S:
MOV R1,#100
DELY3: MOV R2,#100
DELY2: MOV R3,#50
DELY1: DJNZ R3,DELY1
DJNZ R2,DELY2
DJNZ R1,DELY3
ORG 1000H ;数码管段码表
DB C0H,F9H,A4H,B0H,99H,92H,82H,0F8H,80H,90H
21-22春夏
1.将ROM中2000H开始的16字节移到RAM的8000H开始
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:
MOV R0,#30H ;数据缓冲区
MOV DPTR,#2000H ;ROM初地址
MOV R6,#16 ;循环次数
LOOP1:
MOV A,#0 ;第一次查表
MOVC A,@A+DPTR ;查表
MOV @R0,A ;存放到数据缓冲区
INC R0
INC DPTR ;下一次循环
DJNZ R7,LOOP1 ;循环结束,开始存放
MOV R7,#16 ;重置循环次数
MOV R0,#30H ;重置缓冲区
MOVX DPTR,#8000H ;存放初地址
LOOP2:
MOV A,@R0 ;取数据缓冲区
MOV @DPTR,A ;存放数据
INC R0
INC DPTR
DJNZ R7,LOOP2
END
2.将R7R6内的16位数求补并放回去
ORG 0000H
LJMP MAIN
MAIN:
MOV A,R7
ANL A,#80H
CJNE A,#0,CPLD
END
CPLD:
CLR C
MOV A,R6
CPL A
ADD A,#1
MOV R6,A
MOV A,R7
CPL A
ORL A,#80H
ADDC A,#0
MOV R7,A
RET
3.8051外接8个LED,实现LED循环亮起的效果,要求延时1s。画硬件、写流程图、源码和注释
ORG 0000H
AJMP MAIN;
ORG 0030H
MAIN: MOV A, #0FEH ; P2.0端口送0,灯亮
MAIN2: MOV P2, A ;寄存器A中的数据送P2口
ACALL DELAY ;延迟1秒
RL A ;累加器的数据按位循环左移
AJMP MAIN2 ;循环,实现依次点亮LED
;下面DELAY为软件延时函数,通过修改R567的值可改变延时时间
DELAY: MOV R7, #10 ;通过多次循环,实现延迟
DE1: MOV R6, #200;
DE2: MOV R5, #230;
DJNZ R5, $ ;R5减1,不为为零,本地跳转
DJNZ R6, DE2 ;R6减1,不为零,跳转DE2
DJNZ R7, DE1 ;R7减1, 不为零,跳转DE1
RET
20-21春夏
1.两位BCD码分别存在单片机内部RAM20H的低四位和高四位,设计程序将BCD码拆分并转换为ASCII码,其中高位存在21H,低位存在22H
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:
MOV A,20H ;取20H的数据
SWAP A ;高4位换到低4位
ANL A,#0FH ;屏蔽高4位
ORL A,#30H ;高4位置为0011
MOV 21H,A ;高位存到21H
MOV A,20H ;取20H的数据
ANL A,#0FH ;屏蔽高4位
ORL A,#30H ;高4位置为0011
MOV 22H,A ;低位存到22H
2.设计1KHz音频在P1.1单音输出,时钟频率12kHz,要求流程框图和注释
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:
SETB P1.1
LOOP:
LCALL DELAY
CPL P1.1
LJMP LOOP
DELAY:MOV R0,#10 ;延时0.5ms
DELY1:MOV R1,#23
DELY2:DJNZ R1,DELY2
NOP
DJNZ R0,DELY1
RET
18-19春夏
将片外RAM地址起始为8000H的16个字节的数据拷贝到起始为9000H的地址中
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:
MOV R0,#30H
MOV DPTR,#8000H
MOV R7,#16
LOOP1:
MOVX A,@DPTR
MOV @R0,A
INC R0
INC DPTR
DJNZ R7,LOOP1
MOV R0,#30H
MOV DPTR,9000H
MOV R7,#16
LOOP2:
MOV A,@R0
MOVX @DPTR,A
INC R0
INC DPTR
DJNZ R7,LOOP2
END