当前位置:
文档之家› 单片机原理与应用技术重点程序高惠芳
单片机原理与应用技术重点程序高惠芳
; 取低4位BCD码a0
• ADD A, R0
; 求和10×a1+ a0
• MOV 40H, A
; 结果送入40H保存
• SJMP $
; 程序执行完,“原地踏步”
• END
• 例4.3.2 将内部RAM中20H单元的压缩 BCD码拆开,转换成相应的ASC码,存 入21H、22H,高位存22H.(P64)
•
ORG 0000H
•
AJMP main
•
ORG 0100H
• MAIN: MOV 20H,#12H
•
MOV 21H,#34H
•
MOV 30H,#23H
•
MOV 31H,#45H
•
MOV A,20H
•
ADD A,30H
•
MOV 20H,A
•
MOV A,21H
•
ADDC A,31H
•
MOV 21H,A
① MOV 02H ,01H
; 直接寻址 3字节 2周期
② MOV A ,01H
;直接寻址 +寄存器寻址
MOV 02H , A
;4字节 2周期
③ MOV A , R1
; 寄存器寻址 2字节 2周期
MOV R2 , A
④ MOV R0 ,#01H
; 4字节 3周期
MOV 02H ,@R0
; 间接寻址
⑤ PUSH 01H
; 栈操作 4字节 4周期
POP 02H
第三种方法占存储空间少,执行周期短。
补充:设20H,21H单元存放一个16位2进制数X1(高8位存 于21H单元) ;30H,31H单元存放一个16位2进制数 X2,(高8位存于31H单元);求X1+X2,结果存放于20H,21H。 (两数之和不超过16位)
[例3-2]设内部RAM中30H单元的内容为40H ,40H单元的内 容为10H,P1口作输入口,其输入数据为0CAH,程序及执行 后的结果如下:
MOV R0,#30H ;单元地址30H送R0中
MOV A ,@R0 ;R0 间址,将30H单元内容送A
MOV R1 ,A
;A送R1
MOV B ,@R1 ;R1间址,将40H单元内容送B
• ANL A, #0F0H
; 取高4位BCD码a1
• SWAP A
; 高4位与低4位换位
• MOV B, #0AH
; 将二进制数10送入B
• MUL AB
; 将10×a1送入A中
• MOV R0, A
; 结果送入R0中保存
• MOV A, 30H
; 再取两位BCD压缩码a1a0送A
• ANL A, #0FH
分析: 除最低字节可以使用ADD指令之外, 其它字节相加时要把低字节的进位考虑进去, 因此使用ADDC指令.
MOV 00H,C #20H
分支程序是通过转移指令实现的
一、单分支程序 使用条件转移指令实现,即根据条件对程序
的执行进行判断,满足条件则进行程序转移,否 则程序顺利执行。 可实现单分支程序转移的指令有:
传送类指令举例:
[例3-1]已知(R0)=30H,问执行如下程序,A、R4、
30H和31H单元的内容是什么。
MOV A , #10H
(A)=10H
MOV R4 ,#36H
(R4)=36H
MOV @R0 ,#7AH
(30H)=7AH
MOV 31H ,#01H
(31H)=01H
解:8051执行上述指令后的结果为:
开始
Y=0 X=0源自YX=0?-1 X<0
NY X>0?
N
Y0
Y1
Y -1
结束
• ORG 1000H
• START: MOV A, 40H ; 将X送入A中
•
JZ COMP
; 若A为0,转至COMP处
•
JNB ACC.7, POST ; 若A第7位不为1(X为正数),
;则程序转到 POST处,
;否则(X为负数)程序往下执行
JZ、JNZ、CJNE、DJNZ 等 还有以位状态作为条件进行程序分支的指令:
JC、JNC、JB、JNB和JBC (1等)单分支结构举例
• 例4.3.3 求符号函数的值。已知片内RAM的40H单元 内有一自变量X,编制程序按如下条件求函数Y的值, 并将其存入片内RAM的41H单元中。见P65
1 X>0
MOV @R1,P 1 ;将P1内容送40H单元
MOV P2 , P1 ;将P1内容送P2
执行结果:(R0)=30H , (R1)=40H , (A)=40H , (B) =10H ,(P1)=0CAH ,(40H)=0CAH ,
(P2)=0CAH
[例3-5] 已知外部RAM 2020H单元中有一个数X, 内部
•
SJMP $
•
END
• #1234H+#2345H = #3579H
答案
例4.3.1 将片内RAM 30H单元中的两位
压缩BCD码转换成二进制数送到片内
RAM 40H单元中.(P63)
开始
(A )高位 BCD 码
将高位 BCD 码乘 10
与低位 BCD 码相加
存结果
结束
• ORG 1000H
• START:MOV A, 30H ; 取两位BCD压缩码a1a0送A
• SWAP A
; 得到高位BCD码
• ADD A,#30H ; 转换为高位ASCII码
• MOV 22H,A
; 保存高位ASCII码
• SJMP $
• END
补充举例:三字节无符号数相加,其中被 加数在内部RAM的50H、51H和52H单元 中;加数在内部RAM的53H、54H和55H 单元中;要求把相加之和存放在50H、51H 和52H单元中进位存放在位寻址区的20H单 元最低位中(即20H.0)。
•
MOV A, #0FFH ; 将1(补码)送入A中
•
SJMP COMP
; 程序转到COMP处
• POST: MOV A, #01H
; 将+1送入A中
RAM 20H单元一个数Y,试编出可以使它们互相交换的程
序。
指向外部
解: MOV P2 , #20H MOV R1 , #20H
RAM 2020H单元
MOVX A , @R1 XCH A , @R1 MOVX @R1 ,A
指向内部
RAM 20H单元
SJMP $
END
[例3-7] 把01H单元内容送02H单元,有几种不同的实现方法。
• ORG 1000H
• START:MOV A,20H ; 取压缩BCD码
• ANL A,#0FH ; 取低位BCD码
• ADD A,#30H ; 转换为低位ASCII码
• MOV 21H,A
; 保存低位ASCII码
• MOV A,20H
; 重新取压缩BCD码
• ANL A,#0F0H ; 分离高位BCD码