《MCS51单片机讲义C语言编程,清华大学出版社第四章.doc》由会员分享,可在线阅读,更多相关《MCS51单片机讲义C语言编程,清华大学出版社第四章.doc(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第四章 MCS-51系列单片机的中断系统中断系统是为使CPU具有对单片机外部或内部随机发生的事件的实时处理而设置的。MCS-51片内的中断系统能大大提高MCS-51单片机处理外部或内部的能力。4.1 中断的概念单片机处理外部或内部事件有两种方式:程序查询方式和中断方式。程序查询方式是单片机对外部或内部事件的处理时,CPU不断查询是否有事件发生。采用程序查询方式,CPU不能在做别的事,而是大部分时间处于等待状态。单片机都具有实时处理功能,能对外部或内部发生的事件做出及时的处理,这靠中断技术实现。中断方式是当CPU正在处理某件事情(如正在执行主程序)的时候,外部或内部发生的某一事件(如计数器的计数
2、溢出等)请求CPU迅速去处理,于是CPU暂时中止当前的工作,转去处理所发生的事件。中断服务处理程序处理完该事件后,再回到原来被中止的地方,继续原来的工作。处理事件的过程,称为CPU的中断响应过程。对事件的整个处理过程,称为中断服务或中断处理。如图4.1中断过程。图4.1 中断过程实现这种功能的部件称为中断系统,产生中断请求的来源称为中断源。中断源向CPU提出的处理请求称为中断请求或中断申请。CPU暂时中止执行的程序,转向执行中断服务程序,除了硬件会自动把断点地址(16位程序计数器PC的值)压入堆栈之外,用户还得注意保护有关的工作寄存器、累加器、标志位等信息,称为保护现场。最后执行中断服务程序后
3、,恢复有关的工作寄存器、累加器、标志位等信息,称为恢复现场。最后执行中断返回指令,从堆栈中自动弹出断点地址到PC,继续执行被中断的程序,称为中断返回。中断方式完全消除了CPU在程序查询方式中的等待现象,大大地提高了CPU的工作效率。4.2 MCS-51中断系统的结构MCS-51单片机的中断系统有5个中断请求源,具有两个中断优先级,可实现两级中断服务程序嵌套。用户可以用软件来屏蔽所有的中断请求,也可以用软件使CPU接收中断请求;每一个中断源可以用软件独立地控制为开中断或关中断状态;每一个中断源的中断级别均可用软件设置。4.2.1 中断源MCS-5l提供五个中断请求源,其中两个为外部中断源,由IN
4、T0,INT1引脚输入;两个片内的定时器/计数器溢出中断请求;串行口产生的中断请求(TI或RI)。它们相对应的入口地址见表4.1。表4.1MCS-51中断源及其入口地址五个中断源入口地址外部中断0(/INT0)0003HT0溢出中断000BH外部中断1(/INT1)0013HT1溢出中断001BH串口中断0023H这些中断请求源分别由MCS-51的特殊功能寄存器TCON和SCON的相应位锁存。TCON为定时器/计数器的控制寄存器,字节地址为88H,TCON也锁存外部中断请求标志。其格式如下表4.2:表4.2 TCON中的中断请求标志位位D7D6D5D4D3D2D1D0TCONTF1TR1TF0
5、TR0IE1IT1IE0IT0位地址8FH8EH8DH8CH8BH8AH89H88H各位的功能如下: IT0:选择外部中断请求INT0为边沿触发方式或电平触发方式的控制位。当IT0为0时,为电平触发方式,INT0低电平有效;当IT0为l时,1NT0为边沿触发方式,INT0输人脚上的电平从高到低的负跳变有效。INT0由软件置“1”或清“0”。 IE0:外部中断INT0的中断申请标志位。当IT00即电平触发方式时,每个机器周期的S5P2采样INTO,若INT0为低电平,IE0被置“1”,否则被清“0”;当IT01,即INT0程控为边沿触发方式时,当第一个机器周期采样到为低电平时,则IE0被置“l”
6、,IE0为1表示外部中断0正在向CPU申请中断。当CPU响应中断,转向中断服务程序时,IE0由硬件清“0”。 ITl:选择外部中断请求1为边沿触发方式或电平触发方式的控制位,其意义和IT0类似。 IEl:外部中断1的中断申请标志位,其意义和IE0类似。 TF0:MCS-51片内定时器计数器T1溢出中断申请标志位。当启动T0计数后,定时器计数器T0从初值开始加1计数,当最高位产生溢出时,TF0由硬件置“1”,向CPU申请中断,CPU响应T0中断时,TF0由硬件清“0”,TF0也可由软件清0(查询方式)。TFl:MCS-51片内的定时器所数器T1的溢出中断申请标志位,功能和TF0类同。TR1和TR
7、0这2个位与中断无关,仅与定时器/计数器T1和T0有关,它们的功能在后续章节介绍。当MCS-51复位后,TCON被清0。则CPU关中断,所有中断请求被禁止。SCON为串行口控制寄存器,字节地址为98H,SCON的低二位为串行口的接收中断和发送中断标志,其格式如下表4.3:表4.3 SCON中的中断请求标志位位D7D6D5D4D3D2D1D0SCONTIRI位地址99H98H各位的功能如下:TI:MCS-51串行口的发送中断标志位,在串行口以方式0发送时,每当发送完8位数据,TI由硬件置“1”;若以方式1、方式2或方式3发送时,在发送停止位的开始时,TI由硬件置“1”,TIl表示串行口发送正在向
8、CPU申请中断,要发送的数据一旦写入串行口的数据缓冲器班SBUF,单片机内部的硬件就立即启动发送器继续发送。值得注意的是CPU响应发送器中断请求,转向执行中断服务程序时TI并不清“0”,T1必须由用户的断服务程序清0,即中断服务程序中必须用TI清“0”的指令。 RI:串行口接收中断标志位,若串行口接收器允许接收,并以方式0工作,每当接收到第8位数据时RI由硬件置“1”,;若以方式1、2、3工作,且SM2=0时,每当接收器接收到停止位的中间时RI由硬件置“l,当串行口干以方式2或方式3进行工作,且SM21时仅当接收到的第9位数据RB8为1后,同时还要在接收到停止位的中间时,RI由硬件置“l”,R
9、I为1,表示串行口接收器正在向CPU申请中断,同样RI必须由用户的中断服务程序清0。SCON其它各位后续章节介绍。MCS-51复位后,SCON也被清零。4.2.2 中断控制MCS-51的CPU对中断源的开放或屏蔽,由片内的中断允许寄存器IE控制,IE的字节地址为A8H,其格式如下表4.4:表4.4 IE中的中断允许标志位位D7D6D5D4D3D2D1D0IEEAESET1EX1ET0EX0位地址AFHACHABHAAHA9HA8HEA:MCS-51的CPU的总的开放中断标志位。EA=1,CPU开放中断,但五个中断源的中断请求是否允许,还要由IE中的低5位所对应的5个中断请求允许控制位的状态来决
10、定;EA=0,CPU屏蔽所有的中断申请。ES:中行口中断允许位。ES=1,允许串行口中断;ES=0禁止串行口中断。ET1:定时器计数器T1的溢出中断允许位。ETl1允许Tl中断;ETl0禁止ETl中断。EXl:外部中断1中断允许位。 EXl=1允许外部中断1中断;EXl0禁止外部中断1中断。ET0:定时器计数器0的溢出中断允许位。ET0=1允许T0中断;ET0=0禁止T0中断。EX0:外部中断0中断允许位。EX0=1允许外部中断0中断,EX00禁止外部中断0中断。MCS-51复位以后,IE被清0,由用户程序置“1”,或清“0”EI相应的位,实现允许或禁止各中断源的中断申请。若使某一个中断源允计
11、中断必须同时使CPU开放中断。更新IE的内容,可由位操作指令来实现,也可用字节操作指令实现。4.2.3 中断优先级MCS-51有两个中断允许优先级,对于每一个中断请求源可编程为高优先级中断或低优先级中断,可实现二级中断嵌套,二级中断嵌套的过程如图4.2。图4.2二级中断嵌套一个正在执行的低优先级中断程序能被高优先级的中断源所中断,但不能被另一个低优先级的中断源所中断。若CPU正在执行高优先级的中断,则不能被任何中断源所中断,一直执行到结束,遇到返回指令RETI,返回主程序后再执行一条指令后才能响应新的中断请求。以上所述可以归纳为下面两条基本规则:1. 低优先级可被高优先级中断,反之不能。2.
12、任何一种中断(不管是高级还是低级),一旦得到响应,不会再被它的同级中断所中断。MCS-51的片内有一个中断优先级寄存器IP,其字节地址为B8H,只要用程序改变其内容,即可进行各中断源中断级别的设置,IP寄存器格式如下表4.5:表4.5 IP中的中断优先级标志位位D7D6D5D4D3D2D1D0IPPSPT1PX1PT0PX0位地址BCHBBHBAHB9HB8HPS:串行口中断优先级控制位。PS1,串行口中断定义为高优先级中断;PS0,串行口定义为低优先级中断。 PT1:定时器Tl中断优先级控制位。PTll,定时器T1定义为高优先级中断;PTl0,定时器T1定义为低优先级中断。 PX1:外部中断
13、1中断优先级控制位。PXl=1,外部中断1定义为高优先级中断;PXl0,外部中断1定义为低优先级中断。 PT0:定时器T0中断优先级控制位。PT0=1,定时器T0定义为高优先级中断;PT0=0,定时器T0定义为低优先级中断。 PX0:外部中断0中断优先级控制位。PX0=1,外部中断0定义为高优先级中断;PX00,外部中断0定义为低优先级中断。 中断优先级控制寄存器IP的各位都由用户程序置位和复位,可用位操作指令或字节操作指令更新IP的内容,以改变各中断源的中断优先级。 MCS-5l复位以后IP为0,各个中断源均为低优先级中断。在同时收到几个同一优先级的中断请求时,哪一个中断请求能先得到响应,取
14、决于内部的查询顺序。这相当于在同一个优先级内,还同时存在另一个辅助优先结构,其优先顺序如右图:中断源中断级别外部中断0T0溢出中断外部中断1T1溢出中断串行口中断最高最低4.3 外部中断4.3.1 外部中断的方式选择外部中断的触发有两种触发方式,电平触发方式和边沿触发方式。1. 电平触发方式若外部中断定义为电平触发方式,外部中断申请触发器的状态随着CPU在每个机器周期采样到的外部中断输入线的电平变化而变化,这能提高CPU对外部中断请求的响应速度。当外部中断源被设定为电平触发方式时,在中断服务程序返回之前,外部中断请求输入必须无效(即变为高电平),否则CPU返回主程序后会再次响应中断。所以电平触
15、发方式适合于外部中断以低电平输入而且中断服务程序能清除外部中断请求源的情况。2. 边沿触发方式外部中断若定义为边沿触发方式,外部中断申请触发器能锁存外部个断输入线上的负跳变。即便是CPU暂时不能响应,中断申请标志也不会丢失。在这种方式里,如果相继连续两次采样,一个周期采样到外部中断输入为高,下个周期采样为低,则置“1”中断申请触发器,直到CPU响应此中断时才清0。这样不会丢失中断,但输入的负脉冲宽度至少保持12个时钟用期(若品振频率为6MHz,则为2uS),才能被CPU采样到。外部中断的边沿触发方式适合于以负脉冲形式输入的外部中断请求。4.3.2 8051 C语言中断程序的写法上节简述了805
16、1中断控制的程序入口地址,以及中断控制标志列表。当8051产生了中断工作后,会跳到某一固定的地址去执行中断服务程序,而中断服务程序的地址可以由程序来决定的。C5l编译器支持在C语言源程序中直接编写8051单片机的中断服务函数程序,从而减轻了采用汇编语言编写中断服务程序的繁琐程度。为了在C语言源程序中直接编写中断服务函数的需要,C51编译器对函数的定义进行了扩展,增加了一个扩展关键字interrupt。关键宇interrupt是函数定义时的一个选项,加上这个选项即可以将一个函数定义成中断服务函数。定义中断服务函数的一般形式为:函数类型 函数名(形式参数表)interrupt nusing m关键
17、字interrupt后面的n是中断号,n的取值范围为0-31。编译器从8n+3处产生中断向量,具体的中断号n和中断向量取决于不同的8051系列单片机芯片。8051单片机的常用中断源和中断向量如表4.6所示:表4.6常用中断号和中断向量n中断源中断向量8n+30外部中断00003H1定时器0000BH2外部中断10013H3定时器1001BH4串口0023H805l系列单片机可以在内部RAM中使用4个不同的工作寄存器组,每个寄存器组中包含8个工作寄存器(R0-R7)。C51编译器扩展了一个关键字using,专门用来选择805l单片机中不同的工作寄存器组。using后面的m是一个0-3的常整数,分
18、别选中4个不同的工作寄存器组。在定义一个函数时using是一个选项,如果不用该选项,则由编译器选择一个寄存器组作绝对寄存器组访问。需要注意的是,关键宁using和interrupt的后面都不允许跟一个带运算符的表达式。关键字using对函数目标代码的影响如下:在函数的入口处将当前工作寄存器组保护到堆栈中;指定的工作寄存器内容不会改变;函数返回之前将被保护的工作寄存器组从堆栈中恢复。使用关键字using在函数中确定一个工作寄存器组时必须十分小心,要保证任何寄存器组的切换都只在仔细控制的区域内发生,如果不能做到这一点将产生不正确的函数结果。另外还要注意,带using属性的函数原则上不能返回bit类
19、型的值。并且关键字using不允许用于外部函数。关键字interrupt也不允许用于外部函数,它对中断函数目标代码的影响如下:在进人中断函数时,特殊功能寄存器ACC、B、DPH、DPL、PSW将被保存入栈;如果不使用寄存组切换,则将中断函数中所用到的全部工作寄存器都人栈;函数返回之前,所有寄存器内容出栈;中断函数由805l单片机指令RETl结束。4.4 外部中断设计分析相对第二章流水灯实例,实例的要求做一些修改,比较程序查询方式和中断方式的区别。硬件电路描述如下:8051单片机的P1口的P1.0P1.7分别接有LED(D1D8),当某一端口输出为“0”时,相应的LED点亮,有两个按钮K1、K2
20、,分别连接INT0、INT1引脚。现要求编写中断方式可键控的流水灯程序,当K1按下时,使灯由D1往D8流动一遍,然后熄灭;K2按下时,使灯由D8往D1流动一遍,然后熄灭。4.4.1 硬件设计分析由于K1、K2分别连接在INT0、INT1引脚上,采用中断方式控制,则首先需要选择电平触发方式还是边沿触发方式。因为流水灯只流动一遍,为了防止流动太快,电平触发方式会引起多次中断,所以选择边沿触发方式。MCS-51外部中断的边沿触发方式是负边沿方式,即在INT0或INT1引脚有高电平变为低电平的信号。INT0、INT1在P3口上,所以可以不需要上拉电阻,也可以加上拉电阻。如果按钮按下,其状态为“0”;如
21、果按钮未按下,由于P3口内部有上拉电阻,其状态为“1”。根据题目要求硬件电路设计如图4.3所示图2.3 流水灯中断方式硬件电路4.4.2 程序功能与实现下面首先给出程序,然后再进行分析。键控流水灯的程序#include reg51.h#include intrins.h#define uchar unsigned charvoid mDelay(unsigned int DelayTime) /延时函数unsigned int j=0;for(;DelayTime0;DelayTime-) for(j=0;j125;j+);void main() IT0=1; /外部中断0触发方式:边沿触发方
22、式IT1=1; /外部中断1触发方式:边沿触发方式EA=1; /中断总允许位打开EX0=1; /外部中断0打开EX1=1; /外部中断1打开for(;)P1=0xff; /灯全灭void isr_0()interrupt 0unsigned char OutData=0xfe;int r_counter;for(r_counter=0;r_counter8;r_counter+)OutData=_crol_(OutData,1);P1=OutData;mDelay(1000);void isr_2()interrupt 2unsigned char OutData=0xfe;int r_counter;for(r_counter=0;r_counter8;r_counter+)OutData=_cror_(OutData,1);P1=OutData;mDelay(1000);