中断包含中断控制程序和中断服务程序两部分。
一、中断初始化程序
中断初始化程序实质上就是对TCON、SCON、IE和IP寄存器的管理和控制。
中断初始化程序一般不独立编写,而是包含在主程序中,中断初始化程序需完成以下操作:
- 开中断;
- 某一中断源中断请求的允许与禁止(屏蔽);
- 确定各中断源的优先级别;
- 若是外部中断请求,则要设定触发方式是电平触发还是边沿触发。
例题 1
假设规定外部中断0为电平触发方式,高优先级,试写出有关的初始化程序。
解:可用两种方法完成。
① 方法1,用位操作指令完成:
② 方法2,用其它指令也可完成同样功能:
二、中断服务程序
中断服务程序是一种为中断源的特定情况要求服务的独立程序段,以中断返回指令RETI结束。
中断服务程序的固定入口:
中断服务程序和子程序一样,在调用和返回时,也有一个保护断点和现场的问题。
在中断响应过程中,断点的保护主要由硬件电路自动实现。
中断时,现场保护由中断服务程序来完成。因此在编写中断服务程序时必须考虑保护现场的问题。现场一般包括累加器A、工作寄存器R0~R7以及程序状态字PSW等。
在编写中断服务程序时还应注意以下三点:
- 各中断源入口地址之间只相隔8个字节。
- 在执行当前中断程序时,如何禁止更高优先级中断源的中断请求。
- 在多级中断情况下,保护现场与中断嵌套的安排。
三、 应用举例
在设计中断服务程序时,是按中断源的要求,根据中断处理所要完成的任务来进行的。
保护现场和恢复现场一般采用 PUSH和POP指令来实现。PUSH和POP指令一般成对出现,以保证寄存器的内容不会改变。
例题2
设在主程序中用到了寄存器PSW、ACC、B、DPTR,而在执行中断服务程序时需要用到这些寄存器。
例题3
图为多个故障显示电路,当系统无故障时,4个故障源输入端X1~X4全为低电平,显示灯全灭;当某部分出现故障,其对应的输入由低电平变为高电平,从而引起MCS-51单片机中断,中断服务程序的任务是判定故障源,并用对应的发光二极管LED1~LED4进行显示。
编程如下:
这个程序主要分为主程序和中断服务程序两部分。
主程序主要完成初始化的工作,中断服务程序主要检测故障源是否发生,如果某故障源发生,则将相应的指示灯点亮。在此主程序和中断服务程序中,没有存在使用寄存器之间的干涉问题。因此,在中断服务程序中不用保护现场和恢复现场。
例:单步运行控制
这是外中断的特殊应用,外中断0编程为高优先级电平触发方式。工作原理:主程序先对中断系统进行初始化,接着单片机进入中断服务程序(因为INT0总是低),在中断服务程序中等待INT0变高(按键短暂闭合),这是执行RETI返回
回主程序,由于INT0为低,接着又申请中断,这次的中断响应应在执行了这程序中的一条指令后才能进入中断服务程序。重复以上过程,便可实现单步执行用户程序。