第三章习题与思考题
1.89c2051单片机能提供几个中断源、几个中断优先级?各个中断源的优先级怎样确定?在同一优先级中,各个中断源的优先顺序怎样确定?试通过修改IP寄存器,使串行口中断优先级最高,定时器T1的中断优先级最低,其余中断优先顺序不变。
2.89c2051单片机外部中断源有负电平触发和下边沿触发两种触发方式,这两种触发方式所产生的中断过程有何不同?怎样设定?
3.在一个应用系统中,时钟频率为12MHz,一个外部中断请求信号的宽度为300ns的负脉冲,应该采样哪种触发方式?如何实现?
4.89c2051单片机响应中断请求后,哪些中断请求标志位不能自动清除?CPU在什么时候查询中断请求标志位?满足什么条件才响应?
5.如果某一中断服务程序中没有改写工作寄存器R0~R7的指令,则进入中断服务程后,是否需要切换工作寄存器区?简述原因。
6.用89c2051的P1口接8个LED发光二极管,由INT0接一消抖开关,开始P1.0的LED亮,以后每中断一次,下一个LED亮,顺序下移,且每次只有一个LED亮,周而复始,画出电路并编写程序。
7.在上题电路的基础上,要求8个LED同时亮或同时灭,每中断一次,变反一次,编写程序。
习题解答
1.答:有5个中断源,2个中断优先级。
在同一优先级中,各个中断源的优先顺序:外部中断0 定时器/计数器T0溢出中断 部中断1 定时器/计数器T1溢出中断 串行口中断
中断源 外部中断0 定时器/计数器T0溢出中断 外部中断1 定时器/计数器T1溢出中断 串行口中断 最低 IP=0x10;
2.答:对边沿触发的外部中断,CPU响应中断后,硬件会自动清除中断请求标志IE0和IE1
对负电平触发的外部中断,CPU响应中断后,硬件不会自动清除中断请求标志IE0和IE1,需要用硬件线路和软件相互配合来清零。
IT0和IT1为0时外部中断为负电平触发,IT0和IT1为1时外部中断为下边沿触发。
1
外
同一级的中断优先级 最高
3.答:应采样边沿触发方式,因为fosc=12M,Tm=1μs,所以外部中断请求信号可直接至P3.2或P3.3即可。
4.答:对负电平触发的外部中断,CPU响应后硬件不会自动清除中断请求标志IE0和IE1,
需要用硬件线路来清零。对串行口中断,CPU响应后,中断标志位不会自动清除,必须用软件清除。
若CPU关闭中断,但外部事件又有中断申请或定时时间到或串行口发送/接受完一帧数据,则采用查询中断请求标志位的方式来编写控制程序。
在中断请求和初始化后,CPU响应中断的条件:(1)有中断请求信号。(2)CPU开中断。(3)没有高级或同级中断服务程序在执行。(4)当前执行指令完毕或不是执行对IE、IP的操作。
5.答:不用,因为主程序对R0—R7中所写的内容在中断服务程序没有被改写,也就是说,在中断服务程序中不会用到R0—R7,所以不用切换工作寄存器。
6.答:电路图略
#include”reg51.h” sbit P32=P3^2;
void int0(void) interrupt 0 using 1 {if(P1!=0x00) P1=P1<<1; Else
P1=0x01; }
main() {
P1=0x01; EA=1; EX0=1; IT0=1; while(1); }
7.答:#include”reg51.h”
sbit P32=P3^2;
void int0(void) interrupt 0 using 1 {
P1= ~P1; } main() {
P1=0xff; EA=1;
2
EX0=1; IT0=1; while(1);
}
第四章习题与思考题
1.89c2051单片机的定时/计数器做定时器用时,其定时时间与哪些因素有关?作计数器时,对外界计数频率有何限制?定时器作定时和计数时,其计数脉冲分别由谁提供?
2.如果89c2051单片机的系统晶振频率为12MHz,分别指出定时/计数器方式1和方式2最长定时时间。
3.若要求89c2051单片机的定时/计数器的运行控制完全由TR1、TR0确定和完全由P3.5、P3.4引脚的控制时,其初始化编程应作何处理?
4.89c2051单片机的定时/计数器T0已预制为FFFFH,并选定于方式1的计数方式,问此时定时/计数器T0实际用途将是什么?
5.由89c2051单片机的P1口控制8个指示灯,利用定时/计数器T0产生定时时钟。编一个程序,使8个指示灯依次点亮,点亮频率为1Hz,当8个指示灯全亮后,则全部熄灭,依次循环。
6.89c2051单片机系统,时钟频率为12MHz,定时/计数器T0用于20ms定时,定时/计数器T1用于100次计数,两者均要求重复工作,试编写达到上述要求的程序。
7.用p1.0输出1KHz和500Hz的音频信号驱动扬声器,作为报警信号,要求1KHz信号响100ms,500Hz信号响200ms,交替进行,P1.7接一个接近开关进行控制,当开关合上响报警信号,当开关断开报警信号停止,编出程序。
8.试用89c2051单片机的定时/计数器T1对外部事件计数。要求每计数100,就将T1改成定时方式,控制P1.7输出一个脉宽为10ms的正脉冲,然后又转为计数方式,如此反复循环。设晶振频率为24MHz。
习题解答
1.答:定时时间主要由计数初值、机器周期(即晶振频率)确定。作为计数器用时,外界的最高计数频率不高于fosc/24。定时器作定时用时,其计数脉冲由晶振频率经12分频后提供;定时器作计数用时,其计数脉冲由外部事件(脉冲)提供。
3
2.答:方式1的最长定时时间为32768μs。
方式2的最长定时时间为128μs。
3.答:当89c2051单片机的定时/计数器的运行控制完全由TR1、TR0控制时,定时/计数器应工作于非门控方式,即设置TMOD时,GATE位应取0;当89c2051单片机的定时/计数器的运行控制完全由P3.5、P3.4引脚控制时,定时/计数器应工作于门控方式,即设置TMOD时,GATE位应取1。
4.答:当定时/计数器工作于方式1计数方式时,且初值设置为FFFFH时,则每来一个事件,定时/计数器将产生溢出,向CPU申请中断,此时定时/计数器T0实际用途为监测外部事件。
5.答:频率为1HZ,周期为1S。 P1=0x01;
#include
F0=1;
unsigned char i;
while(F0); void timer(void) interrupt 1 using
1 P1=0x07;
{
F0=1;
i++;
while(F0); if(i==20)
P1=0x07; {
i=0;
FO=0; }
TH0=(65536-50000)/256; TL0=(65536-50000)%6 }
Main() {
P1=0x01; TM0D=0x01; EA=1; ET0=1; TR0=1; F0=1;
TH0=(65536-50000)/256; TL0=(65536-50000)%6 while(1) { P1=0x00; while(F0);
4
F0=1; while(F0); P1=0x0F; F0=1; while(F0); P1=0X1F; F0=1; while(F0); P1=0x3F; F0=1; while(F0); P1=0x7F; F0=1; while(F0); P1=0xff; F0=1; }