单片机原理与应用赵晓安课后习题Word文档格式.docx
《单片机原理与应用赵晓安课后习题Word文档格式.docx》由会员分享,可在线阅读,更多相关《单片机原理与应用赵晓安课后习题Word文档格式.docx(16页珍藏版)》请在冰点文库上搜索。
复位后sp的内容是什么?
Sp表示堆栈指针,为8位专用寄存器,作用是为了指示栈顶地址,它的内容是堆栈栈顶的存储单元地址。
复位后sp在RAM低128位字节中开辟栈区,并初始化为07H,当实际进栈出栈时,存储数据前会自动加1,所以堆栈实在08H单元开始。
2-18试说明8051的振荡周期、机器周期、指令周期是如何分配的。
当振荡脉冲频率为6MHz时,机器周期是多少?
8051单片机每条指令的执行时间(即指令周期)为1~4个机器周期,有单字节单周期指令、两字节单周期指令、单字节两周期指令、两字节两周期指令、三字节两周期指令以及
单字节四周期指令。
一个机器周期有6个状态:
S1~S6每个状态又包含两个振荡周期,分为两拍:
P1和P2。
因此,一个机器周期包含12个振荡周期,表示为:
S1P1、S1P2、S2P1、?
?
S6P1、S6P2。
当FOSC=6MHz时,机器周期为:
(1/6)×
12=2(μs)
第三章
3-1简述MCS-51有哪几种寻址方式?
各有什么特点?
MCS-51有以下七种寻址方式:
(1)直接寻址:
指令中直接给出操作数所在的单元地址或位地址;
(2)立即寻址:
在指令中紧跟在操作码之后的字节是操作数;
(3)寄存器寻址:
操作数在指令中给出的寄存器中;
(4)寄存器间接寻址:
寄存器中存放的是操作数所在的单元地址;
(5)变址寻址:
基址加变址形成的16位地址是操作数地址;
(6)相对寻址:
指令中给出相对偏移量,转移指令都为相对寻址;
(7)位寻址:
指令中给出的位地址或位寄存器中存放的是位操作数。
3-2MCS-51指令按功能分为哪几类?
每类指令的作用是什么?
MCS-51指令按功能分为五类,分别为:
(1)数据传送类指令:
主要用于数据的传送、交换与堆栈操作;
(2)算术运算类指令:
主要用来完成加减乘除运算及二十进制调整;
(3)逻辑运算类指令:
主要完成与、或、异或及移位运算;
(4)位操作指令:
主要用来做与、或、清除、置位、求反等布尔运算;
(5)控制转移指令:
控制程序执行的走向,有转移、调用及返回操作。
3-3变址寻址和相对寻址中的偏移量有何异同?
变址寻址:
@A+DPTR、@A+PC,其中DPTR、PC为基址寄存器,A为变址寄存器,其中A为8位无符号的二进制数,其范围为0到255;
相对寻址中偏移量为8位带符号的二进制数,范围为-128-127
23-4指出下列每条指令的寻址方式,30H在不同的指令中代表什么含义?
(1)MOVA,#30H;
寄存器寻址,立即寻址,30H为立即数
(2)MOV30H,@R1;
直接寻址,寄存器间接寻址,30H为字节地址
(3)MOVC,30H;
寄存器寻址,直接寻址,30H为位地址
(4)MOV30H,R5;
直接寻址,寄存器寻址,30H为字节地址
(5)MOVXA,@DPTR;
寄存器寻址,寄存器间接寻址
(6)MOVCA,@A+PC;
寄存器寻址,基址加变址的寄存器间接寻址,
(7)JCLAB1;
相对寻址
(8)SJMPLAB2;
3-5写出下列指令的机器码,并指出执行下列程序段后各单元内容变为什么?
累加器A及PSW中的内容变为什么?
(1)MOVA,#2;
(A)=02H
MOVR1,#30H;
(R1)=30H
MOV@R1,A;
(30H)=02H
MOV35H,R1;
(35H)=30H
XCHA,R1;
(A)=30H,(R1)=02H
(2)MOVA,#0F5H;
(A)=0F5H
MOV30H,#9BH;
(30H)=9BH
MOVR0,30H;
(R0)=9BH
ADDA,#28H;
(A)=1DHCy=1AC=00V=0
ADDCA,@R0;
(A)=0B9HCy=0AC=10V=0
⑶CLRC;
(C)=0
MOV40H,#7AH;
(40H)=7AH
MOVA,#92H;
(A)=92H
MOVR0,#40H;
(R0)=40H
SUBBA,@R0;
(A)=18HCY=0AC=1OV=1
⑷MOVA,#79H;
(A)=79H
MOV30H,#89H;
(30H)=89H
ADDA,30H;
(A)=02HCY=1AC=1OV=0
DAA;
(A)=68HCY=1
SWAPA;
(A)=86HCY=1
3-6写出能完成下列数据传送的指令
1R1内容传送到R0
MOVA,R1
MOVR0,A
2内部RAM25H单元中内容送35H单元
MOV35H,25H
3内部RAM25H单元中内容送P1口
MOVP1,25H
4内部RAM40H单元中内容送外部RAM2005H单元
MOVA,40H
MOVDPTR,#2005H
MOVX@DPTR,A
5外部RAM3000H单元中内容送外部RAM25H单元
MOVDPTR,#3000H
MOVXA,@DPTR
MOV25H,A
6外部ROM1000H单元中内容送内部RAM35H单元
MOVDPTR,#1000H
CLRA
MOVCA,@A+DPTR
MOV35H,A
7外部ROM4000H单元中内容送外部RAM4000H单元
8外部RAM1000H单元中内容送SP堆栈指针
MOVDPTR,#1000H
MOVSP,A
3-8写出下段程序中每一步A、B中的结果:
MOVA,#22H;
(A)=22H
MOVB,#05H;
(B)=05H
MOVR0,#08H;
(R0)=08H
MULAB;
(B)=00H(A)=0AAH
MOVB,R0;
(B)=08H
DIVAB;
(A)=15H(B)=02H
3-9试写出完成如下操作的程序:
1把RAM1000H单元中的低4位变“0”,其余位不变
ANLA,#0F0H
2使内部RAM50H单元中的低4位变“1”,其余位不变
ORL50H,#0FH
3使内部RAM50H单元中的高3位变反,其余位不变
XRL50H,#0E0H
4使内部RAM50H单元中的高4位变“1”,低4位变“0”
MOV50H,#0F0H
5使内部RAM50H单元中的所有位变反。
XRL50H,#0FFH
3-10试编写程序完成以内部RAM30H为首地址的20个数据传送,目的地址为外部RAM以3000H为首地址的区域。
ORG0000H
MOVR0,#30H
MOVDPTR,#3000H
MOVR7,#20
LOOP:
MOVA,@R0
MOVX@DPTR,A
INCR0
INCDPTR
DJNZR7,LOOP
SJMP$
END
3-11试编写条件转移程序,当寄存器R3的内容分别满足下列条件时能转移到LOOP处执行程序,条件不满足时则停机。
(1)(R3)≥15⑵(R3)<15⑶(R3)≤15⑷(R3)>15
(1)(R3)≥15
cjneR3,#15,NEQ
sjmpL1
NEQ:
jncL1
sjmp$
L1:
loop
⑵(R3)<15
cjneR3,#15,NEQ
sjmpStop
jcL1
Stop:
sjmp$
⑶(R3)≤15
sjmpL1
jcL1
⑷(R3)>15
sjmpstop
stop:
3-12已知:
(SP)=53H,(PC)=37FEH,执行ACALL3A00H后堆栈指针SP、堆栈中内容以及程序记数器PC中的内容是什么?
(PC)=37FEH=0011011111111110B
执行ACALL3A00H(3A00H=0011101000000000)
PC高5位,3A00H低11位为:
0011001000000000=3200H
执行ACALL3A00H后堆栈指针SP、堆栈中内容以及程序记数器PC中的内容分别为:
(PC)=3200H(SP)=55H(54H)=00H(55H)=32H
第四章
4-1从20H单元开始存放一组带符号数,其数目已存在1FH单元。
要求统计出大于0、小于0和等于0的个数并存于ONE、TWO、THREE三个单元。
编程思路:
首先判断一下1FH单元内容是否为0,如果为0,什么都不做;
如果1FH单元内容不为零,初始化ONE、TWO、THREE,通过JZ判断是否为0,通过判断ACC最高位是否为1,来判断数是正是负,若最高位符号位为1说明是负数,否则为正数。
答案不唯一,参考程序如下:
ONEDATA10H;
大于0的个数
TWODATA11H;
小于0的个数
THREEDATA12H;
等于0的个数
MAIN:
CJNE1FH,#00H,START
SJMPSTOP
START:
MOVR0,#20H
MOVR7,1FH
MOVONE,#00
MOVTWO,#00
MOVTHREE,#0
JZZERO
JBACC.7,NEQ
INCONE
SJMPNEXT
NEQ:
INCTWO
SJMPNETX
ZERO:
INCTHREE
NEXT:
DJNZR7,LOOP
STOP:
SJMP$
END
4-2设:
自变量X为一无符号数,存放在内部RAM的VAX单元,计算出的函数值Y存放在FUNC单元,请编出满足如下关系的程序。
VAXDATA30H
FUNCDATA31H
MOVA,VAX
CJNEA,#50,NO50
SJMPNEXT
NO50:
JNCNEXTT
CJNEA,#20,NO20
SJMPYEQU5X
NO20:
JCYEQU2X
YEQU5X:
MOVB,#05
MULAB
YEQU2X:
RLA
MOVFUNC,A
4-3外部RAM从2000H到2100H有一数据块,请编出将它们传送到外部RAM3000H到3100H区域的程序。
2000H到2100H共有101H即257个数,将循环次数设成0,可以进行256次循环,2100H到3100H单独做一次即可。
MOVDPTR,#2000H
MOVP2,#30H
MOVR0,#00H
MOVR7,#00H
MOVXA,@DPTR
MOVX@R0,A
INCR0
INCDPTR
DJNZR7,LOOP
INCP2
MOVX@R0,A
4-4在内部RAM中,有一个以BLOCK为始址的数据块,块长在LEN单元。
请用查表指令编一程序,先检查它们若是16进制中的A~F,则把它们变为ASCII;
若不是,则把它们变为00H。
首先判断一下LEN单元的内容是否为0,如果块长为0,一次都不做,如果不做判断而块长为0的话,则多做256次循环。
既然用查表程序,我觉得可以把表做的巧妙一些,省的复杂的判断,提高程序的运行效率。
可以先判断一下,内容是否大于F,如果大于F也变0,所以可以把数取出来,做个与运算,与上0F0H,如果结果不为零,就说明高四位上有数,则应该变零,如果高四位上没数,只是低4位有数,则数的范围为0-F,所以做表的时候可以将0-9对应的表都设置成0,A-F对应其ASCII。
BLOCKDATA30H
LENDATA2FH
MOVR0,#BLOCK
MOVA,LEN
JZSTOP
MOVR7,A
MOVDPTR,#TAB
PUSHACC
ANLA,#0F0H
JZNEXT
MOVA,#0
SJMPNETX1
POPACC
NEXT1:
MOVCA,@A+DPTR
MOV@R0,A
TAB:
DB00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,’A’,’B’,’C’,’D’,’E’,’F’
第六章
6-1
8051单片机内部有四个8位并行I/O口,命名为P0、P1、P2、P3。
这4个并行I/O口都可以作准双向通用I/O口,即先执行一条指令MOV
P1,#0FFH。
P0、P2和P3口还有复用的第二功能。
每个口都包含一个(8位)锁存器(即特殊功能寄存器P0~P3),一个输出驱动器,和两个三态缓冲器。
P0口功能:
可作通用I/O口,是漏级开路的。
因此必须外接上拉电阻,以保证―1‖信号正常输出。
也可作为分时作为地址/数据总线使用。
P1口功能:
可作通用I/O口,也是一个―准双向‖口,作输入口时要先将输出驱动管截止。
p2口功能:
可用作通用I/O口,与P1口类似,也
可用作高8位地址总线。
P3口功能:
可用作通用I/O口,另外,还有其第二功能。
6-2
―读锁存器‖指令是P0~P3作目的操作数的指令,能实现―读—修改—写‖口锁存器的操作。
―读引脚‖指令的特点是:
P0~P3
作为源操作数出现在指令中,但在读引脚数据之前,必须对所读的口或口位的D锁存器写入―1‖。
要正确读引脚数据,必须先写一条MOV
PX,#0FFH指令或能对所读的口或口位的D锁存器写入―1‖的指令,而后紧接着写指令。
6-3
在单片机实时应用系统中,定时器/计数器有定时和对外部事件计数的功能,可用于定时控制、延时、对外部事件检测和计数等场合.定时是对周期已知的脉冲信号计数。
计数是对外部发生事件进行计数,对周期未知的外来脉冲信号计数。
采用可编程的定时器/计数器
可以方便灵活地修改定时或计数的参数或方式,与CPU并行工作,大大提高了CPU的工作效
率。
6-4
MCS-51单片机内部有2个16位的可编程的定时器/计数器:
定时器/计数器0(T/C0),定时器/计数器1(T/C1)。
定时方式下,T/C计数8051内部机器周期信号的个数
,由计数个数可以计算出定时时间。
每个机器周期使T/C的计数器增加1,直至计满回零后自动产生溢出中断请求,表示定时时间到。
计数方式下,T/C计数来自引脚T0(P3.4)和T1(P3.5)的外部脉冲信号的个数。
输入脉冲由1变0的下降沿时,计数器的值增加1直到回零产生溢出中断,表示计数已达预期个数。
6-5
MCS-51单片机的定时器/计数器共有四种工作方式:
方式0、1、2、3。
方式0是高8位和低5位的一个13位计数器的运行方式。
当TL1的低5
位溢出时,向TH1进位,而TH1溢出(回零)时向TF1标志进位(硬件置位TF1),并申请中断。
还可以通过查询TF1是否置位来判断TH1是否回零溢出。
方式1是一个16为定时器/计数器,结构几乎与方式0完全一样,唯一的差别是方式1中的TH1(TH0)和TL1(TL0)均是8位的,构成16位计数器。
方式2中,T/C被拆成一个8位的寄存器TH1(TH0)和一个8位计数器TL1(TL0),两者构成可以自动重装载的8位T/C。
每当它计满回零时,
一方面向CPU发出溢出中断请求,
另一方面从TH1(或TH0)中重新获得初值并启动计数;
也就是CPU
自动将TH1(或TH0)中存放的初值重新装回到TL1(或TL0),并在此初值的基础上对TL1(或TL0)开始新一轮计数,周而复始,直到下停止计数或更改工作方式命令为止。
方式3下T/C0和T/C1功能就不同了。
此时,TH0和TL0按两个独立的8位计数器工作,
T/C1只能按不中断的方式工作,常常利用它的定时功能作串行口波特率发生器。
T/C0方式3时,TL0占用了T/C0的C/T、GATE、TR0、TF0、T0(P3.4)和INT0控制引脚
。
TH0只有简单的内部定时功能,它占用了T/C1的TR1控制位和TF1中断标志位,其启动/关闭仅受TR1控制。
6-6
定时器/计数器用做定时时,定时时间与时钟的振荡频率和定时器/计数器的设定初值有关。
用做计数时,最高输入信号频率为振荡频率的1/24。
即计数周期=2机器周期。
6-7
在T/C0工作在方式3时,T/C1仍可设置为方式0~2。
由于TR1和TF1已被T/C0(TH0)占用,计数开关已被接通,此时仅用T/C1的C/T来切换其定时或计数工作方式就可使T/C1工作。
计数器(8位、13位或16位)回零溢出时,只能将输出送入串行口或用于不需要中断的场合。
一般情况下,当T/C1用作串行口波特率发生器时,T/C0才设置为工作方式3。
此时,常把T/C1设置为方式2用作波特率发生器。
6-8
T/C0的实际作用为计时,当达到106mS后中断
.
6-14
ORG
0000H
LJMP
START
001BH
;
TIMER1中断
TT1
1000H
START:
MOV
TMOD,#20H
8位自动重新装入
TH1,06H
装入初始值
TL1,06H
MOV
R2,#00H
用于统计250us的个数
SETB
P1.1
初始化P1.0
P1.0
SETB
EA
开放中断
ET1
TR1
SJMP
$
主程序踏步
TT1:
CPL
取反P1.1产生250us方波
INC
R2
计数值增一,统计250us的个数
CJNE
R2,#4,CONT
达到1s?
产生2ms方波
CLR
重新统计
CONT:
RETI
中断返回