单片机原理与接口技术 赵嘉蔚 清华大学出版社.docx
《单片机原理与接口技术 赵嘉蔚 清华大学出版社.docx》由会员分享,可在线阅读,更多相关《单片机原理与接口技术 赵嘉蔚 清华大学出版社.docx(14页珍藏版)》请在冰豆网上搜索。
单片机原理与接口技术赵嘉蔚清华大学出版社
单片机原理与接口技术
第三章习题与思考题
3-5指出下列指令中45H代表什么。
MOVA,#45H
MOVA,45H
MOV45H,46H
MOVC,45H
答案:
MOVA,#45H中的45H代表立即数45H,该立即数为16进制。
MOVA,45H中的45H代表直接地址45H单元。
MOV45H,46H中的45H代表目的操作数所指定的单元为45H。
MOVC,45H中的45H代表45H位。
3-6分析下列程序执行的结果。
(1)MOVA,#60H
MOVR0,#40H
MOV@R0,A
MOV41H,R0
XCHA,R0
执行结果为:
(A)=40H(R0)=60H(40H)=60H(41H)=40H
(2)MOVDPTR,#2003H
MOVA,#18H
MOV20H,#38H
MOVR0,#20H
XCHA,@R0
执行结果为:
(DPH)=20H(DPL)=03H(A)=38H(20H)=18H
(R0)=20H
(3)MOV20H,#01H
MOVA,20H
INCA
CPLA
MOVDPTR,#2000H
MOVX@DPTR,A
执行结果为:
(20H)=01H(A)=FDH(DPTR)=2000H
(2000H)=FDH
3-8按要求写出相应的指令。
(1)把寄存器R6的内容送到累加器A中。
(2)把外部RAM1000H单元的内容传送到内部RAM30H单元中。
(3)清除内部RAM3FH单元的高4位。
(4)使累加器A的最低位置1。
(5)清除进位位。
(6)使ACC.4和ACC.5置1。
(7)把外部ROM2000H单元中的内容送到内部RAM的20H单元中。
(8)把外部ROM2000H单元中的内容送到外部RAM的3000H单元中。
答案:
(1)MOVA,R6
(2)MOVDPTR,#1000H
MOVXA,@DPTR
MOVR0,#30H
MOV@R0,A
(3)ANL3FH,#0FH
(4)ORLA,#01H
(5)CLRC
(6)ORLA,#30H
(7)CLRA
MOVDPTR,#2000H
MOVCA,@A+DPTR
MOV20H,A
(8)CLRA
MOVDPTR,#2000H
MOVCA,@A+DPTR
MOVDPTR,#3000H
MOVX@DPTR,A
3-10编写程序段完成如下要求。
(1)将寄存器R0中的内容乘以10(积小于256)。
(2)将片内RAM30H单元开始的15个字节的数据传送到片外RAM3000H开始的单元中。
(3)将片外RAM2000H开始的5个字节的数据传送到片内RAM20H开始的单元中。
(4)有10个字节的二进制数存放在片内RAM以40H开始的单元内,编程找出其中的最大值并存于内部50H单元中。
(5)将片外RAM空间2000H~200AH中的数据的高4位变零,低4位不变,原址存放。
(6)将外部RAM2040H单元的内容与3040H单元的内容互换。
答案:
(1)MOVB,#0AH
MOVA,R0
MULAB
MOVR0,A
(2)ORG0000H
MOVR0,#30H
MOVDPTR,#3000H
MOVR7,#0FH
LOOP:
MOVA,@R0
MOVX@DPRT,A
INCR0
INCDPTR
DJNZR7,LOOP
SJMP$
END
(3)MOVDPTR,#2000H
MOVR0,#20H
MOVR7,#05H
LOOP:
MOVXA,@DPTR
MOV@R0,A
INCR0
INCDPTR
DJNZR7,LOOP
SJMP$
END
(4)ORG0000H
MOV50H,40H;50H放最大值,且初始化最大值(默认第一个数)
MOVR3,#09H;比较次数
MOVR0,#41H
START:
MOVA,@R0
CJNEA,50H,LOOP
LOOP:
JCLOOP1;如果A比50H的值小,则跳转到LOOP1
MOV50H,@R0;如果比50H的值大,则更新50H(最大值)的值
LOOP1:
INCR0
DJNZR3,START
SJMP$
END
(5)MOVDPTR,#2000H
MOVR1,#0BH
LOOP:
MOVXA,@DPTR
ANLA,#0FH
MOVX@DPTR,A
INCDPTR
DJNZR1,LOOP
SJMP$
(6)MOVDPTR,#2040H
MOVXA,@DPTR
MOVR0,#20H
MOV@R0,A
MOVDPTR,#3040H
MOVXA,@DPTR
XCHA,@R0
MOVX@DPTRA
MOVA,@R0
MOVDPTR,#2040H
MOVX@DPTR,A
3-14被乘数是16位无符号数,低8位在M1单元,高8位在M1+1单元;乘数为8位无符号数,在M2单元。
试编写将两数相乘并将积存入R2、R3和R4中的程序(R2内为高8位、R4内为低8位)。
M1DATA20H
M2DATA30H
ORG0000H
MOVA,M1
MOVB,M2
MULAB
MOVR4,A
MOVR3,B
MOVA,M1+1
MOVB,M2
MULAB
ADDA,R3
MOVR3,A
MOVA,B
ADDCA,#00H
MOVR2,A
SJMP$
END
3-15设有一带符号的十六位数以补码形式存放在R2、R3寄存器中,试编制求其原码的程序。
ORG0000H
START:
MOVA,R3
JBACC.7,NEXT;判读符号位,如果是正数则原码与补码一样,如果为负,求原码的方法是符号位不变,其余位取反加1
MOVR3,A
HERE:
SJMP$
NEXT:
XRLA,#7FH;高八位,符号位不变,其余取反
MOVR3,A;放回R3
MOVA,R2;低八位
XRLA,#0FFH;取反
ADDA,#01H;加1
MOVR2,A;放回R2
MOVA,R3;看低八位是否有向高八位进位
ADDCA,#00H
MOVR3,A
SJMP$
END
3-16设有一不带符号的十六进制数组,存放在8031单片机片内RAM以BUFFER为首址的连续单元中,其长度为30个字节,要求统计小于10,等于10及大于10的数的个数,并把它们分别存放到片内RAM的LESS、EQUAL、BIG单元中,试编制实现上述要求的程序并画出相应的流程图。
ORG0000H
BUFFERDATA10H
LESSDATA30H
EQUALDATA31H
BIGDATA32H
MOVR0,#BUFFER
MOVR7,#1EH
MOVLESS,#00H
MOVEQUAL,#00H
MOVBIG,#00H
NEXT:
CJNE@R0,#0AH,LOOP1;循环次数
INCEQUAL
AJMPLOOP3
LOOP1:
JCLOOP2
INCBIG
AJMPLOOP3
LOOP2:
INCLESS
LOOP3:
INCR0
DJNZR7,NEXT
SJMP$
END
3-17在外部RAM1000H单元开始的存储区域存放着10个用ASCII码表示的0~9之间的数字,请编程将它们转换成BCD码,然后存放在2000H~2004H单元(以压缩BCD码存放)。
ORG0000H
MOVR2,#05H
MOVDPTR,#1000H
MOVR0,#20H
LOOP:
MOVXA,@DPTR
ANLA,#0FH
MOVR4,A
INCDPTR
MOVXA,@DPTR
ANLA,#0FH
SWAPA
ADDA,R4
MOV@R0,A
INCR0
INCDPTR
DJNZR2,LOOP
MOVR5,#05H
MOVR0,#20H
MOVDPTR,#2000H
LOOP1:
MOVA,@R0
MOVX@DPTR,A
INCR0
INCDPTR
DJNZR5,LOOP1
SJMP$
END
3-18设有50个无符号8位二进制数,存放在8031单片机内部RAM以BOFER为首址的连续单元中,试编制将其中最小数存放到内部RAM的MIN单元的程序并画出相应的流程图。
BOFERDATA20H
MINDATA60H
ORG0000H
MOVR2,#31H;循环49次
MOVR1,#BOFER+1
MOVMIN,BOFER;把最小值放MIN,且初始化时把第一个数放入MIN
LOOP:
MOVA,@R1
CJNEA,MIN,LOOP1
LOOP1:
JNCLOOP2;@R1>MIN
MOVMIN,@R1;MIN>@R1,MIN要更新
LOOP2:
INCR1
DJNZR2,LOOP
SJMP$
END
3-19设有一字符串存放在8031单片机内部RAM以20H为首址的连续单元中,字符串以回车结束。
要求统计该字符串中字符B(‘B’=42H)的个数,并将其存入外部RAM的40H单元中。
试编写实现上述要求的程序并画出相应的流程图。
ORG0000H
MOVR0,#20H
MOVR1,#00H;‘B’的个数初始化
LOOP:
MOVA,@R0
CJNEA,#0DH,LOOP1;判断是否结束(回车键)
MOVDPTR,#0040H;把结果放外部RAM中
MOVA,R1
MOVX@DPTR,A
SJMP$
LOOP1:
CJNEA,#42H,NEXT;不为B则跳转
INCR1;为B则使计数器加1
NEXT:
INCR0
AJMPLOOP
END
3-20设晶振频率为6MHz,试编写能延时30ms的程序。
MOVR2,#30
LOOPS:
MOVR3,#250
LOOPR:
DJNZR3,LOOPR
DJNZR2,LOOPS
SJMP$
END
3-21编写一程序将30H~3FH单元的数据依次送到P1口输出,每送一个数据延时10ms再送第二个,直到数据全部输完为止。
ORG0000H
MOVR0,#30H
MOVR1,#16
LOOP:
MOVP1,@R0
INCR0
MOVR2,#19
LOOPS:
MOVR3,#250
LOOPR:
DJNZR3,LOOPR
DJNZR2,LOOPS
DJNZR1,LOOP
SJMP$
END
3-22设在片内RAM的20H单元中有一数,其值在0~100之间,要求利用查表法求此数的平方值并将结果存入片外RAM的20H和21H单元,试编写相应程序。
MOVR0,#21H
MOVA,20H
MOVB,A
ADDA,B
MOVB,A
MOVDPTR,#TABLE
MOVCA,@A+DPTR;查出平方值的第一字节
MOVX@R0,A
INCB
MOVA,B
MOVCA,@A+DPTR;查出平方值的第二字节
DECR0
MOVX@R0,A
SJMP$
ORG0100H
TABLE:
DW0000H,0001H,0004H,0009H,…
END
3-23已知MDA和MDB单元内分别存有两个小于10的整数a和b,试用查表子程序实现c=a2+2ab+b2,并把和存于MDC和MDC+1单元中(MDC单元中放低字节,MDC+1单元中放高字节)。
ORG0000H
MDADATA20H
MDBDATA21H
MDCDATA22H
MOVA,MDA
ACALLSQR
MOVR2,A
MOVA,MDB
ACALLSQR
ADDA,R2
MOVR2,A;a2+b2结果暂时放入R2
MOVB,MDA;下面算2*a*b
MOVA,MDB
MULAB
RLA
ADDA,R2
MOVMDC,A
CLRA
ADDCA,#00H
MOVMDC+1,A
SJMP$
SQR:
ADDA,#01H
MOVCA,@A+PC
RET
SQRTAB:
DB0149162536496481100
END
3-24设有3个不带符号的8位二进制数a、b、c,分别存放在8031单片机片内RAM的30H、31H和32H单元中,要求计算y=(a+b)2+(b+c)2+(c+a)2(设y<256),并将结果y存入内部RAM的33H单元。
试用调用子程序的方法编写实现上述要求的程序。
ORG0000H
MOVA,30H
ADDA,31H
ACALLSQR
MOVR2,A
MOVA,31H
ADDA,32H
ACALLSQR
ADDA,R2
MOVR2,A;(a+b)2+(b+c)2结果暂时放入R2
MOVA,30H;
ADDA,32H
ACALLSQR
ADDA,R2
MOV33H,A
SJMP$
SQR:
ADDA,#01H
MOVCA,@A+PC
RET
SQRTAB:
DB0149162536496481100
END
3-25设有一长度为20H的字符串,存放在8031单片机片内RAM以10H为首地址的连续单元中,试编制将其中数字与字母分开并将它们分别送到以30H和50H为首地址的连续单元中的程序。
ORG0000H
MOVR2,#20H;循环次数
MOVR1,#10H
MOV60H,#30H;数字存储首地址
MOV61H,#50H;字母存储首地址
LOOP:
MOVA,@R1
CJNEA,#40H,NEXT
NEXT:
JNCNEXT1;如果是字母则跳转到NEXT1
MOVR0,60H;是数字,把数字的存储地址给R0
MOV@R0,A
INC60H
SJMPLOOP1
NEXT1:
MOVR0,61H
MOV@R0,A;是字母,把字母的存储地址给R0
INC61H
LOOP1:
INCR1
DJNZR2,LOOP
SJMP$
END
3-26设有50个无符号8位二进制数,存放在8031单片机外部RAM以1000H为首地址的连续单元中,要求编写程序,将这50个数从大到小依次存入片内以20H开始的RAM存储区,并画出程序流程图.
ORG0000H
MOVDPTR,#1000H
MOVR0,#20H
MOVR2,#50
LOOP1:
MOVXA,@DPTR
MOV@R0,A
INCDPTR
INCR0
DJNZR2,LOOP1
MOV75H,#50
BUB:
DJNZ75H,BI
SJMPJIE
BI:
MOVR2,75H
MOVR0,#20H
CLR7FH
BULOOP:
MOV70H,@R0
MOVA,@R0
INCR0
MOV71H,@R0
CJNEA,71H,LOOP
LOOP:
JNCBUNEXT
MOV@R0,70H
DECR0
MOV@R0,71H
INCR0
SETB7FH
BUNEXT:
DJNZR2,BULOOP
JIE:
JB7FH,BUB
SJMP$
END