单片机习题参考答案0812.docx
《单片机习题参考答案0812.docx》由会员分享,可在线阅读,更多相关《单片机习题参考答案0812.docx(35页珍藏版)》请在冰豆网上搜索。
单片机习题参考答案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立即寻址
A630MOVR0,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
MOVXR0,A
INCR0
MOVA,B
MOVXR0,A
MOVDPTR,#30H
MOVXA,DPTR
MOVB,A
INCDPTR
MOVXA,DPTR
MULAB
INCDPTR
MOVXDPTR,A
INCDPTR
MOVA,B
MOVXDPTR,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
MOVXDPTR,A
28.试编程将部数据存储器40H单元的第0位和第7位置”1”,其余位变反。
MOVA,40H
CPLA
SETBACC.0(或ORLA,#81H)
SETBACC.7
MOV40H,A
29.请用位操作指令,求下面逻辑方程:
MOVC,P2.1
ORLC,B.0
ANLC,ACC.0
ORLC,/P3.2
MOVP1.7,C
MOVC,P1.3
ANLC,ACC.2
ORLC,B.5
ANLC,/P1.1
MOVPSW.5,C
MOVC,B.4
ANLC,/P1.5
ORLC,/ACC.7
ANLC,P1.0
MOVP2.3,C
第五章P1121,3,6,7,11,20
1.编程将片40H~60H单元中容送到以3000H为首的片外RAM存储区中
方法1:
MOVR0,#40H
MOVDPTR,#3000H
MOVR2,#21H
LOOP:
MOVA,R0
MOVXDPTR,A
INCR0
INCDPTR
DJNZR2,LOOP
┋
方法2:
MOVR0,#40H
MOVDPTR,#3000H
MOVR2,#0
LOOP:
MOVA,R0
MOVXDPTR,A
INCR0
INCDPTR
INCR2
CJNER2,#21H,LOOP
┋
方法3:
MOVR0,#40H
MOVDPTR,#3000H
LOOP:
MOVA,R0
MOVXDPTR,A
INCR0
INCDPTR
CJNER0,#61H,LOOP
┋
补充:
编程将ROM中3000H~3020H单元的容送片RAM40H~60H单元中去。
MOVR0,#40H
MOVDPTR,#3000H
MOVR2,#21H
LOOP:
CLRA
MOVCA,A+DPTR
MOVR0,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
MOVR0,A
CLRA
MOVXDPTR,A
INCR0
INCDPTR
DJNZR2,LOOP
┋
8.试编写一子程序,使间址寄存器R1所指向的2个片外RAM连续单元中的高4位二进制数合并为1个字节装入累加器A中。
已知R0指向低地址,并要求该单元高4位放在A的高4位中。
##:
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
MOVXDPTR,A
MOVA,B
INCDPTR
MOVXDPTR,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
MOVXR1,A
INCR1
MOVXA,R0
SWAPA
ANLA,#0FH
ORLA,#30H
MOVXR1,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
MOVXDPTR,A
INCDPTR
MOVA,B
SWAPA
ANLA,#0FH
ORLA,#30H
MOVXDPTR,A
INCDPTR
MOVR4,DPL
DJNZR7,LOOP
┋
13.试编程实现以下逻辑表达式的功能。
设P1.7~P1.0为8个变量的输入端,而其中P1.7又作为变量输出端。
①
解:
X0BITP1.0
X1BITP1.1
X2BITP1.2
X3BITP1.3
X4BITP1.4
X5BITP1.5
X6BITP1.6
X7BITP1.7
ORG2000H
MOVC,X0
ANLC,X1
ANLC,/X2
ORLC,/X3
ORLC,X4
ANLC,X5
ANLC,X6
ORLC,/X7
MOVP1.7,C
┋
②
解:
ONEBIT20H;存第一项逻辑值
TWOBIT21H;存第二项逻辑值
X0BITP1.0
X1BITP1.1
X2BITP1.2
X3BITP1.3
X4BITP1.4
X5BITP1.5
X6BITP1.6
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)×0.5μ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
CLRP1.2
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)×0.5μS=50μsX=65436=FF9CH
选择T0工作于方式1定时350μs
(216-X)×0.5μS=350μsX=64836=FD44H
START:
MOVTMOD,#01H;设置T0为方式1定时
LP0:
MOVTH0,#0FFH;赋初值定时50μs
MOVTL0,#9CH
CLRP1.2
SETBTR0;启动T0工作
SETBP1.2
LP1:
JBCTF0,LP2;P1.2=1,输出50μs高电平
SJMPLP1
LP2:
CLRP1.2
MOVTH0,#0FDH;赋初值定时350μs
MOVTL0,#44H
LP3:
JBCTF0,LP4;P1.2=1,输出350μs低电平
SJMPLP3
LP4:
SJMPLP0
6.在80C51单片机中,已知时钟频率为12MHz,请编程使P1.0和P1.1分别输出周期为2ms和500μ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未到,等待
D2:
CPLP1.1
MOVTH0,#0FFH;重装初值
MOVTL0,#06H
DJNZR7,D250;4次未到,转D500
CPLP1.0
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未到,等待
D2:
CPLP1.1
DJNZR7,D250;4次未到,转D250
CPLP1.0
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$
T00:
CPLP1.1
RETI
T11:
MOVTH1,#0FCH
MOVTL1,#18H
CPLP1.0
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
LJ