《单片机原理及应用—基于Proteus和Keil C》 课后答案习题解答 下载本文

外部中断0,定时器T0,外部中断1,定时器T1,串行口五个中断源的中断向量地址依次为:0003H,000BH,0013H,001BH,0023H。

3.MCS-51中断的中断响应条件是什么? 答:(1) 中断源有中断请求;

(2) 此中断源允许位为1,即中断源可以向CPU发中断请求; (3) CPU开总中断,即EA=1; (4) 无同级或者更高级中断正在服务 4.MCS-51的中断响应过程是怎样的?

答:(1) 将相应的中断优先级状态触发器置1,以阻断后来的同级和低级中断请求; (2) 由硬件清除相应的中断请求标志,串行口的发送和接收中断除外;

(3) 执行一条硬件LCALL指令,即把程序计数器PC的内容压入堆栈保存,再将相应的中断服务程序的入口地址送入PC;

5.编写出外部中断1为下跳沿触发的中断初始化程序。 解:

void Int1_init(){ }

6.有一外部中断源,接入 端,当其中有中断请求时,要求CPU把一个从内部RAM 30H单元开始的50个字节的数据块传送到外部RAM从1000H开始的连续存储区。请编写对应的程序。 解:

7.设fosc = 12MHz,利用定时器,TO(工作在方式2)在P1.1引脚上获取输出周期为O.4ms

#include void main(){ }

void intx0() interrupt 0 using 1{ char * ptr1=0x30; char xdata * ptr2=0x1000; for(i=0;i<50;i++) *ptr2++=*ptr1++; }

IT0=1 ; EX0=1; while(1) ;

IT1=1; EA=1;EX1=1;

//IE=0x84;// IE|=0x84;

EA=1;

的方波信号,定时器溢出时采用中断方式处理,请编写,T0的初始化程序及中断服务程序。 解:fosc = 12MHz,则机器周期=1us;当T0工作在方式2时,其最大定时时间为256us,要输出周期为0.4mS即400us的方波信号,则其高、低电平应各为200us,显然当定时器T0按方式2工作时,只需计数达到200次即可,因此其时间常数初值为256-200=56。在T0的中断服务程序中,只需将P1.1引脚求反即可。 #include sbit P1_1=P1^1;

void timer0()interrupt 1 using 1{ P1_1=!P1_1; }

void main(){ P1_1=0; TMOD=0x02; TH0=56; TL0=56; IE=0x82; TR0=1; for(;;){} }

8.设fosc = 6MHz,要求每隔50ms,从内部RAM以30H开始的数据存储区传送一个字节数据到外部RAM以2000H开始的连续存储区,共传送50个数据。要求:采用定时器T1以方式2实现定时,数据传送在中断服务程序中完成。

解:fosc = 6MHz,机器周期=12/6*10-6S=2us,T1工作在方式2时,最大定时时间为512us,要定时50ms,可以计数100次,每次定时500us来实现,方式2定时500us需计数250次,故其时间常数为256-250=6。 #include char intcnt=0; char movcnt=0; char * ptr1=0x30; char xdata *ptr2=0x2000; void timer1()interrupt 3 using 1{

intcnt++; if(intcnt==100){

if(mocnt<50){ *ptr2++=*ptr1++; movcnt++;

}

}

}

else EX1=0; intcnt=0;

void main(){ TMOD=0x20; TH1=6; TL1=6; IE=0x84; TR1=1; for(;;){} }

9.805l单片机只有两个外部中断源,若要扩展成8个外部中断源,请画出实现这种扩展的硬件线路图,并说明如何确定各中断源的优先级。

解:用按钮开关模拟中断源的中断请求,INT0单独作为一个中断源,INT1扩展成7个中断源,有中断请求时,借助于P2口识别是这七个中断源是哪个请求中断,为了验证正确性,如果是INT0中断,则在P0口的数码管上显示0,是INT1中断,则根据从上到下是哪个中断源在P0口的数码管上显示1—7。具体电路和程序如下:#include char led_mod[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07};

void INT0_srv (void) interrupt 0 using 1 //外部中断0处理程序 {

P0=led_mod[0]; }

void INT1_srv (void) interrupt 2 using 2 //外部中断1处理程序 {

char intnum; intnum=P2; switch(intnum){

case 0xfe:P0=led_mod[1];break; } }

case 0xfd:P0=led_mod[2];break; case 0xfb:P0=led_mod[3];break; case 0xf7:P0=led_mod[4];break; case 0xef:P0=led_mod[5];break; case 0xdf:P0=led_mod[6];break; case 0xbf:P0=led_mod[7];

void main(){ EA=1; EX0=1; EX1=1; P0=0; while(1); }

第6章 单片机的定时器/计数器 习题

1.MCS-51系列的8051单片机内有几个定时/计数器?每个定时/计数器有几种工作方式?如何选择?

答:MCS-51系列的8051单片机内有2个定时/计数器,即T0和T1,每个都可以编程为定时器或计数器,T0有四种工作方式(方式0—13位、方式1—16位、方式2-可自动装入初值的8位、方式3-两个8位),T1有三种工作方式(与T0相同的前三种),通过对TMOD的设置选择,其高四位选择T1,低四位选择T0。

2.如果采用的晶振频率为3MHz,定时/计数器TO分别工作在方式0、1和2下,其最大的定时时间各为多少?

答:如果采用的晶振频率为3MHz,机器周期为12×1/(3*106)=4us,由于定时/计数器TO工作在方式0、1和2时,其最大的计数次数为8192、65536和256所以,其最大定时时间分别是:方式0为8192×4us=32.768ms、方式1为65536×4us=262.144ms、方式2为256×4us=1024us。

3.定时/计数器TO作为计数器使用时,其计数频率不能超过晶振频率的多少?

答:由于定时/计数器TO作为计数器使用时,是对外部引脚输入的脉冲进行计数, CPU在每个机器周期采样一次引脚,当前一次采样为高电平,后一次采样为低电平,则为一次有效计数脉冲,所以如果晶振频率为fosc,则其采样频率fosc/12,两次采样才能决定一次计数有效,所以计数频率不能超过fosc/24。

4.简单说明定时/计数器在不同工作模式下的特点。

答:方式0为13位的定时/计数器,由THx的8位和TLx的低5位构成、方式1为16位的定时/计数器,由THx的8位和TLx的8位构成,方式2为8位的定时/计数器,TLx为加1计数器,THx为计数初值寄存器。方式3只能用于T0,是将T0的低8位用作一个独立的定时/计数器,而高8位的TH0用作一个独立的定时器,并借用T1的TR1和TF1作为高8位定时器的启停控制位和溢出标志位。

5.定时器工作在方式2时有何特点?适用于什么应用场合?

答:定时器工作在方式2时是一个可自动装入时间常数初值的8位定时/计数器,TLx为加1计数器,THx为计数初值寄存器。由于其恢复初值由硬件自动完成,所以当需要反复计数时,用方式2可以方便地实现精确的定时。

6.一个定时器的定时时间有限,如何采用两个定时器的串行定时来实现较长时间的定时? 答:一个定时器的定时时间有限,可采用两个定时器的串行定时来实现较长时间的定时,比