单片机实验程序MOV指令在使用时应注意以下几个问题
MOV指令在使用时应注意以下几个问题
MOV指令在程序设计时使用最为频繁,且使用非常灵活。使用时应注意以下几个问题: 1、每条指令格式和功能制造厂家规定,用户只能按规定使用,不得任意制造指令。例如:MOV R7,@R3这条语句是非法的,首先用于间接寻址的寄存器只能是R0或RI,其次用@Ri间接寻址不能直接送Rn. 2、要清楚每种寻址方式的寻址范围。例如:MOV R0, #90H ?????????????????????????????????????? MOV??A, @R0 这段程序看似合理,但90H为P1的物理地址,而P1为特殊功能寄存器,只能直接寻址。又如:MOV 20H,0A1H直接寻址范围虽为00H——0FFH,其中00H——7FH是内部RAM的地址,而SFR中80H——0FFH地址,只有21个地址有效,如表2—4所示。
0A1H单元无定义,因此对0A1H的访问无意义。 3、以累加器A为目的寄存器的传送指令会影响PSW中的奇偶标志位,其余传送指令对所有标志位均无影响。 4、外部数据存储器(或I/O)的读写指令(MOVX) (1)用@DPTR进行间接寻址的指令 ???????? 如??MOVX A,@DPTR???? ???????????? MOVX,@DPTR, A DPTR为16位数据指针,该指令可寻址外部RAM 64KB范围(0000H—0FFFFH)。地址低8位由P0口输出,地址高8位由P2口输出,数据通过P0口读入或写出。 (2)用@Ri进行间接寻址的指令 ????????MOVX A, @Ri ????????MOVX @Ri,A 这类指令可寻址范围是: (1)若外部扩展RAM小于等于256个单元,用@Ri间接寻址进行数据传送,8位地址线足够使用。 (2)若外部扩展较大的RAM区域,须用P2口输出高8位地址,用@Ri表示低8位地址,P0口分时作低8位地址线和数据线,P2口应事先预置。若设计循环程序,Ri被加到0或被减到0时,必须考虑对P2口高8位地址进位或借位的关系。 例如:若外部RAM中,(20FFH)=30H,(2100H)=15H,则执行 ?????? MOV DPTR,#20FFH ?????? INC DPTR ?????? MOVX A,@DPTR 结果是外部RAM2100H单元内容送A,(A)=15H,若 ?????? MOV P2, #20H ?????? MOV R0, #0FFH ?????? INC R0 ?????? MOVX A, @R0 结果是外部RAM2000H单元内容送A,而不是2100H单元内容送A。 注意:外部RAM之间不能直接传送数据,必须通过累加器A传送。
软件练习一:单片机清零程序:
实验目的:熟悉汇编语言的指令系统,掌握汇编语言设计和调试的方法。
实验内容:
① 将30H—3FH 单元的内容清零。② 将2000H—20FFH 单元的内容清零。
程序框图:
程序清单:
清单一:
ORG 00H
AJMP MAIN
ORG 30H
MAIN: MOV SP,#5FH
MOV R0,#30H
MOV R1,#00H
LOOP:
CLR A
MOV @R0,A
INC R0
INC R1
CJNE R1,#0FH,LOOP
MOV R0,#30H
MOV R1,#00H
SJMP $
END
清单二:
ORG 00H
AJMP MAIN
ORG 30H
MAIN: MOV SP,#5FH
MOV R1,#00H
MOV DPTR,#2000H
LOOP: CLR A
MOVX @DPTR,A
INC DPTR
INC R1
CJNE R1,#0FFH,LOOP
MOV DPTR,#2000H
MOV R1,#00H
SJMP $
END
思考假设把30H—3FH 中的内容改成55H,如何修改程序?
软件练习2:求最大数
给定8个无符号数,将其放入同倍数据区(DATA)中,地址从20H开始,运行下列程序,看看是否将8个数的最大值存储在A寄存器和内部数据区41H单元中。
程序清单如下:
?ORG?00H?SJMP?START?ORG?30HSTART:?MOV?R0,#20H?MOV?R6,#08H?MOV?A,@R0?DEC?R6LOOP:?INC?R0?MOV?40H,@R0?CJNE?A,40H,CHKCHK:?JNC?LOOP1?MOV?41H,AHERE:?SJMP?HERE??END
软件练习3:求两省人数之和
以四个字节长度存放两省人口数,访程序涉及到多字节的加减法。程序运行前将两省的人口数放入外部数据区(XDATA),从00H和10H开始单元,如从00H开始依次放入32H,54H,76H,98H,从10H开始依次放入34H,12H,32H,54H(从低字节往高字节排列),程序运行完毕,观察程序运行结果是不是等于98765432+54321234=0153086666。
程序清单如下:
?ORG?00H?SJMP?START?ORG?30HSTART:?MOV?R7,#4?MOV?R0,#30H?MOV?DPTR,#0000HLP1:?MOVX?A,@DPTR?MOV?@R0,A?INC?R0?INC?DPTR?DJNZ?R7,LP1?MOV?R1,#40H?MOV?DPTR,#0010H?MOV?R7,#4LP2:?MOVX?A,@DPTR?MOV?@R1,A?INC?R1?INC?DPTR?DJNZ?R7,LP2?MOV?R6,#4?MOV?DPTR,#0020H?MOV?R0,#30H?MOV?R1,#40H?CLR?CLP3:?MOV?A,@R0?ADDC?A,@R1?DA?A?MOVX?@DPTR,A?INC?R0?INC?R1?INC?DPTR?DJNZ?R6,LP3?MOV?20H,CHERE:?SJMP?HERE??END
软件练习4:求16个学生的年龄之和,数据存放在20H单元
程序运行前,先将16个学生的年龄放在内部数据区20H单元开始的地方,码制为BCD码,程序运行结束时,16个学生的年龄和放在寄存器A和B中(B为高位,A为低位)。
程序清单如下:
?ORG?00H?AJMP?START?ORG?30HSTART:?MOV?R0,#20H?MOV?R7,#16?MOV?A,#00H?MOV?B,ALOOP:?ADD?A,@R0?DA?A?JNC?NEXT?INC?BNEXT:?INC?R0?DJNZ?R7,LOOPHERE:?SJMP?HERE??END
软件练习5:从外部数据存储器传送到内部RAM中
本实验在程序编译之前,将外部数据存储器(XDATA)和内部数据存储器(DATA)窗口打开,并在XDATA窗口从00H单元开始连续键入30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,40H,41H,42H,43H,44H,45H,然后程序单步运行或全速运行,停下来后观察内部数据区窗口(DATA)从30H开始的数据是否跟上述相同。
实验源程序如下:
?ORG??00HSTART:?MOV??DPTR,#00H?MOV??SP,#80H?MOV??R0,#30H?MOV??R7,#10HLOOP:?MOVX??A,@DPTR?MOV??@R0,A?INC??R0?INC??DPTR?DJNZ??R7,LOOPHERE:?SJMP??$??END
软件实验6:查表程序设计
实验目的 1、了解掌握查表程序结构设计方法 。2、熟悉理解查表指令:MOVC A,@A+DPTR???????????????????? ?MOVC A,@A+PC
实验内容及步骤:
MCS-51指令系统中有专用的查表指令:MOVC A,A+DPTR和MOV A,A+PC
MOVC A,A+DPTR指令,DPTR作为基址寄存器时,其值为16位而且可根据需要设计,故可用于在64KROM范围内查表。编写查表程序时,首先把表的首址送入DPTR中,再将要查找的数据序号(或下表值)送入A中,然后就可以使用该指令进行查表操作,并将结果送累加器A中。
MOVC A,A+PC指令,PC作为基址寄存器时,其值由指令的位置确定,它只能设在查表指令操作码下的256个字节范围内。编写查表程序时,首先把查表数据的序号送入A中,再把从查表指令到表的首地址间的偏移量与A值相加,然后使用该指令进行查表操作,并把结果送累加器A中。
在片内RAM的30H起始的单元中存放2位十六进制数,将其转换为ASCⅡ码,并将其存入40H为首的片内RAM中。用查表法编写程序。
分析:由于十六进制数是从0~F,对应的ASCⅡ码为30H~46H,每一个单元存放的16进制数,转换为ASCⅡ码后分别存入2个单元,低位存低地址,高位存高地址。用ANL A ,#0FH 分别取高4位和低4位。 进行查表转换成相应的ASCⅡ码。
程序如下:
ORG 0000H
LJMP SUBRTE
ORG 1000H
?SUBRTE:MOV R0 ,#30H ;置地址指针R0初值
MOV R1 ,#40H ;置地址指针R1初值
MOV R2 ,#4 ;置字节数
?LOOP: MOV A ,@R0 ;取16进制数
ANL A,#0FH ;屏蔽高4位
ADD A,#16 ;
MOVC A, @A+PC ;查表低4位转换为ASCⅡ码
MOV @R1,A ;送结果
INC R1 ;修改指针
MOV A,@R0 ;从新取16进制数
SWAP A ;高4位与低4位互换
ANL A,#0FH ;取高4位
ADD A,#7
MOVC A,@A+PC ;查表高4位转换为ASCⅡ码
MOV @R1,A
INC R0
INC R1
DJNZ R2,LOOP
DEC R1
RET
TABLE:DB’012345678’
DB’9ABCDEF’
END
软件实验7:数据区排序实验
实验目的:熟悉51 单片机指令系统,掌握数的大小的排序方法,掌握程序设计方法。
实验内容:编写并调试一个排序子程序,其功能为用冒泡法将内容RAM 中N 个单元字节无符号的正整数,按从小到大的次序重新排列。
程序框图:
实验步骤:把89C52 中RAM 50H—5AH 中放入不等的10 个数据,运行本实验程序后,检查50H—5AH中内容是否按从小到大的排列。
程序清单:
ORG 00H
AJMP MAIN
ORG 30H
MAIN: MOV SP,#6FH
QE: MOV R3,#50H
QE1: MOV A,R3
MOV R0,A
MOV R7,#0AH
CLR 00H
MOV A,@R0
L2: INC R0
MOV R2,A
CLR A
MOV 22H,@R0
CJNE A,22H,L3
SETB C
L3: MOV A,R2
JC L1
SETB 00H
XCH A,@R0
DEC R0
XCH A,@R0
INC R0
L1: MOV A,@R0
DJNZ R7,L2
JB 00H,QE1
SJMP $
END
思考:修改程序,改变50H—5AH 中的内容,然后从小到大排列。
软件实验8:分支结构程序设计
实验目的: 1、理解掌握分支结构程序设计思想和方法。2、熟悉和掌握不同的转移指令。3、理解掌握分支结构程序流程图的画法。
实验设备本站的成功一号,新动力2005,精简型2004,ISP套件都可直接实验。
实验内容及步骤: 1、单分支结构程序: ?
???????????????? 设其中X的值存于20H单元,Y值存于21H单元,编程解此函数。分析:对8位单片机来说,其取值范围是-128—+127,因此,最大的正数为7FH。
程序如下:
ORG 0000H
LJMP START
ORG 1000H
START:?? MOV A ,20H ;取数
?CJNE A ,#00H,NOEQ ;≠0转移
?MOV A ,#00H ;A=0
?SJMP DONE
NOEQ: CJNE A ,#07FH ,GT1 ;≠7FH转移
?SJMP GT0
GT1: JC GT0 ;为正则转
?MOV? A ,#0FFH ;负数-1
?SJMP DONE
GT0: MOV? A ,#01H?
DONE: MOV 21H ,A ;存结果
LOOP:??? SJMP LOOP
????????? END
2、多分支结构程序:
有两个16位无符号数NA、NB分别存放在内部RAM的40H,41H及50H,51H单元, 当NA>NB时,将内部RAM的42H单元清0,否则,将该单元置全1,试编制实现此功能的程序。
分析:MCS-51指令系统没有16位比较指令,只能使用8位比较指令,于是应先比较两数的高8位,若NA的高8位大于NB的高8位,则说明NA>NB;将内部RAM的42H单元清0。若NA高8位小于NB的高8位,则说明NA<NB;将42H单元置1。若NA的高8位等于NB的高8位,则再比较两者的低8位,方法同上(当NA=NB时,也将42H单元置1)。
程序如下:
ORG 0000H
LJMP START
ORG 1000H
START:MOV A ,50H ;取NB高8位
?CJNE A ,40H ,LOOP1 ;判NA高8位=NB高8位,若不等则LOOP1
?MOV A ,51H ;若相等,取NB低8位
?CJNE A ,41H ,LOOP1 ;判NA低8位=NB低8位,若不等则LOOP1
??????? SJMP LOOP2 ;若NA=NB,则转LOOP2 ??????????????????????
?LOOP1:JC LOOP3 ;若NA>NB,则转LOOP3
???LOOP2:MOV 42H ,#0FFH ;NA≤NB ,置全1
?????????????????? ?SJMP LOOP
?? L00P3:MOV 42H ,#00H ;NA>NB,则置0
???LOOP:?SJMP LOOP
END
软件实验9:顺序结构程序设计
实验目的1、熟悉掌握顺序程序设计方法。 2、熟悉掌握MCS-51系统指令。
实验设备 本站的成功一号,新动力2005,精简型2004,ISP套件都可直接实验。
实验内容及步骤 汇编程序练习。
实验程序一:
在内部单元存有1字节代码,要将其拆分成两个4位数,高4位存入原单元的低4位,其低4位存入21单元的低4位,且要这两单元的高4位均为0。
分析:可用ANL指令来实现,通过ANL A, #0F0H 截取高4位,在通过 ANL A ,#0FH 取低4位。
具体程序如下:
ORG 0000H
LJMP START
ORG 1000H
START: MOV R0, #20H ; 设置地址指针
MOV A, @ R0 ; 取数
MOV B, A ; 暂存
ANL A, #0F0H ; 截取高4位
SWAP A ; 高4位为0,低4位为20H单元中的高4位
MOV @R0, A ; 送结果至20H单元
ANL B, #0FH ; 截取低4位
MOV A, B ; 高4位为0,低4位为20H中的低4位
INC R0 ; 修改地址指针
MOV @R0, A ; 送结果至21H单元
LOOP: SJMP LOOP ; 等待
?????????? ?END 实验程序二:
在内部RAM的40H单元中存放一个8位二进制数,要求将其转换成相应的BCD码,并由高位到低位的顺序存入内部RAM 以60H为首址的三个连续单元中。
分析:由于51系列指令系统中有除法指令,先将此数除以100,其商为百位数,再将余数除以10,其商为十位数,最后的余数为个位数。具体程序如下:
?? ORG 0000H
LJMP START
ORG 1000H
??????? START:MOV R0 ,#60H ;设置存数指针R0初值
MOV A , 40H ;取被转换的二进制数
MOV B , #100 ;置除数为100
DIV AB ;除以100,求百位数
MOV @R0 , A ;将百位数送指定单元
INC R0 ;修改指针
MOV A ,#10 ;置除数为10
XCH A , B
?????? DIV AB ;求十位数
MOV @R0 , A ;将十位数送指定单元
INC R0 ;修改指针
XCH A , B ;A中为个位数
MOV @R0 , A ;将个位数送指定单元
LOOP: SJMP LOOP
END
软件实验10:子程序结构设计与调用
实验目的1、了解掌握子程序结构设计方法 。2、熟悉理解子程序传递参数的方法及调用程序的设计 。
实验设备: 本站的成功一号,新动力2005,精简型2004,ISP套件都可直接实验。
实验内容及步骤:多字节BCD码减法子程序SUBMSB
分析:在二进制数中,当采用补码后可以将减法转换成加法。同样,BCD码中采用补数后也可以将减法转换成加法,减数对10取补,只要将100减去此数即可。因为9AH经十进制调整后为100,相当100减去此数。
子程序名称:SUBMSB
入口参数:被减数及减数的末地址分别存放在R0、R1中,字节长度存放在R2中
出口参数:差存放在被减数单元
使用的寄存器:A,R0,R1,R2
子程序如下:
?SUBMSB:CLR C ;减数对10取补
?LOOP:MOV A, #9AH
SUBB A, @R1
ADD A, @R0 ;两数相加
DA A ;十进制调整
MOV @R0,A ;送结果
DEC R0 ;修改被减数地址指针
DEC R1 ;修改减数地址指针
CPL C ;转换成借位
DJNZ R2,LOOP ;判多字节减法完成否,若未完则继续
RET
END
主程序:设三字节BCD码的被减数及减数由高位到低位存放在片内RAM中,它们的首地址分别为10H及20H,要求将其差存放到被减数单元,编写相应的程序。
ORG 0000H
LJMP MAISUB
ORG 1000H
MAISUB:MOV R0, #12H
??????????????????MOV R1 ,#22H
??????????????????MOV R2,#03H
????????????????? ?ACALL SUBMSB
????????????????? SJMP $
??????? END
软件实验11 循环结构程序设计与排序
实验目的:1、熟悉掌握循环结构程序设计方法。 2、进一步熟悉掌握转移指令。 3、理解掌握循环结构程序流程图的画法。
实验设备: 本站的成功一号,新动力2005,精简型2004,ISP套件都可直接实验。
实验内容及步骤:1、单循环结构程序设计(1)循环次数已知的循环程序设计在片内RAM的10H单元存放一个8位二进制数,要求将其每一位转换成相应的ASCⅡ码,并以高位在前,低位在后的顺序依次存放到片内RAM以11H单元为首的连续单元中,编制相应的程序。 ???? 分析:首先应解决二进制转换成相应ASCⅡ码的问题,已知二进制数0、1相应的ACSⅡ码为30H、31H。所以先将中间单元置成30H,然后判别欲转换的位是否为1,若为1,则将中间单元内容加1,否则中间结果单元内容保持不变,接着应解决如何按由高到低的顺序进行转换,这可通过左移指令实现。
ORG 0000H
??? ?????LJMP BINASC
?? ??????ORG 1000H
?BINASC:MOV R2 ,#08H ;置循环计数器R2初值
MOV R0 ,#10H ;置地址指针R0初值
MOV A , @R0 ;取被转换的8位二进制数
MOV B , A ;暂存
?ASLOOP:MOV A ,#30H ;置A为30H
?????? JNB B.7 ,NADDA ;判被转换的二进制数为0否,若是则转NADDA
?????? INC A ;若为1,则响应ASCⅡ码加1
NADDA:INC R0 ??????? ;修改地址指针R0
?????? MOV @R0 ,A ;送相应的ASCⅡ码
???????? MOV A ,B ;暂存
???????? RL A ;将被转换的二进制数左循环移1位
???????? MOV B , A ;暂存
???????? DJNZ R2 ,ASLOOP ;判8位二进制数位转换完否
? LOOP: SJMP LOOP
?????? END (2)循环次数未知的循环程序设计
在内部RAM以20H单元为首址的连续10个单元中,存放10个无序的8位无符号数,要求将第一个大于10H的数存入32H单元中,运行次数存入33H单元中,编制相应的程序。
ORG 0000H
LJMP CMPSP
ORG 1000H
CMPSP: MOV R0 , #20H ;设置地址指针R0
MOV R2 ,#01H ;置计数器R2初值
MOV B ,#0AH ;置循环计数器B初值
LOOP2: MOV A ,@R0 ;取第一个数
SUBB A ,#10H ;两数相减,以判两者大小
JNB ACC.7 ,LOOP1 ;若A为大,则转LOOP1
INC R0 ;若A≤10H,则取下一个数
INC R2 ;计数器加1
DJNZ B ,LOOP2 ;环计数器B减1,B≠0则继续
LOOP1: MOV 33H ,@R0 ;送大于10H的数
MOV 34H ,R2 ;送运行次数
LOOP: SJMP LOOP
END2、多重循环设计
设在片内RAM中,存放了一组无符号数,其长度为20,起始地址为30H,要求将他们按从大到小的顺序排列,排序后仍存放在起始地址为30H的区域中,编写相应的程序。
分析:本例是一个排序程序设计,方法有多种,以常用的“冒泡”程序设计思路为例,其方法是:从低地址到高地址将两两相邻单元内容进行比较。若低地址单元的内容大于相邻高地址单元的内容,则保持原状;若低地址单元的内容小于相邻高地址单元的内容,则两相邻单元中的内容互换。经一次循环后,在最高地址单元中存放的是最小数。然后按上述方法进行第二次循环,本次循环结束时,在次最高地址单元中存放的是次最小数。经过19次循环在起始地址为30H的原数据区中得到了从大到小排列数组。在每次循环中大数不断地向低地址单元移动,好象气泡不断地向上冒,所以称为“冒泡”程序。为了提高排序的速度,可在程序中设置一个交换标志位。初始化时将其清零,如在一次循环中有两相邻单元的内容互换,则标志位置1。在每次循环结束时测试此标志位,决定是否再次循环,若为1,则继续排序;为0,则完成排序。
程序如下:
ORG 0000H
LJMP 1000H
ORG 1000H
LOOP4: MOV R0,#30H ;置地址指针R0初值
MOV B, #14H ;置长度计数器B初值
CLR 10H ;交换标志位(10H单元)清0
DEC B ;长度计数器B减1
LOOP3: MOV A,@R0 ;取数
MOV 20H A ;暂存
INC R0 ;修改指针
MOV 21H,@R0 ;取数
CJNE A,21H,LOOP1 ;两数比较,若(20H)≠(21H),则转LOOP1
LOOP1: JNC LOOP2 ;若(20H)≥(21H),则转LOOP2
MOV A,@R0 ;若(20H)<(21H),则两者交换
MOV @R0, 20H
DEC R0
MOV @R0,A
INC R0 ;恢复R0原值
SETB 10H ;置交换标志为1
LOOP2: DJNZ B,LOOP3 ;判长度计数器B为0?,若不为0,则继续
JB 10H,LOOP4 ;判标志为1?,若为1,则继续
SJMP $
END
软件实验12:拆字程序
实验目的:熟悉汇编语言的指令系统,掌握汇编语言设计和调试方法。
实验内容:把30H 的内容拆开,高位送31H 的低位,低位送32H 的低位,31H、32H 高位清零。
程序框图
程序清单:
ORG 00H
AJMP MAIN
ORG 30H
MAIN: MOV SP,#5FH
MOV 30H,#55H
MOV A,30H
SWAP A
ANL A,#0FH
MOV 31H,A
MOV A,30H
ANL A,#0FH
MOV 32H,A
SJMP $
END
思考:如何用断点方式来调试程序,如何拆字?
软件实验13:拼字程序
实验目的:1. 进一步掌握汇编语言设计。2. 学习使用断点方式调试程序的方法。3.学习修改单片机存储器的方法。
实验内容:把30H、31H 两个字节的低位分别送入32H 的高位和低位,本程序一般用于把显示缓冲区数据拼装成一个字节。
程序框图:
程序清单:
ORG 00H
AJMP MAIN
ORG 30H
MAIN: MOV SP,#5FH
MOV A,30H
ANL A,#0FH
SWAP A
MOV B,A
MOV A,31H
ANL A,#0FH
ORL A,B
MOV 32H,A
SJMP $
END
思考:修改30H、31H 的内容重复上述实验。
软件实验13:查找相同的数的个数
实验目的:熟悉汇编语言的编程。
实验内容:在2000H—200FH 中查出有几个字节是零,把个数放在40H 单元中。
程序框图:
实验步骤:1、编写程序,编译,并调试。2、在2000H—200FH 的几个单元中填入零,运行本程序后检查2100H 中有几个单元数。
程序清单:
ORG 00H
AJMP MAIN
MAIN: MOV SP,#5FH
L1: MOV R0,#10H
MOV R1,#00H
MOV DPTR,#3000H
L2: MOVX A,@DPTR
CJNE A,#00H,L3
INC R1
L3: INC DPTR
DJNZ R0,L2
MOV 40H,R1
L4: SJMP L4
END
思考:修改本程序,查找其他内容。
软件实验13:数据区传送实验
实验目的:熟悉51 单片机的指令系统,掌握程序设计方法。
实验内容:把R2,R3 源RAM 区首地址内的R6,R7 直接数传送到R4,R5 的目的RAM 区。
程序框图:
实验步骤:
在R2,R3 中输入源首址(例如0000H),R4,R5 中输入目的地址(2000H),R6,
R7 中输入字节数(例如1FFFH),运行程序,检查0000H—1FFFH 中内容是否和2000H—3FFFH中内容完全一致。
程序清单:
ORG 00H
AJMP MAIN
MAIN: MOV SP,#5FH
S1: MOV DPL,R3
MOV DPH,R2
MOVX A,@DPTR
MOV DPL,R5
MOV DPH,R4
MOVX @DPTR,A
CJNE R3,#0FFH,L1
INC R2
L1: INC R3
CJNE R5,#0FFH,L2
INC R4
L2: INC R5
CJNE R7,#00H,L3
CJNE R6,#00H,L4
SJMP $
NOP
L3: DEC R7
SJMP S1
L4: DEC R7
DEC R6
SJMP S1
END
思考:修改R2,R3,R4,R5,R6,R7 中内容,检查是否一致。
软件实验14: BCD?码数据转换成二进制数据
实验目的:熟悉51 单片机指令系统,掌握程序设计方法。
实验内容:将R2 中的内容转换成二进制数据,并传送到20H 单元中。
实验程序框图:
实验步骤:将R2 送#99H 后,执行程序得到结果是否与你预计一致。
程序清单:
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN: MOV SP,#5FH
MOV R2,#99H
MOV A,R2
SWAP A
ANL A,#0FH
MOV B,#0AH
MUL AB
MOV R3,A
MOV A,R2
ANL A,#0FH
ADD R3,A
MOV 20H,A
SJMP $
END
思考:修改程序,将R2 中内容换成其他数据。
软件实验15:将十六进制数据转换成十进制数据
实验目的:熟悉51 单片机指令系统,掌握程序设计方法。
实验内容:将R2 中的内容转换成十进制数据,然后将转换的数据百位、十位和个位分别存入R0指出的30H、31H 单元中。
实验程序框图:
程序清单:
ORG 00H
AJMP MAIN
ORG 30H
MAIN: MOV SP,#5FH
MOV R0,#30H
MOV A,R2
MOV B,#100
DIV AB
MOV @R0,A
INC R0
MOV A,#10
XCH A,B
DIV AB
SWAP A
ADD A,B
MOV @R0,A
SJMP $
END
功能:双字节十六进制整数转换成三字节BCD码整数 入口条件:待转换的双字节十六进制整数在R6、R7中。 出口信息:转换后的三字节BCD码整数在R3、R4、R5中。 影响资源:PSW、A、R2~R7 堆栈需求: 2字节 HB2: CLR A ;BCD码初始化 MOV R3,A MOV R4,A MOV R5,A MOV R2,#10H ;转换双字节十六进制整数 HB3: MOV A,R7 ;从高端移出待转换数的一位到CY中 RLC A MOV R7,A MOV A,R6 RLC A MOV R6,A MOV A,R5 ;BCD码带进位自身相加,相当于乘2 ADDC A,R5 DA A ;十进制调整 MOV R5,A MOV A,R4 ADDC A,R4 DA A MOV R4,A MOV A,R3 ADDC A,R3 MOV R3,A ;双字节十六进制数的万位数不超过6,不用调整 DJNZ R2,HB3 ;处理完16bit RET
单片机实验程序MOV指令在使用时应注意以下几个问题.doc