当前位置:文档之家› 单片机原理与应用及C51程序设计第5章习题答案

单片机原理与应用及C51程序设计第5章习题答案

第5章习题答案5-1 什么叫中断系统?中断系统的功能是什么?什么是中断嵌套?答:当CPU正在执行主程序时,外部或内部发生的某一事件(如某个引脚上电平的变化、一个脉冲的发生或计数器的计数溢出等)请求CPU迅速处理,CPU暂时中断当前程序的执行而转去执行相应的处理程序,待处理程序执行完毕后,CPU再继续执行原来被中断的程序,这样的过程称为中断。

功能:中断系统是为使CPU 具有对单片机外部或内部随机发生的事件进行实时处理而设置的。

中断嵌套:8051设置了两级中断优先级,低优先级中断请求不能打断高优先级的中断服务;但高优先级中断请求可以打断低优先级的中断服务,从而实现中断嵌套。

5-2 MCS-51型单片机各中断源的中断标志是如何产生的?又是如何清除的?CPU响应中断时,中断入口地址各是多少?答:见p133;.或端出现有效中断请求时,IE0 IE1)位由硬件置“1”。

当中断响应当CPU采样到IE0IE1完成转向中断服务程序时,由硬件把IE0(或IE1)清零。

TF0和TF1——计数溢出标志位,当计数器产生计数溢出时,相应的溢出标志位由硬件置“1”。

当转向中断服务时,再由硬件自动清“0”。

TI:串行发送中断标志。

CPU将数据写入发送缓冲器SBUF时就启动发送,每发送完一帧后,硬件将TI置位,必须由软件清0.RI:串行接收中断标志。

串口允许接收时,每接收完一帧后,硬件将RI置位,必须由软件清0.地址分别为:0003H,000bH0013H,001BH,0023H5-3:在MCS-51型单片机中,哪些中断标志可以在响应自动撤除。

见第二题,也可见P136;5-4答:见p136.5-5:解:PX1=1;IT1=0;PT1=0;PS=1;EA=1;ES=1;ET1=1;EX1=1;ET0=0;EX0=0;5-6解:两个,它由模式设置寄存器TMOD,中断控制寄存器IE,中断优级级寄存器IP,中断标志寄存器TCON组成5-8 请叙述TMOD=A6H所代表的含义。

答:A6H=10100110,其表示定时器0工作与方式2,为计数方式。

定时器1工作与方式2,为定时方式,首席门控信号Gate=1,只有INT1引脚和TR1同时为1时,定时器/计数器才开始工作,主要用于测量INT引脚上高电平脉冲的宽度。

5-9利用MCS-51型单片机的定时器测量某正脉冲宽度时采用何种工作方式可以获得最大的量程?若系统时钟频率为6MHz那么最大允许的脉冲宽度是多少?答:使用工作方式2(16进制计数方式),其计数值最大为65536*机器周期若系统时钟为6MHz,那么最大允许的脉冲宽度为65536*2us=131072us5-10 定时器/计数器用作定时器时,其定时时间与哪些因素有关?作计数器时对外计数频率有何限制?答:其定时时间与时钟频率,工作模式,初始化值有关。

作计数器时对外计数时外部频率不能小于单片机本身的机器周期的倒数(即应小于计数器的计数值至少为1),应该大于机器周期的1/65536(即不能溢出)。

5-11单片机用内部定时方法产生频率为20kHz的方波,设单片机晶振频率为12MHz,请编程实现。

解:20kHz的方波,其周期为50us,高电平为25us,低电平为25us.#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit P1_0 = P1^0;void main(void){EA = 1; //允许CPU中断ET0= 1; //定时器0中断打开P0_0=1;TMOD = 0x01; //设定时器0为模式1,16位模式TH0=0xff;TL0=0xf3; //设定时值为0.025ms(25us),0xe7+12While(1);}void Time0(void) interrupt 1 using 1{TH0=0xffTL0=0xf3;P1_0=!P1_0;}5-12 使用定时器0以定时方法在P1.0输出周期为400us,占空比为20%的矩形脉冲,设单片机晶振为12MHz.解:周期为400us,占空比为20%,则高电平持续时间为400*20%=80us,低电平为320us,则可以使用定时为80us方式,以i为计数值,当i从0变到1时,为高电平,当i属于(1,4)时为低电平。

