MSC-51单片机C语言简单入门教程技术支持群:11313486中断系统1、中断的概念如果单片机没有中断功能,单片机对外部或是内部事件的处理只能采用程序查询方式,即CPU不断查询是否有事件发生。显然,采用程序查询方式,CPU不能再做别的事,而是在大部分时间处于等待状态。单片机都具有实时处理能力,能对外部或是内部发生的事件做出及时地处理,这是靠中断技术来实现的。当CPU正在处理某件事情的时候,外部或内部发生的某一事件请求CPU迅速去处理,于是CPU暂时中止当前的工作,转去处理所发生的事件。中断服务处理程序处理完该事件后,再回到原理被中止的地方,继续原来的工作,这样的过程称为中断,如图所示。处理事件的过程称为CPU的中断响应过程。对事件的整个处理过程,称为中断服务或中断处理。实现这种功能的部件称为中断系统,产生中断的请求源称为中断源。中断源向CPU提出的处理请求,称为中断请求或中断申请。CPU暂时中止执行的程序,转去执行中断服务程序,除了硬件会自动把断点地址PC值压入堆栈之外,用户还得注意保护有关的工作寄存器、累加器、标志位等信息,这称为现场保护。最后执行中断返回指令,从堆栈中自动弹出断点地址到PC,继续执行被中断的程序,这称为中断返回。2、MCS-51中断系统的结构单片机的中断系统有5个中断请求源,具有两个中断优先级,可实现两级中断服务程序嵌套。用户可以用软件来屏蔽所有的中断请求,也可以用软件使CPU接受中断请求;每一个中断源可以用软件独立地控制为开中断或是关中断状态;每一个中断源中的中断级别均可用软件来设置。下图为中断系统结构图。MSC-51单片机C语言简单入门教程技术支持群:113134863、中断请求源中断系统共有五个中断请求源它们是:1)INT0外部中断0请求,由INT0引脚输入,中断请求标志为IE0。2)INT1外部中断1请求,由INT1引脚输入,中断请求标志为IE1。3)定时器/计数器T0溢出中断请求,中断请求标志为TF0。4)定时器/计数器T1溢出中断请求,中断请求标志为TF1。5)串口中断请求,中断请求标志为TI或RI。这些中断请求源的中断请求标志位分别由特殊功能寄存器TCON和SCON的相应位锁存。TCON为定时器/计数器的控制寄存器,字节地址为88H,可位寻址。TCON也锁存外部中断请求标志。如下图所示。与中断系统有关的各标志位的功能如下:IT0—选择外部中断请求INT0为跳沿触发方式或是电平触发方式的控制位。IT0=0,为电平触发方式,引脚INT0上低电平有效IT0=1,为跳沿触发方式,引脚INT0上的电平从高到低的负跳变有效。IT0位可由软件置1或清0。IE0—外部中断0的中断请求标志位。当IT0=0,为电平触发方式,每个机器周期的S5P2采样INT0引脚,若INT0脚为低电平,则置“1”,否则清“0”IE0。MSC-51单片机C语言简单入门教程技术支持群:11313486=1,即INT0为跳沿触发方式时,当第一个机器周期采样到为低电平时,则置“1”IE0。IE0=1表示外部中断0正在向CPU申请中断。当CPU响应中断,转向中断服务程序时,由硬件清“0”IE0。IT1—选择外部中断请求INT1为跳沿触发方式或电平触发方式的控制位,其意义和IT0类似。IE1—外部中断1的中断请求标志位,其意义和IE0类似。TF0—MCS-51片内定时器/计数器T0溢出中断请求标志位。当启动T0计数后,定时器/计数器T0从初始值开始加1计数,当最高位产生溢出时,由硬件置“1”TF0,向CPU申请中断,CPU响应TF0中断时,清“0”TF0,TF0也可由软件清零(查询方式)。TF1定时器/计数器T1的益处中断请求标志位,功能和TF0类似。TR1、TR0这2个位与中断无关,仅与定时器/计数器T1和T0有关,它们的功能将在其它章节中介绍。当复位后,TCON被清0,则CPU关中断,所有中断请求被禁止。SCON为串口控制寄存器,字节地址为98H,可位寻址。SCON的低二位锁存串口的接收中断和发送中断标志,其格式如下图。SON中各标志位的功能如下:T1—串口的发送中断请求标志位。CPU将一个字节的数据写入发送缓冲器SBUF时,就启动一侦串行数据的发送,每发送完一侦串行数据后,硬件自动置“1”TI。但CPU响应中断时,CPU并不清楚TI,必须在中断服务程序中用软件对TI清“0”。RI—串行扣接受中断请求标志位。在串行口允许接收时,每接收完一个串行侦,硬件自动置“1”RI。CPU在响应中断时,并不清除RI,必须在中断服务程序中用软件对RI清“0”。4、中断允许寄存器IECPU对中断源的开放或是屏蔽,是由片内的中断允许寄存器IE控制的。IE的字节地址为A8H,可进行位寻址。中断允许寄存器IE对中断的开放和关闭实现两级控制。所谓两级控制,就是有一个总的开关中断控制位EA,当EA=0时,所有的中断请求被屏蔽,CPU对任何中断请求都不接受;MSC-51单片机C语言简单入门教程技术支持群:11313486=1时,CPU开放总中断,但五个中断源的中断请求是否允许,还要由IE中的低5位所对应的5个中断请求允许控制位的状态来决定如下图。IE中各位的功能如下:中断允许总控制位。EA=0,CPU屏蔽所有的中断请求(也称CPU关中断)。EA=1,CPU开放所有中断(也称CPU开中断)。串口中断允许位ES=0,禁止串口中断;ES=1,允许串口中断。定时器/计数器T1的溢出中断允许位ET1=0,禁止T1中断ET1=1,允许T1中断。外部中断1中断允许位EX1=0,禁止外部中断1中断EX1=1,允许外部中断1中断定时器/计数器T0的溢出中断允许位ET0=0,禁止T0中断ET0=1,允许T0中断复位以后,IE被清零,由用户程序置“1”或清“0”IE相应得位,实现允许或禁止各中断的中断申请。若使某一个中断源允许中断,必须同时使CPU开放中断。如更新IE的内容,可由位操作指令来实现,也可用字节操作指令实现。假设允许片内定时器/计数器中断,禁止其它中断的中断申请。的步骤为:1、ES=0//禁止串口中断2、EX1=0//禁止外部中断13、EX0=0//禁止外部中断04、ET1=1//允许定时器/计数器T1中断MSC-51单片机C语言简单入门教程技术支持群:11313486、ET0=1//允许定时器/计数器T0中断6、EA=1//CPU开放所有中断(也称CPU开中断)。以上是采用位操作的方式,还可以采用字节的方式:IE=0X8AH5、中断优先级寄存器IP中断请求源有两个中断优先级,对于每一个中断请求源可由软件定为高优先级中断或是低优先级中断,可实现两级中断嵌套,两级中断嵌套的过程如下图一个正在执行的低优先级中断程序能被高优先级的中断源所中断,但不能被另一个低优先级的中断源所中断。若CPU正在执行高优先级的中断,则不能被任何中断源所中断,一直执行到结束,遇到中断返回指令,返回主程序后再执行一条指令后才能响应新的中断请求。可归纳为两条基本原则:1.低优先级可被高优先级中断,反之则不能。2.任何一种中断,一旦得到响应,不会再被它同级中断源所中断。如果某一中断源被设置为高优先级中断,在执行该中断服务程序时,则不能被任何其它的中断源所中断。单片机片内有一个中断优先级寄存器IP,其字节地址为B8H,可位寻址,只要用程序改变其内容,即可进行各中断源中断优先级的设置如下图各位的含义如下:串口中断优先级控制位PS=1,串口中断定义为高优先级MSC-51单片机C语言简单入门教程技术支持群:11313486=0,串口中断定义为低优先级定时器T1优先级控制位PT1=1,T1定义为高优先级PT0=1,T1定义为低优先级外部中断优先级控制位PX1=1,外部中断定义为高优先级PX1=0,外部中断定义为低优先级定时器T0优先级控制位PT0=1,T0定义为高优先级PT0=0,T0定义为低优先级外部中断0优先级控制为PX0=1,外部中断0定义为高优先级PX0=0,外部中断0定义为低优先级中断优先级控制寄存器IP的各位都由用户程序置“1”或清“0”,可用位操作或是字节操作指令更新IP的内容。单片机复位后IP为0,各个中断源均为低优先级中断。各中断源在同一优先级的条件下,外部中断0的优先级最高,串口的优先级最低如下图:例如,要单片的2个外部中断为高优先级,其它中断为低优先级。的步骤如下PX0=1;PX1=1;PS=0;PT0=0;PT1=1;也可用字节操作IP=0X05H;6、中断响应一个中断源的中断请求被响应,需要满足以下条件:1)该中断源发出中断请求。2)CPU开中断,即中断总允许位EA=1。3)申请中断的中断源的中断允许位=1,即该中断没有被屏蔽。MSC-51单片机C语言简单入门教程技术支持群:11313486)无同级或更高级中断正在被服务。中断响应就是对中断源提出的中断请求的接受,是在中断查询之后进行的。当CPU查询到有效的中断请求时,在满足上述条件时,紧接着就进行中断响应。首先是将PC的内容压入堆栈以保护断点,再将中断入口地址装入PC,使程序转向相应得中断入口地址。各中断源服务程序的入口地址是固定的如下表所示:7、中断请求的撤消定时器/计数器中断的中断请求被响应后,硬件会自动把中断请求标志位(TF0或TF1)清“0”,因此定时器/计数器中断请求时自动撤消的。当外部中断为跳沿方式时,中断标志位的清“0”和外部中断信号的撤消有关。其中中断标志位IE0或IE1的清“0”是在中断响应后由硬件自动完成的。而外部中断信号的撤消,由于跳变沿信号过后也就消失了,所以跳沿方式外部中断请求也就是自动撤消的。对于电平方式外部中断请求的撤消,中断请求标志的撤消是自动的,但中断信号的低电平可能继续存在,又会把已清“0”的IE0或IE1重新置“1”。所以必须在中断响应后把中断信号从低电平强制改为高电平。串口中断标志位是TI和RI,但对这两个中断标志不进行自动清零。因此CPU无法知道是接收还是发送,还需要测试这两个位的状态,是发送还是接收,然后才能清除。所以只能通过软件的方法,在中断服务程序中进行。8、中断服务程序的设计1)设置中断允许控制寄存器IE,允许相应的中断请求源中断。EA=1;//开总中断,EX0=1;//开中断02)设置中断优先级寄存器IP。3)若是外部中断,还要设置中断触发方式IT1或IT0IT0=0;//电平触发方式。4)编写中断服务程序,处理中断请求。MSC-51单片机C语言简单入门教程技术支持群:11313486上图为中断函数的书写格式,函数名称不必与上图相同。电平触发方式具体程序如下:#includereg52.h//引入头文件#defineuintunsignedint//定义宏#defineucharunsignedchar//定义宏sbitdula=P2^6;//数码管的段选sbitwela=P2^7;//数码管的位选sbitd1=P1^0;//定义第一个发光二极管ucharnum;//定义变量ucharcodetable[]={//定义数码管的字形表0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};voiddelay(uintz);voidmain()//主函数{EA=1;//开总中断EX0=1;//开中断0IT0=0;//电平触发方式wela=1;//位选打开MSC-51单片机C语言简单入门教程技术支持群:11313486http