单片机原理和应用练习试题3答案解析.docx
《单片机原理和应用练习试题3答案解析.docx》由会员分享,可在线阅读,更多相关《单片机原理和应用练习试题3答案解析.docx(16页珍藏版)》请在冰豆网上搜索。
单片机原理和应用练习试题3答案解析
练习题3答案
1.简述下列基本概念:
指令,指令系统,机器语言,汇编语言。
答:
指令是单片机CPU执行某种操作的命令。
指令系统是一台计算机所能执行的指令集合。
机器语言即二进制代码语言,是计算机可以直接识别。
汇编语言是用助记符、字符串和数字等来表示指令的程序语。
2.简述AT89S51单片机的指令格式
答:
该单片机的指令由两部分组成,即操作码和操作数。
操作码用来规定指令进行什么操作,而操作数则是指令操作的对象,操作数可能是一个具体的数据,也可能是指出到哪里取得数据的地址或符号。
指令格式一般为:
[标号:
]操作码[操作数1][,操作数2][,操作数3][;注释]
3.简述AT89S51的寻址方式和所能涉及的寻址空间
表3-2寻址方式及相应的寻址存储器范围
寻址方式
寻址存储器范围
立即寻址
程序存储器ROM
直接寻址
片内RAM低128B,特殊功能寄存器
寄存器寻址
工作寄存器R0~R7,A,C,DPTR,AB
寄存器间接寻址
片内RAM低128B,片外RAM
变址寻址
程序存储器ROM(@A+DPTR,@A+PC)
相对寻址
程序存储器ROM(相对寻址指令的下一指令PC值加-128~+127)
位寻址
片内RAM的20H~2FH字节地址中所有的位,可位寻址的特殊功能寄存器
答:
共有7种寻址方式,见表3-2。
分别是:
(1)寄存器寻址:
寻址范围为通用寄存器组,共4组32个,但只能使用当前寄存器组,因此使用前需要通过对PSW种的RS1、RS0位的状态进行设置;
(2)直接寻址:
寻址范围为内部RAM,包括低128位用户RAM区和高128位专用寄存器;(3)寄存器间接寻址:
寻址范围为内部RAM低128位,外部RAM64KB(低256单元可以使用DPTR和R0、R1作为间接寻址寄存器,而其他单元只能用DPTR作为间接寻址寄存器);(4)立即寻址:
直接给出立即数,不涉及寻址空间;(5)变址寻址:
只对程序寄存器进行寻址;(6)相对寻址:
以PC的内容为基值,加上指令机器代码中‘相对地址’形成新的PC值转移;(7)位寻址:
寻址空间包括内部RAM位寻址区(20~2FH)和专用寄存器的可寻址位。
4.要访问片外程序存储器和片外数据存储器,应采用哪些寻址方式?
答:
访问片外程序存储器采用变址寻址方式,片外数据存储器采用寄存器间接寻址方式,且用DPTR可以访问64KB,而用R0或者R1只可访问低256字节。
5.在AT89S51片内RAM中,已知(30H)=38H,(38H)=40H,(40H)=48H,(48H)=90H。
请分析下面各是什么指令,说明源操作数的寻址方式及按顺序执行每条指令后的结果。
答:
指令
指令说明
源操作数寻址方式
结果
MOVA,40H
将内部RAM中40H内容传送到累加器A中
(A)←(40H)
直接寻址
(A)=48H
MOVR0,A
再将A中内容传送给R0
(R0)←(A)
寄存器寻址
(R0)=48H
MOVP1,#0F0H
将立即数0F0H送到P1口,即P1.4~P1.7位1,其余为0
(P1)←0F0H
立即数寻址
(P1)=0F0H
MOV@R0,30H
将30H中的内容,传放到以R0单元内容为地址的单元中
((R0))←(30H)
直接寻址
((R0))=(48H)=38H
MOVDPTR,#3848H
将立即数3848传送给DPTR数据指针
(dptr)←3848H
立即数寻址
(DPTR)=3848H
MOV40H,38H
将内部RAM中38H内容传送到40H单元中
(40H)←(38H)
直接寻址
(40H)=40H
MOVR0,30H
将30H中的内容给R0寄存器
(R0)←(30H)
直接寻址
(R0)=38H
MOVP0,R0
将R0的内容传送到P0
(P0)←(R0)
寄存器寻址
(P0)=38H
MOVA,@R0
将R0内容为地址的该单元内容传送给A
(A)←((R0))
寄存器间接寻址
(A)=40H
MOVP2,P1
将P1的内容传送给P2
(P2)←(P1)
直接寻址
(P2)=0F0H
6.指出下列指令的源操作数的寻址方式
MOVA,65H直接寻址
MOVA,#65H立即数寻址
MOVA,@R0寄存器间接寻址
MOVA,R2寄存器寻址
MOVCA,@A+PC变址寻址
7.内部RAM和特殊功能寄存器各用什么寻址方式?
答:
内部RAM有寄存器寻址方式、直接寻址方式和间接寻址方式;
特殊功能寄存器除A外只能进行直接寻址。
8.已知:
(A)=5BH,(R1)=30H,(30H)=0CEH,(P1)=71H,(PSW)=80H,(PC)=2000H,(205CH)=46H,(SP)=30H,(B)=78H。
分别求各条指令执行后的结果(要求进行二进制运算验证)及标志位Cy、P的影响。
(1)MOVA,@R1(A)=0CEHP=1,C不变
(2)MOV40H,30H(40H)=0CEHP和C不变
(3)MOVP1,R1(P1)=30HP和C不变
(4)MOVCA,@A+PC(A)=46HP=1,C不变
(5)PUSHB(31H)=78H,(SP)=31HP和C不变
(6)POPDPH(DPH)=0CEH,(SP)=29HP和C不变
(7)XCHDA,@R1(A)=05EH,(30H)=CBHP=1,C不变
(8)ADDA,30H(A)=29HP=1,C=1
(9)ADDCA,P1(A)=CDHP=1,C=0
(10)SUBBA,P1(A)=E9HP=1,C=1
(11)ANLP1,#0FH(P1)=01HP和C不变
(12)CLRPSW.7C=0
(13)RLCA(A)=B7HP=0,C=0
(14)ORLC,90HC=1,P不变
9.对下面一段程序加上机器码和注释,并说明程序运行后寄存器A、R0和内部RAM50H、51H、52H单元的内容。
MOV50H,#50H755050 ;(50H)←50H
MOVA,50HE550 ;(A)←(50H)
MOVR0,AF8 ;(R0)←(A)
MOVA,#30H7430 ;(A)←30H
MOV@R0,AF6 ;((R0))←(A)
MOVA,#50H7450 ;(A)←50H
MOV51H,AF551 ;(51H)←(A)
MOV52H,#00H755200 ;(52H)←00H
答:
运行后寄存器(A)=50H,(R0)=50H,(50H)=30H,(51)=50H,(52H)=00H
10.区别下列各指令中20H的含义,在每条指令后加上注释。
MOVA,#20H将20H立即数传送给A
MOV45H,20H将内部RAM中20H单元的内容传送到45H中
MOVC,20H.0将内部RAM中20H单元内容的第0位(最低位)传送给C
MOVC,20H将内部RAM中20H位地址内容传送给C
11.写出完成以下功能的指令
(1)将立即数30H送到R1;
(2)将内RAM30H中的数据送到内RAM78H单元;
(3)将立即数30H送到 以R0中内容为地址的存储器中;
(4)将R2中的内容送到 P1;
(5)将内RAM60H单元的数据送到 外RAM60H单元;
(6)将内RAM60H单元的数据送到外RAM1060H单元;
(7)将ROM1000H单元的内容送到内RAM30H单元;
(8)使ACC.7置位;
(9)使累加器的低4位清零;
(10)使P1.2与CY相与,结果送CY;
(11)立即数45H、93H进行逻辑与、或、异或操作;
(12)两立即数求和:
1C0H+45H,结果按高低8位存在30H、31H中。
答案:
(1)MOVR1,#30H
(2)MOV78H,30H
(3)MOV@R0,#30H(4)MOVP1,R2
(5)MOVA,60H;;
movp2,#0;
movr0,#60h;
movx@r0,a
(6)MOVA,60H;;
movdptr,#1060;
movx@dptr,a
(7)MOVA,#00H
MOVDPTR,#1000H
MOVCA,@A+DPTR
MOV30H,A
(8)SETBACC.7
(9)ANLA,#0F0H
(10)ANLC,p1.2
(11)与:
MOVA,#45H
ANLA,#59H
或:
MOVA,#45H
ORLA,#59H
异或:
PMOVA,#45H
XRLA,#59H
(12)CLRC
MOVR2,#1
MOVA,#0C0H
ADDA,#45H
MOV31H,A
MOVA,R2
ADDCA,#0
MOV30H,A
12.写出下列指令执行过程中堆栈的变化
设堆栈初值为X:
MOVR6,#11H(SP)=X(堆栈不变)
MOVR7,#23H(SP)=X(堆栈不变)
ACALL200H(SP)=X+2
;(X+1)=第4条指令的首址PC低8位(X+2)=第4条指令的首址PC高8位
POP50H(SP)=X-1
POP51H(SP)=X-2
SJMP$
ORG200H
RET
答:
执行过程中,前面两条为立即寻址指令,堆栈不变;执行第三条ACALL指令时,首先将程序寄存器PC的当前值加2,接着先后将PC的低八位和高八位分别进栈,(SP)=(SP)+2;然后再将PC内容中的低11位用200H来替代,同时程序跳到第七条ORG200H中,接着RET表示子程序返回,将原先压入堆栈的PC值弹出,(SP)=(SP)-2;最后两条POP指令执行后将SP所指地址中的内容赋给50H,SP减1后再将SP所指地址中的内容赋给51H,SP内容再减1给SP,最后程序结束。
13.请写出能实现下列功能的程序段:
(1)一个16位数据,高低字节分别放在20H和21H中,试将该数乘以2
MOVA,21H
CLRC
RRCA
MOV21H,A
MOVA,20H
RRCA
MOV20H,A
(2)16位二进制数由高位到低位放在30H和31H单元,将其内容加1;
MOVA,31H
ADDA,#01H
MOV31H,A
MOVA,30H
ADDCA,#00H
MOV30H,A
(3)将DPTR中的数据减5;
CLRC
MOVA,DPL
SUBBA,#05H
MOVDPL,A
MOVA,DPH
SUBBA,#00H
MOVDPh,A
(4)有3个位变量X,Y,Z,请编写程序实现Y=X+YZ的逻辑关系式。
XBIT30H
YBIT31H
ZBIT32H
MOVC,Y
ANLC,Z
MOV20H,C
MOVC,X
ORLC,20H
MOVY,C
14.将一个按高低字节存放在21H、20H中的一个双字节乘以2后,再按高低次序将结果存放到22H、21H、20H单元
ORG0
STAR:
CLRC
MOV20H,#0E2H;设低字节的数据是E2H
MOV21H,#0F3H;设高字节的数据是F3H
MOVA,20H
MOVB,#2H
MULAB
MOV20H,A
MOV23H,B
MOVA,21H
MOVB,#2H
MULAB
ADDCA,23H
MOV21H,A
MOV22H,B
SJMP$
END
15.试编程,将片外RAM1000H~1050H单元的内容置为55H。
MOVP2,#10H
MOVR0,#00H
MOVA,#55H
MOVX@R0,A
MOVR0,#50H
L0:
MOVX@R0,A
DJNZR0,L0
SJMP$
END
16.试编程统计数据区长度的程序,设数据区从片内RAM30H单元开始,该数据区以0结束,统计结果放入2FH中。
MOVR0,#30H
L0:
MOVA,@R0
JZL1
INCR1
INCR0
SJMPL0
L1:
MOV2FH,R1
17.试编写程序,将片外RAM2000H~200FH数据区中的数据由大到小排列起来。
ORG0
L0:
MOVP2,#20H
MOVR0,#00H
MOVR7,#0FH
CLRF0
LOOP:
MOVXA,@R0
MOV31H,A
INCR0
MOVXA,@R0
CLRC
CJNEA,31H,L1
L1:
JCL2
DECR0
MOVX@R0,A
MOVA,31H
INCR0
MOVX@R0,A
SETBF0
L2:
DJNZR7,LOOP
JBF0,L0
SJMP$
END
18.若晶振频率位6MHZ,试计算下面延时子程序的延时时间
DELAY:
MOVR7,#0F6H;1个机器周期
LP:
MOVR6,#0FAH;1个机器周期
DJNZR6,$;2个机器周期
DJNZR7,LP;2个机器周期
RET;2个机器周期
答:
机器周期为2us,则有:
[1+(1+2×250+2)×246+2]×2us=247482us
19.试分别编写延时20ms和1s的程序
设晶振频率为12M
20ms:
ORG0
MOVR1,#102
L1:
MOVR0,#48
L2:
NOP
NOP
DJNZR0,L2
NOP
DJNZR1,L1
NOP
NOP
NOP
NOP
NOP
NOP
NOP
END
1s:
----------------------------------------------
ORG0
MOVR2,#50
L0:
MOVR1,#100
L1:
MOVR0,#49
L2:
NOP
NOP
DJNZR0,L2
NOP
DJNZR1,L1
DJNZR2,L0
SJMP$
END
20.试编写利用调用子程序的方法延时1min的程序。
ORG0H
MOVR2,#60
A0:
LCALLDLY
DJNZR2,A0
SJMP$
DLY:
MOVR2,#50
L0:
MOVR1,#100
L1:
MOVR0,#49
L2:
NOP
NOP
DJNZR0,L2
NOP
DJNZR1,L1
DJNZR2,L0
RET
END
21.用查表程序求0~6之间的整数的立方。
已知整数存在A中,查表结果存入片内RAM31H中。
ORG0
MOVA,#DATA
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOV30H,A
SJMP$
TAB:
DB0,1,8,27,64,125,216
END
若立方数超过一个字节,在两个字节以内,由以下程序实现。
ORG0000H
MOVA,#5
RLA
MOVR0,A
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOV31H,A;高位
MOVA,R0
INCA
MOVCA,@A+DPTR
MOV30H,A;低位
SJMP$
TAB:
DW0,1,8,27,64,125,216
END
22.编写程序,查找在内部RAM的30H~50H单元中出现FFH的次数,并将查找结果存入51H单元。
MOVR1,#00H
MOVR0,#30H
MOVR2,#21H
L0:
MOVA,@R0
CJNEA,#0FFH,L1
INCR1
L1:
INCR0
DJNZR2,L0
MOV51H,R1
SJMP$
END
23.试用子程序求多项式:
Y=(A+B)2+(B+C)2(要求:
两数之和不能超过16)
XEQU30H;X代表A
YEQU31H;Y代表B
ZEQU32H;Z代表C
FEQU33H;F中存放计算结果Y
MOVR1,X
MOVR2,Y
LCALLL0
MOVR3,A
MOVR1,Y
MOVR2,Z
LCALLL0
ADDA,R3
MOVF,A
Sjmp$
L0:
MOVA,R1
ADDA,R2
MOVB,A
MULAB
RET
end
24.已知(60H)=33H,(61H)=43H,试写出程序的功能和运行结果。
ORG0000h
SS:
MOVR0,#61H
MOVR1,#70H
ACALLCRR
SWAPA
MOV@R1,A
DECR0
ACALLCRR
XCHDA,@R1
SJMP$
CRR:
MOVA,@R0
CLRC
SUBBA,#30h
CJNEA,#0AH,NEQ
AJMPBIG
NEQ:
JCCEN
BIG:
SUBBA,#07H
CEN:
RET
该程序的运行结果是:
(60H)=33H,(61H)=43H,(70H)=C3H
25.内部RAM的30H单元开始存放着一组无符号数,其数目存放在21H单元中。
试编写程序,求出这组无符号数中的最小的数,并将其存入20H单元中。
MOVR0,#30H
MOVA,@R0
MOV20H,A
DEC21H
LOOP:
INCR0
MOVA,@R0
CJNEA,20H,L1
L1:
JNCL2
MOV20H,A
L2:
DJNZ21H,LOOP
SJMP$
END
26.写程序实现散转功能:
(R2)=0转向RR0
(R2)=1转向RR1
(R2)=2转向RR2
ORG0
MOVR2,#2H;设(R2)=2
MOVDPTR,#TAB
MOVA,R2
MOVCA,@A+DPTR
JMP@A+DPTR
TAB:
DBRR0-TAB
DBRR1-TAB
DBRR2-TAB
RR0:
MOVA,#1;RR0:
将立即数1赋给A
SJMPENDF
RR1:
MOVA,#2;RR1:
将立即数2赋给A
SJMPENDF
RR2:
MOVA,#3;RR2:
将立即数3赋给A
SJMPENDF
ENDF:
SJMP$
27.试按子程序形式编程,将单字节二进制数高4位、低4位分别转换成两个字节的ASCII码。
MOVA,R0;将R0中的内容作为贝转换对象
ANLA,#0FH;取低四位
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOV20H,A;低四位转换后存放于20H中
MOVA,R0
ANLA,#0F0H;取高四位
SWAPA
MOVCA,@A+DPTR
MOV21H,A;高四位转换后存放于21H中
TAB:
DB30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
DB41H,42H,43H,44H,45H,46H