当单片机接收到一个中断请求信号后,就暂停它的当前操作,保存其工作状态,并将控制权转交给中断服务程序,以便通过执行中断服务程序(Interrupt Handler)来完成该中断所对应的操作内容。
1.主程序中的中断初始化
中断都是在运行主程序时发生的,是主程序的随机事件。是否允许发生及如何发生,都应该在主程序中预先设置,这就是中断初始化。中断初始化的内容包括堆栈设置、中断系统总开放、中断允许设置、中断请求方式设置(外部中断)和中断优先级设置等。
现以外部中断0为例进行说明,外部中断0的中断地址区从0003H开始,假定外部中断0的中断服务程序入口地址标号为EXINT0,则转向中断服务程序的设置和中断初始化的程序代码如下:
使用与中断相关的控制寄存器时,既可以按寄存器名称又可以按寄存器地址,此外对位状态的设置还可以使用位操作指令。例如,设置外中断0为高优先级,其余为低优先级的位操作指令为
MOV IP,#00H;清中断优先级寄存器
SETB PX0;外部中断0为高优先级
有时在主程序空闲时,需要等待中断请求出现,为此可在需要等待的地方使用一条SJMP指令进行设置,即
THERE:SJMP THERE
2.中断服务流程
所有计算机的中断服务流程都十分相似,单片机也不例外。80C51单片机的中断服务流程如图5-3所示。流程图表明,只有在一条指令全部执行完之后,才能响应中断请求,以确保指令的完整执行。下面对中断服务流程中的一些问题进行说明。
图5-3 80C51单片机的中断服务流程图(www.xing528.com)
1)现场保护和现场恢复。所谓现场就是指中断时刻单片机中存储单元内的数据或状态。为了使中断服务程序的执行不破坏这些数据或状态,就要把它们送入堆栈中保存起来,以免在中断返回后影响主程序的运行。这就是现场保护,现场保护一定要完成于中断处理程序之前。
中断服务结束后,在返回主程序之前,应把保存的现场内容从堆栈中弹出,以恢复相关存储单元的原有内容,这就是现场恢复。现场恢复一定要在中断处理程序之后进行。
80C51中有堆栈操作指令“PUSH direct”和“POP di-rect”,主要是供现场保护和现场恢复的。至于要保护哪些现场内容,应该由用户根据中断处理程序的情况来决定。
2)关中断和开中断。在一个多中断源系统中,为保证重要中断能执行到底,不被其他中断所嵌套,除采用设定高优先级之外,还可以采用关中断的方法来解决。即在现场保护之前先关闭中断系统,彻底屏蔽其他中断,待中断处理完成后再打开中断系统。即使中断处理可以被嵌套,但现场保护和恢复不允许打扰,以免影响现场保护和恢复工作,为此应在现场保护和现场恢复程序段的前后进行关、开中断。这样做可以在除现场保护和现场恢复的片刻外,仍然为系统保留中断嵌套功能。
对于80C51单片机,中断的关和开可通过CLR和SETB指令复位、置位中断允许控制寄存器中的有关位来实现。
3)中断处理。中断处理是中断服务程序的核心内容,中断要做的事全在其中体现。
4)中断返回。中断服务程序的最后一条指令必须是中断返回指令RETI。CPU执行这条指令时,把响应中断时置位的优先级触发器复位,再从堆栈中弹出断点地址送入程序计数器PC,以便从断点处重新执行被中断的主程序。
【例5-1】 P1口做输出口,正常时控制8只灯(P1口输出低电平时灯被点亮)每隔0.5s全亮全灭一次;按下开关1,8只灯从右向左依次点亮;按下开关2,8只灯从左向右依次点亮。
解:开关1的低电平脉冲信号作为外部中断信号由INT0(P3.2)引脚输入,开关2的低电平信号作为外部中断信号由INT1(P3.3)引脚输入。中断允许寄存器IE中相应的EA、EX1、EX0位设置为1。
外部中断0为低优先级,IP中的PX0位设置为0;外部中断1为高优先级,IP中的PX1位设置为1。
外部中断0的中断触发方式设为边沿触发,控制位IT0应设置为1;外部中断1的中断触发方式设为电平触发,控制位IT1应设置为0。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。