您现在正在浏览:首页 > 职教文章 > 职教论文 > 单片机实验程序MOV指令在使用时应注意以下几个问题

单片机实验程序MOV指令在使用时应注意以下几个问题

日期: 2010/10/23 浏览: 2 来源: 学海网收集整理 作者: 佚名

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?30H START:?MOV?R0,#20H ?MOV?R6,#08H ?MOV?A,@R0 ?DEC?R6 LOOP:?INC?R0 ?MOV?40H,@R0 ?CJNE?A,40H,CHK CHK:?JNC?LOOP1 ?MOV?41H,A HERE:?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?30H START:?MOV?R7,#4 ?MOV?R0,#30H ?MOV?DPTR,#0000H LP1:?MOVX?A,@DPTR ?MOV?@R0,A ?INC?R0 ?INC?DPTR ?DJNZ?R7,LP1 ?MOV?R1,#40H ?MOV?DPTR,#0010H ?MOV?R7,#4 LP2:?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?C LP3:?MOV?A,@R0 ?ADDC?A,@R1 ?DA?A ?MOVX?@DPTR,A ?INC?R0 ?INC?R1 ?INC?DPTR ?DJNZ?R6,LP3 ?MOV?20H,C HERE:?SJMP?HERE ? ?END

软件练习4:求16个学生的年龄之和,数据存放在20H单元

程序运行前,先将16个学生的年龄放在内部数据区20H单元开始的地方,码制为BCD码,程序运行结束时,16个学生的年龄和放在寄存器A和B中(B为高位,A为低位)。

程序清单如下:

?ORG?00H ?AJMP?START ?ORG?30H START:?MOV?R0,#20H ?MOV?R7,#16 ?MOV?A,#00H ?MOV?B,A LOOP:?ADD?A,@R0 ?DA?A ?JNC?NEXT ?INC?B NEXT:?INC?R0 ?DJNZ?R7,LOOP HERE:?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??00H START:?MOV??DPTR,#00H ?MOV??SP,#80H ?MOV??R0,#30H ?MOV??R7,#10H LOOP:?MOVX??A,@DPTR ?MOV??@R0,A ?INC??R0 ?INC??DPTR ?DJNZ??R7,LOOP HERE:?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

END 2、多重循环设计

设在片内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

返回顶部