单片机习题参考答案0812.docx
《单片机习题参考答案0812.docx》由会员分享,可在线阅读,更多相关《单片机习题参考答案0812.docx(33页珍藏版)》请在冰豆网上搜索。
单片机习题参考答案0812
单片机习题参考答案
第四章P976,7,9,10,12,16,17,18,19,23,27,28,29
6.在80C51片内RAM中,已知〔30H〕=38H,〔38H〕=40H,〔40H〕=48H,〔48H〕=90H,请分析下段程序中各指令的作用,并翻译成相应的机器码;说明源操作数的寻址方式及顺序执行每条指令后的结果。
机器码(H)指令结果源操作数的寻址方式
E540MOVA,40H;A=(40H)=48H直接寻址
F8MOVR0,A;R0=48H寄存器寻址
7590F0MOVP1,#0F0H;P1=0F0H立即寻址
A630MOV@R0,30H;(48H)=38H直接寻址
901246MOVDPTR,#1246H;DPTR=1246H立即寻址
853840MOV40H,38H;(40H)=40H直接寻址
A830MOVR0,30H;R0=38H直接寻址
8890MOV90H,R0;(90H)=38H寄存器寻址
754830MOV48H,#30H;(48H)=30H立即寻址
E6MOVA,@R0;A=40H寄存器间接寻址
8590A0MOVP2,P1;P2=P1=38H直接寻址
7.试说明以下指令的作用,并将其翻译成机器码,执行最后一条指令对PSW有何影响?
A的终值为多少?
机器码(H)指令结果
(1)7872MOVR0,#72H;R0=72H
E8MOVA,R0;A=72H,P=0
244BADDA,#4BH;A=BDH,CY=0,OV=1,AC=0,P=0
(2)7402MOVA,#02H;A=02H,P=1
F5F0MOVB,A;B=02H
740AMOVA,#0AH;A=0AH,P=0
25F0ADDA,B;A=0CH,CY=0,OV=0,AC=0,P=0
A4MULAB;A=18H,B=0,CY=0,OV=0,AC=0,P=0
(3)7420MOVA,#20H;A=20H,P=1
F5F0MOVB,A;B=20H
25F0ADDA,B;A=40H,CY=0,OV=0,AC=0,P=1
9410SUBBA,#10H;A=30H,CY=0,OV=0,AC=0,P=0
84DIVAB;A=01H,B=10H,CY=0,OV=0,AC=0,P=1
9.试编程将片外数据存储器60H中的内容传送到片内RAM54H单元中。
MOVDPTR,#0060H
MOVXA,@DPTR
MOV54H,A
(MOVP2,#0
MOVR0,#60H
MOVXA,@R0
MOV54H,A)
10.试编程将寄存器R7内容传送到R1中去。
MOVA,R7
MOVR1,A
12.试说明下段程序中每条指令的作用,并分析当执行完指令后,R0中的内容是什么?
MOVR0,#0A7H;R0=A7H
XCHA,R0;A=A7H,A的内容暂存R0
SWAPA;A=7AH
XCHA,R0;R0=7AH,A的内容恢复
16.试编程将片外RAM中30H和31H单元的内容相乘,结果存放在32H和33H单元中,高位存放在33H单元中。
MOVP2,#0
MOVR0,#30H
MOVXA,@R0
MOVB,A
INCR0
MOVXA,@R0
MULAB
INCR0
MOVX@R0,A
INCR0
MOVA,B
MOVX@R0,A
MOVDPTR,#30H
MOVXA,@DPTR
MOVB,A
INCDPTR
MOVXA,@DPTR
MULAB
INCDPTR
MOVX@DPTR,A
INCDPTR
MOVA,B
MOVX@DPTR,A
17.试用三种方法将累加器A中无符号数乘2。
〔1〕CLRC
RLCA
〔2〕MOVR0,A
ADDA,R0
或ADDA,ACC
〔3〕MOVB,#2
MULAB
18.请分析依次执行下面指令的结果:
MOV30H,#0A4H;(30H)=A4H
MOVA,#0D6H;A=D6H,P=1
MOVR0,#30H;R0=30H
MOVR2,#47H;R2=47H
ANLA,R2;A=46H,P=1
ORLA,@R0;A=E6H,P=1
SWAPA;A=6EH,P=1
CPLA;A=91H,P=1
XRLA,#0FFH;A=6EH,P=1
ORL30H,A;(30H)=EEH
19.求执行以下指令后,累加器A及PSW中进位位CY、奇偶位P和溢出位OV的值。
〔1〕当A=5BH时;ADDA,#8CH
01011011
+〕10001100
11100111
结果:
A=E7H,CY=0,OV=0,P=0,AC=1
〔2〕当A=5BH时;ANLA,#7AH
01011011
∧〕01111010
01011010
结果:
A=5AH,P=0
〔3〕当A=5BH时;XRLA,#7FH
01011011
⊕〕01111111
00100100
结果:
A=24H,P=0
〔4〕当A=5BH,CY=1时;SUBBA,#0E8H
01011011或将减法转换成补码加法01011011
11101000-E8H的补码00011000
-〕1-1的补码+〕11111111
01110010101110010
结果:
A=72H,CY=1,OV=0,P=0,AC=0
23.执行下述程序后,SP=?
A=?
B=?
解释每一条指令的作用,并将其翻译成机器码。
地址(H)机器码(H)ORG200H
0200758140MOVSP,#40H;SP=40H
02037430MOVA,#30H;A=30H
0205120250LCALL250H;调用250H开始的子程序SP=42H,
;(42H)=02H,(41H)=08H
02082410ADDA,#10H;此句没有执行
020AF5F0MOVB,A;B=30H
020C80FEL1:
SJMPL1;
ORG0250H
025090020AMOVDPTR,#20AH;DPTR=020AH
0253C082PUSHDPL;DPL进栈,SP=43H,(43H)=0AH
0255C083PUSHDPH;DPH进栈,SP=44H,(44H)=02H
025722RET;返回,此处是利用RET将栈顶内容弹出
PC=020AH,SP=42H
44H
02H
43H
0AH
栈区42H
02H
41H
08H
40H
执行程序后,SP=42H,A=30H,B=30H
27.试编一程序将外部数据存储器2100H单元中的高4位置“1”,其余位清”0”。
MOVDPTR,#2100H
MOVXA,@DPTR
ANLA,#0F0HMOVA,#0F0H
ORLA,#0F0H
MOVX@DPTR,A
28.试编程将内部数据存储器40H单元的第0位和第7位置”1”,其余位变反。
MOVA,40H
CPLA
SETBACC.0〔或ORLA,#81H〕
MOV40H,A
29.请用位操作指令,求下面逻辑方程:
MOVP1.7,C
MOVPSW.5,C
AN
MOVP2.3,C
第五章P1121,3,6,7,11,20
1.编程将片内40H~60H单元中内容送到以3000H为首的片外RAM存储区中
方法1:
MOVR0,#40H
MOVDPTR,#3000H
MOVR2,#21H
LOOP:
MOVA,@R0
MOVX@DPTR,A
INCR0
INCDPTR
DJNZR2,LOOP
┋
方法2:
MOVR0,#40H
MOVDPTR,#3000H
MOVR2,#0
LOOP:
MOVA,@R0
MOVX@DPTR,A
INCR0
INCDPTR
INCR2
CJNER2,#21H,LOOP
┋
方法3:
MOVR0,#40H
MOVDPTR,#3000H
LOOP:
MOVA,@R0
MOVX@DPTR,A
INCR0
INCDPTR
CJNER0,#61H,LOOP
┋
补充:
编程将ROM中3000H~3020H单元的内容送片内RAM40H~60H单元中去。
MOVR0,#40H
MOVDPTR,#3000H
MOVR2,#21H
LOOP:
CLRA
MOVCA,@A+DPTR
MOV@R0,A
INCR0
INCDPTR
DJNZR2,LOOP
3.编程计算片内RAM区50H~57H8个单元中数的算术平均值,结果存放在5AH中。
解:
ORG2000H
MOVR0,#50H
CLRA
MOVR2,A
LOOP:
ADDA,@R0
JNCDOWN
INCR2
DOWN:
INCR0
CJNER0,#58H,LOOP
MOVR7,#3
SHIFT:
XCHA,R2
CLRC
RRCA
XCHA,R2
RRCA
DJNZR7,SHIFT
MOV5AH,A
┋
6.设有100个有符号数,连续存放在以2000H为首地址的片外RAM存储区中,试编程统计其中正数、负数、零的个数。
方法1:
CLRA
MOVR5,A;存零的个数
MOVR6,A;存负数的个数
MOVR7,A;存正数的个数
MOVR2,#100
MOVDPTR,#2000H
LOOP:
MOVXA,@DPTR
JNZNZERO
INCR5
SJMPDOWN
NZERO:
JNBACC.7,PLUS
INCR6
SJMPDOWN
PLUS:
INCR7
DOWN:
INCDPTR
DJNZR2,LOOP
┋
方法2:
CLRA
MOVR5,A;存零的个数
MOVR6,A;存负数的个数
MOVR7,A;存正数的个数
MOVR2,#100
MOVDPTR,#2000H
LOOP:
MOVXA,@DPTR
INCDPTR
CJNEA,#0,NZERO
INCR5
SJMPDOWN
NZERO:
JCNEGATIVE
INCR7
SJMPDOWN
NEGATIVE:
INCR6
DOWN:
DJNZR2,LOOP
┋
7.请将片外数据存储器地址为1000H~1030H的数据块,全部搬迁到片内RAM30H~60H中,并将原数据块区域全部清“0”。
解:
ORG1000H
MOVDPTR,#1000H
MOVR0,#30H
MOVR2,#31H
LOOP:
MOVXA,@DPTR
MOV@R0,A
CLRA
MOVX@DPTR,A
INCR0
INCDPTR
DJNZR2,LOOP
┋
8.试编写一子程序,使间址寄存器R1所指向的2个片外RAM连续单元中的高4位二进制数合并为1个字节装入累加器A中。
已知R0指向低地址,并要求该单元高4位放在A的高4位中。
XX:
MOVXA,@R1
ANLA,#0F0H
MOVB,A
INCR1
MOVXA,@R1
ANLA,#0F0H
SWAPA
ORLA,B
RET
10.试编一查表程序,从首地址为1000H、长度为100的数据块中找出ASCII码A,将其地址送到10A0H和10A1H单元中。
MOVDPTR,#1000H
MOVR7,#100
LOOP:
MOVXA,@DPTR
CJNEA,#’A’,NXET
MOVA,DPL
MOVB,DPH
MOVDPTR,#10A0H
MOVX@DPTR,A
MOVA,B
INCDPTR
MOVX@DPTR,A
SJMP$
NEXT:
INCDPTR
DJNZR7,LOOP
SJMP$
11.设在200H~204H单元中存放有5个压缩BCD码,编程将它们转换成ASCII码,存放到以205H单元为首地址的存储区中。
方法1:
ORG1000H
MOVP2,#02H
MOVR0,#00H
MOVR1,#05H
MOVR2,#05
LOOP:
MOVXA,@R0
ANLA,#0FH
ORLA,#30H
MOVX@R1,A
INCR1
MOVXA,@R0
SWAPA
ANLA,#0FH
ORLA,#30H
MOVX@R1,A
INCR1
INCR0
DJNZR2,LOOP
┋
方法2:
ORG1000H
MOVR2,#02H
MOVR3,#00H
MOVR4,#05H
MOVR7,#05
MOVDPH,R2
LOOP:
MOVDPL,R3
MOVXA,@DPTR
MOVB,A
INCDPTR
MOVR3,DPL
MOVDPL,R4
ANLA,#0FH
ORLA,#30H
MOVX@DPTR,A
INCDPTR
MOVA,B
SWAPA
ANLA,#0FH
ORLA,#30H
MOVX@DPTR,A
INCDPTR
MOVR4,DPL
DJNZR7,LOOP
┋
13.试编程实现以下逻辑表达式的功能。
设P1.7~P1.0为8个变量的输入端,而其中P1.7又作为变量输出端。
①
X7BITP1.7
ORG2000H
MOVC,X0
ANLC,X1
ANLC,/X2
ORLC,/X3
ORLC,X4
ANLC,X5
ANLC,X6
ORLC,/X7
MOVP1.7,C
┋
②
解:
ONEBIT20H;存第一项逻辑值
TWOBIT21H;存第二项逻辑值
X7BITP1.7
ORG2000H
MOVC,X0
ANLC,X1
CPLC
MOVONE,C
MOVC,X2
ANLC,X3
ANLC,X4
CPLC
MOVTWO,C
MOVC,X5
ANLC,X6
ANLC,X7
CPLC
ORLC,TWO
CPLC
ORLC,ONE
MOVP1.7,C
┋
20.根据图5.6的线路设计灯亮移位程序,要求8只发光二极管每次亮一个,点亮时间为40ms。
顺次一个一个地循环右移点亮,循环不止。
已知时钟频率为24MHz。
解:
MOVA,#01H
LOOP:
MOVP1,A
LCALLD40MS
RRA
SJMPLOOP
D40MS:
MOVR2,#160
EXTERNAL:
MOVR3,#250
INTERNAL:
DJNZR3,INTERNAL
DJNZR2,EXTERNAL
RET
第六章P1555,6,8
5.已知80C51单片机系统时钟频率为24MHz,请利用定时器T0和P1.2输出矩形脉冲其波形如下:
选择T0工作于方式2〔8位重置初值〕定时50μs
fosc=24MHz
〔28-X〕×μS=50μsX=156=9CH
方法1:
MOVTMOD,#02H
MOVTH0,#9CH
MOVTL0,#9CH
CLRP1.2;P1.2=0
SETBTR0
HIGH:
SETBP1.2;P1.2=1,输出50μs高电平
HIGH1:
JBCTF0,LOW;50μs到清TF0,转输出低电平
AJMPHIGH1;50μs未到,转HIGH1等待
LOW:
MOVR7,#7;350μs=7×50μs
CLRP1.2;P1.2=0输出350μs低电平
LOW1:
JBCTF0,LOW2;50μs到清TF0,转LOW2
AJMPLOW1
LOW2:
DJNZR7,LOW1;7次未到,转LOW1
AJMPHIGH;7次到,转HIGH,输出50μs高电平
方法2:
MOVTMOD,#02H;设置T0为方式2定时
MOVTH0,#9CH;赋初值
MOVTL0,#9CH
SETBTR0;启动T0工作
L1:
SETBP1.2;P1.2=1,输出50μs高电平
MOVR7,#8
DEL:
JBCTF0,REP;50μs到清TF0,转输出低电平
AJMPDEL
REP:
CLRP1.2;P1.2=0输出350μs低电平
DJNZR7,DEL
AJMPL1
方法3:
选择T0工作于方式1定时50μs
〔216-X〕×μS=50μsX=65436=FF9CH
选择T0工作于方式1定时350μs
〔216-X〕×μS=350μsX=64836=FD44H
START:
MOVTMOD,#01H;设置T0为方式1定时
LP0:
MOVTH0,#0FFH;赋初值定时50μs
MOVTL0,#9CH
SETBTR0;启动T0工作
LP1:
JBCTF0,LP2;P1.2=1,输出50μs高电平
SJMPLP1
MOVTH0,#0FDH;赋初值定时350μs
MOVTL0,#44H
LP3:
JBCTF0,LP4;P1.2=1,输出350μs低电平
SJMPLP3
LP4:
SJMPLP0
6.在80Cμs的方波。
方法1:
选择T0工作于方式1定时250μs
fosc=12MHz
〔216-X〕×1μS=250μsX=65286=FF06H
MOVTMOD,#01H
MOVTH0,#0FFH
MOVTL0,#06H
SETBTR0
DEL:
MOVR7,#4;1ms=4×250μs
D250:
JBCTF0,D2;250μs到清TF0,转移
AJMPD250;250μs未到,等待
MOVTH0,#0FFH;重装初值
MOVTL0,#06H
DJNZR7,D250;4次未到,转D500
AJMPDEL;4次到,转DEL
方法2:
选择T0工作于方式2定时250μs
〔28-X〕×1μS=250μsX=6
MOVTMOD,#02H
MOVTH0,#06H
MOVTL0,#06H
SETBTR0
DEL:
MOVR7,#4;1ms=4×250μs
D250:
JBCTF0,D2;250μs到清TF0,转移
AJMPD250;250μs未到,等待
DJNZR7,D250;4次未到,转D250
AJMPDEL;4次到,转DEL
方法3:
选择T0工作于方式2定时250μs,中断
〔28-X〕×1μS=250μsX=6
T1工作于方式1定时1ms,中断
〔216-X〕×1μS=1000μsX=64536=FC18H
ORG0000H
LJMPMAIN
ORG000BH
LJMPT00
ORG001BH
LJMPT11
MAIN:
MOVTMOD,#12H
MOVTH0,#06H
MOVTL0,#06H
MOVTH1,#0FCH
MOVTL1,#18H
MOVIE,#8AH
SETBTR0
SETBTR1
SJMP$
RETI
T11:
MOVTH1,#0FCH
MOVTL1,#18H
RETI
方法4:
选择T0工作于方式3定时250μs,中断。
〔28-X〕×1μS=250μsX=6
T0方式3时TL0占用TR0、TF0,TH0占用TR1、TF1。
ORG0000H
LJMPMAIN
ORG000BH
LJMPITL0
ORG001BH
LJMPITH0
MAIN:
MOVSP,#50H
MOVTMOD,#03H
MOVTH0,#06H
MOVTL0,#06H
MOVR7,#4
SETBTR0
SETBTR1
MOVIE,#8AH
SJMP$
ITL0:
MOVTL0,#06H
RETI
ITH0:
MOVTH1,#06H
DJNZR7,ITH01
MOVR7,#4
ITH01:
RETI
7.设系统时钟频率为24MHz,试用定时器T0作外部计数器,编程实现每计到1000个脉冲,使T1开始2ms定时,定时时间到后,T0又开始计数,这样反复循环不止。
fosc=24MHz
T0作外部计数器选择工作于方式1:
1000=216-XX=64536=FC18H
T1定时2ms选择工作于方式1:
〔216-X〕×μS=2000μsX=61536=F060H
MOVTMOD,#15H
ST