四五章所有例题的程序.docx
《四五章所有例题的程序.docx》由会员分享,可在线阅读,更多相关《四五章所有例题的程序.docx(17页珍藏版)》请在冰点文库上搜索。
![四五章所有例题的程序.docx](https://file1.bingdoc.com/fileroot1/2023-7/9/07cebbea-ef81-4e62-8b18-552b8810ac5c/07cebbea-ef81-4e62-8b18-552b8810ac5c1.gif)
四五章所有例题的程序
第三四章所有例题程序
例3-1:
设内部RAM中30H的单元内容50H,试分析执行执行下面程序后各有关的单元内容
MOV60H,#30H;
MOVRO,#60H;
MOVA,@R0;
MOVR1,A,;
MOV40H,@R1;
MOV60H,30H;
例3-2:
将累加器A中的内容送入外部数据存储器的60H单元
MOVRO,#60H;
MOVX@R0,A;
例3-3:
进入中断服务程序后,(SP)=30H,(DPTR)=5544H
PUSHDPL;
PUSHDPH;
例3-4:
设(A)=0ABH,(R1)=12H,执行指令XCHA,R1;则结果为(A)=12H,(R1)=0ABH
SWAPA;
例3-5:
设(A)=0ABH,执行指令“SWAPA”后,(A)=0BAH
XCHDA,@Ri;
例3-6:
设(A)=12H,(R0)=30H,(30H)=45,执行指令“XCHDA,@R0”后则结果为(A)=15H,(30H)=42H
MOVXA,2DPTR;
MOVX@DPTR,A;
MOVX@Ri,A;
例3-7:
将外部存储数据器的2000H单元的内容传送到内部RAM的70H单元
MOVDPTR,#2000H;
MOVXA,@DPTR;
MOV70H,A;
例3-8:
执行下列指令
1232H:
MOVA,#30H
1234H:
MOVCA,@A+PC
1235:
MOV60H,A
……
1265H:
3FH
……
例3-9:
已知累加器A中有一个0~9范围内的数,试用以上查表指令编出能查找出该平方值得程序
MOVDPTR,#1000H;
MOVCA,@A+DPTR;
例3-11:
设有两个四位BCD码,分别存放在内部储存器的50H-51H单元和60H-61H单元中,试编写求这两数之和的程序,结果存放到40H-41H单元中
MOVA,50H;
ADDA,60H;
DAA;
MOV40H,A;
MOVA,51H;
ADDCA,61H;
DAA;
MOV41H,A;
例3-12:
设(A)=0BAH,(R1)=88H;执行指令
ADDA,R1
例3-13:
设(A)=0BAH,(R1)=88H;(CY)=1;执行指令
SUBBA,R1
例3-14:
试编写计算“123H+5678H”的程序
MOVA,#34H;
ADDA,#78H;
MOVR6,A;
MOVA,#12H;
ADDCA,#56H;
MOVR7,A;
例3-15:
设(A)=56H,(B)=78H,执行指令
MULAB
例3-16:
设(A)=50H,(B)=28H,执行指令
DIVAB
例3-17:
将累加器A中的BCD码分为两个字节,形成非压缩BCD码,放入40H和41H单元中
MOVR0,A;
ANLA,#00001111B:
MOV40H,A;
MOVA,R0;
ANLA,#11110000B;
SWAPA;
MOV41H,A;
例3-18:
将P1口高四位不变,把累加器A中的第四位由P1口的第四位输出
ANLA,#00001111B;
MOVR0,A;
MOVAP1;
ANLA,#11110000B;
ORLA,R0;
MOVP1,A;
例3-20:
要求当(A)=00H时,程序散转到KEY0;当(A)=01H时,散转到KEY1等
CLRC;
RLCA;
MOVDPTR,#TABLE
JMP@A+DPTR
……
TABLE:
JAMPKEY0
JAMPKEY1
JAMPKEY2
……
例3-22:
已知内部RAM的M1和M2的单元中各有一个无符号8位二进制数,试编程比较他们的大小,并把大数送到MAX单元
MOVA,M1;
CJNEA,M2,LOOP;
LOOP:
JNCLOOP1;
MOVA,M2;
LOOP1:
MOVMAX,A;
RET;
例3-23:
试编程把56H位中的内容和78H位中的内容相交换
MOVC,56H;
MOV00H,C;
MOVC,78H;
MOV56H,C;
MOVC,00H;
MOV78H,C;
例3-24
MOVC,P1.0;
ANLC,P1.1;
CPLC;
MOV00H,C;
MOVC,P1.2;
ANLC,P1.3;
ANLC,/P1.3;
ORLC,00H;
CPLC;
MOVP1.4,C;
例4-1:
将目标程序从2000H单元开始存放
ORG2000H
MOVA,20H
…
例4-2:
下列伪指令汇编后,存储器相应地址里的内容是什么
ORG8000H
SUJU:
DB09,12H,‘A’
ZIFU:
’ABC’
例4-3:
下面DW伪指令汇编后,9000H-9003H地址里的内容是多少
9000H:
DW5566H,88H
例4-4:
用伪指令实现从8000H单元开始,预留连续16个存储单元,然后从8010H单元开始,按DB命令给内存单元赋值,即(8010H)=11H,(8011H)=22H
ORG8000H
SEG:
DS16
DB11H,22H
例4-5:
将内部数据存储器50H单元中的一个8位二进制数拆开,分成两个4位数,高四位存入61H单元,低四位存入60H单元,60H,61H,单元的高四位清零
ORG8000H
CZCX:
MOVR0,#50H
MOVR1,#60H
MOVA,@R0
ANLA,#0FH
MOV@R1,A
INCR1
MOVA,@R0
ANLA,#0F0H
SWAPA
MOV@R1,A
SJMP$
例4-6:
将一个字节十六进制数转换成BCD码
ORG4000H
MOVA,56H
MOVB,#100
DIVAB
MOVR0,A
XCHA,B
MOVB,#10
DIVAB
MOVR1,A
MOVR2,B
SJJMP$
例4-7:
一位十六进制数转换为ASCII码,设十六进制数在AZ中(A的高四位为0),至转换结果仍存预A中
CJNEA,#10,NO10
NO10:
JCLT10
ADDA,#07H
LT10:
ADDA,#30H
SJMP$
例4.8
ORG8000H
FHHS:
MOVA,35H
CJNEA,#0,NEQ0
MOVA,#00H
SJMPOK
NEQ0:
CJNEA,#7FH,ISZF
SJMPGT0
ISZF:
JNCLT0
GT0:
MOVA,#01H
SJMPOK
LT0:
MOVA,#0FFH
OK:
MOV36H,A
SJMPS
例4.9:
假设累加器A中的内容为0-4,实现编程根据累加器A的内容实现不同的处理
START:
MOVR0,A
ADDA,R0
ADDA,R0
MOVDPTR,#TABLE
JMP@A+DPTR
TABLE:
LJMPFZ0
LJMPFZ1
LJMPFZ2
LJMPFZ3
LJMPFZ4
例4.10:
将内部数据RAM中的20H-3FH单元的内容传送到外部数据存储以2000H开始的连续单元中去
START:
MOVR0,#20H
MOVDPTR,#2000H
MOVR1,#32
LOOP:
MOVA,@R0
MOVX@DPTR,A
INCR0
INCDPTR
DJMPR1,LOOP
SJMP$
例4.11:
设计20ms延时程序
DL20MS:
MOVR4,#100
DELAY1:
MOVR3,#100
DELAY2:
DJNZR3,DELAY2
DJNZR4,DELAY1
RET
例4.12:
把单片机内RAM中地址40H-49H中的10个无符号数逐一比较,并按从小到大的顺序依次排列在这片单元中
START:
CLRF0
MOVR3,#9
MOVR0,#40H
MOVA,@R0
L2:
INCR0
MOVR2,A
SUBBA,@R0
MOVA,R2
JCL1
SETBF0
XCHA,@R0
DECR0
XCHA,@R0
INCR0
L1:
MOVA,R0
DJNZR3,L2
JBF0,START
RET
例4.13:
通过调用子程序实现延时100ms
DL1MS:
MOVR2,#250J
LOOP:
NOP
NOP
DJNZR2,LOOP
DJNZR3,DL1MS
RET
…
PUSHPSW
MOVPSW,#08H
MOVR3,#100
ACALLDL1MS
POPPSW
例4.14:
n字节求补子程序
QUBU:
MOVA,@R0
CPLA
ADDA,#01H
MOV@R0,A
NEXT:
INCR0
MOVA,@R0
CPLA
ADDCA,#0
MOV@R0,A
DJNZR7,NEXT
RET
例4.15:
将存于R0中的一位十六进制数(R0高四位为0)转换为七段显示吗,并将结果送至P1口显示。
设七段显示器为共阴极接法
HTLED:
PUSHACC
MOVA,R0
ADDA,#5
MOVCA,@A+PC
MOVP1,A
POPP1,A
RET
TABLE:
DB40H,79H,24H,30H
DB19H,12H,02H,78H
DB00H,18H,08H,03H
DB46H,21H,06H,0EH
例4.16:
程序存储器中有一个5行*8列的表格,要求把下标行变量为I,列变成J的元素读入到累加器中
IEQU3
JEQU4
TABIJ:
MOVA,#I
MOVB,#8
MULAB
ADDA,#J
MOVDPTR,#BASE
MOVCA,@A+DPTR
RET
……
……
BASE:
DB01,02,03,04,05,06,07,08
DB11,12,13,14,15,16,17,18
DB01,02,03,04,05,06,07,08
DB01,02,03,04,05,06,07,08
DB01,02,03,04,05,06,07,08
例4.17:
ASCII码转换为二进制数
ASCBIN:
MOVA,R0
CLRC
SUBBA,#30H
MOVR0,A
SUBBA,#10
JCAEND
MOVA,R0
SUBBA,#07H
MOVR0,A
AEND:
RET
例4.18:
16位数加1子程序
ADD1:
MOVA,R6
ADDA,#1
MOVR6,A
MOVA,R7
ADDCA,#0
MOVR7,A
RET
例4.19:
多字节无符号数的加法
ADDMB:
CLRC
LOOP:
MOVA,@R0
ADDCA,@R1
MOV@R0,A
DECR0
DECR1
DJNZR2,LOOP
JNCNOCP
MOV@R0,#01H
SJMPENDA
NOCY:
DECR0
ENDA:
RET
例4-20双字节无符号数乘法
MULB1N:
MOVA,R1;
MOVR6,A
MOVR7,#04H
CLEAR:
MOV@R1,#00H
INCR1
DJNZR7,CLEAR
MOVA,R6
MOVR1,A
MUL:
MOVA,R2
MOVB,R4
MULAB
ACALLADDM
MOVA,R2
MOVB,R5
MULAB
ACALLADDM
MOVA,R3
MOVA,R4
MULAB
DECR1
ACALLADDM
MOVA,R3
MOVB,R5
MULAB
ACALLADDM
MOVA,R6
MOVR1,A
RET
子程序如下:
ADDM:
ADDA@R1
MOV@R1,A
MOVA,B
INCR1
ADDCA,@R1
MOV@R1,A
INCR1
MOVA,@R1
ADDCA,#0
MOV@R1,A
例4-21:
片外RAM中从ADIN处开始存放16个字节数据信号,编程实现用算术平均值的方法进行滤波。
结果存放在累加器A中
AV16D:
MOVR7,#16H
MOVDPTR,#ADIN
MOVR5,#0
MOVR6,#0
LOOP:
MOVXA,@DPTR
ADDA,R5
MOVR5,A
MOVA,R6
ADDCA,#0
MOVR6,A
INCDPTR
DJNZR7,LOOP
MOVR7,#4
LOOP1:
CLC
MOVA,R6
RRCA
MOVR6,A
MOVA,R5
RRCA
MOVR5,A
DJNZR7,LOOP1
RET
例4-22:
在指定区域找出最大值
MOVA,#0
LOOP:
CJNEA,@R0,PDDX
PDDX:
JNCAISB
MOVA,@R0
AISB:
INCR0
DINJR7,LOOP
RET
例4-23求解下试给出的U-Z等六个布尔变量的逻辑函数:
Q=(V+W)+(X+Y拔)+Z拔
UBITP1.1
VBITP2.2
WBITTF0
XBITIE1
YBIT20H.0
ZBIT21H.1
QBITP3.3
MOVC,V
ORLC,W
ANLC,U
MOVF0,C
MOVC,X
ANLC,/Y
ORLC,F0
ORLC,/Z
MOVQ,C
例4-24:
左格式化子程序
NORM:
MOVA,@R0
MOVC,A.7
MOVF0,C
INCR0
MOVC,A6
MOVA.7,C
MOVR2,A
NORM1:
MOVA,@R0
INCR0
JNZNORM3
MOVA,@R0
JNZNORM4
DECR0
DECR0
MOVA,#40H
NORM2:
MOVC,F0
MOVA.7,C
MOV@R0,A
RET
NORM3:
JBA.7,NORM5
NORM4:
CLRC
MOVA,@R0
RLCA
MOV@R0,A
DECR0
MOVA,@R0
RLCA
MOV@R0,A
INCR0
DECR2
CJNER2,#0C0H,NORM3
NORM5:
DECR0
DECR0
MOVA,R2
SJMPNORM2