#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit P1_0 = P1^0;uchar i;void main(void){EA = 1; //允许CPU中断ET0= 1; //定时器0中断打开i=0;P0_0=1;TMOD = 0x02; //设定时器0为模式2,8位自动重载方式TH0=0xb0;TL0=0xb0; //设定时值为80us,(考虑加上了12us的修正值)while(1);}void Time0(void) interrupt 1 using 1{if (i==0){P1_0=1;}Else{P1_0=0;}i++;if (i==5){i=0;}}5-13 简述串行中的发送和接收数据的过程解:发送过程:发送控制器送出移位信号,使发送移位寄存器的内容右移一位。

直至最高位(D7位)数字移出后,停止发送数据和移位时钟脉冲。

完成了发送一帧数据的过程,并置TI为1。

就申请中断。

若CPU响应中断,则从0023H单元开始执行串行口中断服务程序。

接收过程:在机器周期的S6P2时刻,接收控制器向输入移位寄存器写入11111110,并使移位时钟由TXD端输出。

从RXD端(P3.0引脚)输入数据,同时使输入移位寄存器的内容左移一位,在其右端补上刚由RXD引脚输入的数据。

这样,原先在输入移位寄存器中的1就逐位从左端移出,而在RXD引脚上的数据就逐位从右端移入。

当写入移位寄存器中的最右端的一个0移到最左端时,其右边已经接收了7位数据。

这时,将通知接收控制器进行最后一次移位并把所做收的数据装入SBUF。

在启动接收过程开始后的第10个机器周期的S1P1时刻,SCON中的RI位被置位、从而发出中断申请。

至此,完成了一帧数据的接收过程。

5-15 流水灯程序解:#include <reg52.h>#define uchar unsigned char#define uint unsigned intuint LEDFlow[]={0xfe,0xfd,0xfb,0x7f, 0xbf, 0xdf, 0xef,0xfeff,0xfdff,0xfbff,0x7fff, 0xbfff, 0xdfff, 0xefff };void second(uchar sec){while(sec--){for(i=10;i>0;i--)for(j=200;j>0;j--)for(k=248;k>0;k--)}}void main(){uchar i=0;while(1){second(1);P1= LEDFlow[i];i++;if (i>15)i=0;}}使用定时器方式#include <reg52.h>#define uchar unsigned char#define uint unsigned intuint LEDFlow[]={0xfffe,0xfffd,0xfffb,0xff7f, 0xffbf, 0xffdf, 0xffef,0xfeff,0xfdff,0xfbff,0x7fff, 0xbfff, 0xdfff, 0xefff }; uchar i,Mscond;void main(void){EA = 1; //允许CPU中断ET0= 1; //定时器0中断打开i=0;Mscond=0;TMOD = 0x01; //设定时器0为模式1,16位模式TH0=0x3c;TL0=0xbc; //设定时值为50ms,(考虑加上了12us的修正值)TR0=1;while(1);}void Time0(void) interrupt 1 using 1{TH0=0x3c;TL0=0xbc; //设定时值为50ms,(考虑加上了12us的修正值)Mscond++;If (Mscond>=20) //1秒时间到{Mscond=0;P1= LEDFlow[i];i++;if (i>15)i=0;}}5-16解:基本实现与15题相似#include <reg52.h>#define uchar unsigned charuchar LEDFlow[]={0xfe,0xfd,0xfb,0x7f, 0xbf, 0xdf, 0xef}; void Delay50ms(uchar ms){uchar j,k;while(ms--){for(j=100;j>0;j--)for(k=248;k>0;k--)}}void main(){uchar i=0;while(1){Delay50ms (5);P1= LEDFlow[i];i++;if (i>7)i=0;}}使用定时器方式#include <reg52.h>#define uchar unsigned char#define uint unsigned intuchar LEDFlow[]={0xfe,0xfd,0xfb,0x7f, 0xbf, 0xdf, 0xef}; uchar i;void main(void){EA = 1; //允许CPU中断ET0= 1; //定时器0中断打开i=0;TMOD = 0x01; //设定时器0为模式1,16位模式TH0=0x3c;TL0=0xbc; //设定时值为50ms,(考虑加上了12us的修正值)TR0=1;while(1);}void Time0(void) interrupt 1 using 1{TH0=0x3c;TL0=0xbc; //设定时值为50ms,(考虑加上了12us的修正值)If (Mscond>=5) //1秒时间到{Mscond=0;P1= LEDFlow[i];i++;if (i>7)i=0;}}。

相关主题