《单片机原理与应用技术》(高惠芳版)习题参考答案:
第二章(p38)
习题
第(1)题:
MCS-51单片机芯片包含哪些主要功能部件?
8051单片机是个完整的单片微型计算机。芯片内部包括下列主要功能部件:
1)8位CPU;
2)4KB的片内程序存储器ROM。可
寻址64KB程序存储器和64KB外部数
据存储器;
3)128B内部RAM;
4)21个SFR;
5)4个8位并行I/O口(共32位I/O
线);
6)一个全双工的异步串行口;
7)两个16位定时器/计数器;
8)5个中断源,两个中断优先级;
9)内部时钟发生器。
第(4)题:MCS-51单片机的四个I/O口在使用上各有什么功能和特点?
1)P0口:8位双向三态端口,外接上拉电阻时可作为通用I/O口线,也可在总
线外扩时用作数据总线及低8位地址总线。
2)P1口:8位准双向I/O端口,作为通用I/O口。
3)P2口:8位准双向I/O端口,可作为通用I/O口,也可在总线外扩时用作高
8位地址总线。
3)P3口:8位准双向I/O端口,可作为通用I/O口,除此之外,每个端口还有
第二功能,比如有的端口用作串行通信口,有的端口用作外部中断信号输入口,有的
端口用作计数脉冲输入引脚,有的端口用
作读/写控制线。实际应用中常使用P3口
的第二功能。
第(5)题:MCS-51单片机的存储器分那几个空间?作用是啥?
8051存储器包括程序存储器和数据存储器,从逻辑结构上看,可以分为三个不同的空间:
1)64KB片内片外统一编址的程序存储器地址空间,地址范围:0000H~FFFFH,对于8051单片机,其中地址0000H~0FFFH
范围为4KB的片内ROM地址空间,
1000H ~ FFFFH为片外ROM地址空间;2)256B的内部数据存储器地址空间,地
址范围为00H~FFH,对于8051单片机,
内部RAM分为两部分,其中地址范围00H ~ 7FH(共128B单元)为内部静态RAM 的地址空间,80H~FFH为特殊功能寄存器的地址空间,21个特殊功能寄存器离散地分布在这个区域;对于8052系列单片机还有地址范围为80H~FFH的高128B的静态RAM。
3)64KB的外部数据存储器地址空间:地址范围为0000H~FFFFH,包括扩展I/O端口地址空间。
第(6)题:RAM内包含哪些可位寻址单元?
片内RAM中,20H~2FH是位寻址区,共16个单元,每个单元的每一位都有地址,位地址范围是00H~7FH,共128位可寻址位。
第(7)题:堆栈?SP的作用?为何要对SP重新赋值?
1)堆栈是一种数据结构,是只允许数据在其一端进出的一段存储空间;为程序调用和中断操作而设立,用作现场保护和断点保护。
2)堆栈指针SP用来存放堆栈的栈顶地址。
3)复位后,SP的初值为07H,由于片内RAM的07H单元的后继区域分别为工作寄存器区和位寻址区,通常这两个区域在程序中有其它重要用途,所以用户在设计程序时,一般都将堆栈设在内部RAM的
30H~7FH地址空间的高端区域,而不设在工作寄存器区和位寻址区。
第(10)题:振荡周期、时钟周期、机器
周期、指令周期?
1)振荡周期是指为单片机提供脉冲信号的振荡源的周期,是单片机最基本的时间单位。通常由外接晶振与内部电路来提供振荡脉冲信号,其频率记为,此频率
OSC f 的倒数即是振荡周期。
2)振荡脉冲经过二分频后就是单片机的时钟信号,时钟信号的周期称为时钟周期,又定义为状态,用S 表示。时钟周期是振荡周期的二倍。
3)机器周期是指令执行过程中完成某一个基本操作所需的时间。一个机器周期等于
12个振荡周期。即
。OSC M f
T 12
4)指令周期是指执行一条指令所需要的时间,根据指令不同,可包含1、2、4个机器周期。
第(13)题:开机复位后,单片机使用的是哪组工作寄存器?其地址是啥?如何改变当前工作寄存器组?
开机复位后,单片机使用的是第0组工作寄存器。它们的地址范围是00H ~07H 。对PSW 寄存器的RS0、RS1两位的置位或复位即可改变单片机当前使用的工作寄存器组。
第三章 (p66)
2、MCS-51单片机有哪几种寻址方式?各有什么特点?寻址范围是什么?MCS-51单片机有7种寻址方式。
(1)立即寻址。操作数直接在指令中给出,它可以是二进制、十进制、十六进制数,也可以是带单引号的字符,通常把这种操作数称为立即数,它的寻址范围就是指令本身所在的程序存储单元。
(2)直接寻址。在指令中直接给出存放操作数的内存单元的地址。寻址范围为:内部RAM 低128字节单元,特殊功能寄存器。(3)寄存器寻址。指令中给出的是操作数
所在的寄存器。寻址范围为:4组工作寄存器(R0 ~ R7),部分特殊功能寄存器,如A 、B 、DPTR 。
(4)寄存器间接寻址。存放操作数的内存单元的地址放在寄存器中,指令只给出寄存器(包括Ri 和DPTR ),寄存器名称前加
“@”前缀标志。寻址范围:地址范围从00 ~ FFH 的全部内部RAM 单元,包括堆栈区,但不包括特殊功能寄存器,以及地址范围从0000 ~ FFFFH 的全部片外RAM 。
(5)变址寻址。将基址寄存器与变址寄存器的内容相加,结果作为操作数的地址。变址寻址主要用于查表操作。寻址范围:64KB 的程序存储空间。
(6)相对寻址。指令中给出的操作数是程序相对转移的偏移量。偏移量是一个带符号的单字节数,范围为-128 ~ +127。
(7)位寻址。操作数是位地址。寻址范围:内部RAM 位寻址区共128位(位地址:00 ~ 7FH ),11个特殊功能寄存器中的可寻址位(对于8051,有83位)。
3、对片内RAM 可以用哪几种寻址方式?对片外RAM 可以用哪几种寻址方式?对片内RAM 的工作寄存器区(00 ~ 1FH )可以用直接寻址、寄存器寻址和寄存器间接寻址;位寻址区(20 ~ 2FH )可以用直接寻址、寄存器间接寻址和位寻址;用户RAM 区(30 ~ 7FH )可以用直接寻址、寄存器间接寻址;内部RAM 的高128B (80 ~ FFH )只能用寄存器间接寻址;内部RAM 的特殊功能寄存器区(80 ~ FFH )用直接寻址。
对于片外RAM ,可以通过寄存器Ri 进行256B 的分页间接寻址或通过DPTR 进行64KB 范围的寄存器间接寻址。
4、对片外RAM 单元的寻址中,用Ri 间接寻址与用DPTR 间接寻址有啥区别/对片外RAM 单元寻址时,可用Ri 进行分页间接寻址,亦即只能在当前页面内间接寻址,页面大小为256个字节,页面地址由特殊功能寄存器P2决定;也可用DPTR 进行间接寻址,寻址范围为64K 字节,即256个页面内的任一单元均可寻址。
5、指出下列指令操作数的寻址方式?
①立即寻址MOV A,#00H
②直接寻址MOV A,50H
③寄存器间接寻址MOV A,@R0
④寄存器寻址MOV A,R5
⑤变址寻址MOV A,@A+DPTR
⑥相对寻址SJMP 70H
⑦直接寻址或寄存器寻址CLR A
11、①ANL A,#0FCH累加器A的低2位清零,其余位不变;
②ORL A,#0C0H累加器A的高2位置1,其余位不变;
③XRL A,#0F0H累加器A的高4位取反,其余位不变;
④XRL A,#55H累加器A的第0、2、4、6位取反,其余位不变;
12、已知
A=78,R1=78H,B=04H,CY=1,片内RAM78H=0DDH,80H=6CH,试分别写下列指令执行后单元的结果和相应标志位的值。
①(A)=55H,CY=1,ADD A,@R1
②(A)=0,CY=0,SUBB A,#77H
③(B)=01H,(A)
=0E0H,CY=0MUL AB
④(A)=1EH,(B)=0,CY=0,DIV AB
⑤(78H)=58H,CY=1,ANL 78H,#78H
⑥(A)=7FH,CY=1,ORL A,#0FH
⑦(80H)=14H,CY=1,XRL 80H,A
13、写出下列指令的执行成果。
MOV A,#7FH
CPL A
RR A
SWAP A
(A)= 4 或4H 或04H
18、编程:在外部数据存储器首地址为TABLE的数据表中存有10B的数据,编程将每个字节的最高位置1,并返回原来的单元
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:MOV DPTR, #TABLE
MOV R0, #10
LOOP:MOVX A, @DPTR
ORL A, #80H 或SETB ACC.7
MOVX @DPTR, A
INC DPTR
DJNZ R0, LOOP
SJMP $
END
第四章(p95)
第(2)题编程:设内部RAM 5AH单元中有一个变量X,轻编写计算下属函数式的程序,结果存入5BH单元。Y=X2+8
X2-1
41
ORG 0000H
LJMP START
ORG 0100H
START:CLR C
MOV A, 5AH
SUBB A, #10
JC LOWER10
CLR C
MOV A, 5AH
CJNE A, #15, IFL15
BE1015: MOV A, 5AH
MOV B, A
MUL AB
ADD A, #8
AJMP SAVE
IFL15:JNC LARGE15
SJMP BE1015
LOWER10:MOV A, 5AH
MOV B, A
MUL AB
DEC A
AJMP SAVE
LARGE15: MOV A, #41
SAVE: MOV 5BH, A
SJMP $
END
第(10)题编程在以2000H为首地址的存储区中,存放着20个用ASCII吗表示的0-9的数。试编程将他们转化为BCD吗,并以压所BCD吗的形式存放在3009H单元中。
ORG 0000H
LJMP START
ORG 0100H
START:MOV DPTR, #2000H
MOV R2, #10
MOV R0, #00H
MOV P2, #30H
LOOP:MOVX A, @DPTR
SUBB A, #30H
MOV R3, A
INC DPTR
MOVX A, @DPTR
SUBB A, #30H
SWAP A
ADD A, R3
MOVX @R0, A
INC DPTR
INC R0
DJNZ R2, LOOP
SJMP $
END
第6章(p195)
第(1)题
参考答案:
①什么是中断?单片机正常工作时,按
用户程序逐条执行指令,如果系统中出现
某些急需处理的事件,CPU暂时终止当前的程序,转而去执行服务程序,以对发生
的更紧迫的事件进行处理,待服务程序结
束后,CPU自动返回原来的程序继续执行,这个过程就称为中断。
②有几个中断源?MCS-51单片机有5个中断源:外部中断0、定时/计数器T0的溢出中断、外部中断1
、定时/计数器T1的溢出中断、串行口收发中断,对应的中断请求标志为IE0、TF0、IE1、TF1、TI/RI。
③如何提出中断?中断源产生中断信号后,中断系统把相应的中断标志置位,在中断允许的前提下,由中断标志触发中断请求。
④单片机如何进行中断响应?中断响应过程:第一步,对于外部中断,需要由CPU 采样外部中断请求信号,若采样到后,把相就的中断请求标志置位;第二步,查询各个中断标志位;第三步,进行中断响应,由硬件自动生成一条长调用指令“LCALL #addr16”进行断点保护后转向中断服务程序。
第(2)题MCS51的中断源中,哪些中断请求信号在中断响应是可自动清除?那些不能?不能的如何处理?
参考答案:
在中断响应时,可以自动清除的中断请求信号有:①定时/计数器的溢出标志
TF0/TF1;②脉冲方式的外部中断请求
IE0/IE1;
在中断响应时,不能自动清除的中断请求信号有:①电平方式的外部中断请求,处理方法:中断响应后通过软硬件结合的方法把输入端的低电平强制改成高电平,再软件清IE0/IE1。②串行中断,处理方法:中断响应后,在中断服务程序中查询
RI/TI,以确定是接收中断还是发送中断,查询以后由指令(即软件方法)对RI/TI清零。
第(3)题8051中断优先级有几级?在形成中断嵌套时各级有何规定?
参考答案:
8051单片机的中断优先级有高低两个优先级。
在形成中断嵌套时,低优先级中断请求不能打断高优先级的中断服务。高优先级中断请求可以打断低优先级的中断服务,从而实现中断嵌套。如果一个中断请求已被响应,则同级的中断请求将被禁止,即同
级中断不能嵌套。如果同级的多个中断请求同时出现,则由单片机内部硬件查询,按自然响应顺序确定响应哪个中断请求。各个中断源自然响应的先后顺序为:外部中断0,定时/计数器T0,外部中断1,定时/计数器T1中断,串行口中断。
第(4)题MCS51响应中断后,各中断入口地址是啥?
参考答案:
外部中断0入口地址:0003H
定时/计数器T0中断入口地址:000BH
外部中断1入口地址:0013H
定时/计数器T1中断入口地址:001BH
串行口中断入口地址:0023H
第(7)题定时计数器的四中工作方式各自的技术范围?如果要计10个单位不同方式的初值是啥?
参考答案:
定时/计数器四种工作方式各自的计数范围为:方式0 213
方式1 216
方式2、3 28
如果要计10个单位,计数器的初值为:方式0:X=213-10=8182=1FF6H
THx=FFH
TLx=16H
(x为0或1,对应T0或T1,下同)
方式1:X=216-10=65526=FFF6H
THx=FFH
TLx=F6H
方式2:X=28-10=246=F6H
THx=F6H
TLx=F6H
方式3:X=28-10=246=F6H
只对T0有效
TH0=F6H
TL0=F6H
第(9)题已知振荡频率12MHZ,用定时计数器T0,实现从P2.0产生周期为100ms的方波,用汇编和C语言编程
参考答案1:用中断方式实现
//从P2.0引脚输出周期为100ms的方波//由定时器T0产生50ms的定时
//T0工作于方式1可以实现50ms的定时//X=65536-50/0.001=15536=3CB0H
#include <reg51.h>
sbit p2_0 = P2^0;
void main(void)
{
TMOD=0X01;
EA=1;
ET0=1;
TH0=(65536-50000)/256;
//TH0=0x3C;
TL0=(65536-50000)%256;
//TL0=0xB0;
TR0=1;
while(1);
}
void timer0(void) interrupt 1 using 1
{
TH0=(65536-50000)/256;
//TH0=0x3C;
TL0=(65536-50000)%256;
//TL0=0xB0;
p2_0=!p2_0;
}
参考答案2:
不用中断方式,用查询方式实现
//从P2.0引脚输出周期为100ms的方波//由定时器T0产生50ms的定时
//T0工作于方式1可以实现50ms的定时//X=65536-50/0.001=15536=3CB0H
#include <reg51.h>
sbit p2_0 = P2^0;
void main(void)
{
TMOD=0X01;
TH0=(65536-50000)/256;
//TH0=0x3C;
TL0=(65536-50000)%256;
//TL0=0xB0;
TR0=1;