中断是单片机内部产生的一种事件,中断可以打断当前程序的执行,转而执行中断服务程序,当服务程序执行完毕后,再返回中断前被打断的程序位置继续执行。
在单片机中,中断分为外部中断和内部中断。外部中断是由外界物理事件所引起的中断,例如按下一个按钮、定时器到时间等。而内部中断是由单片机自身所发生的某些特殊事件所引起的中断,例如指令执行错误、软件中断等。无论是外部中断还是内部中断,产生中断的条件都是预设的特定事件发生。
单片机只有在特定的条件下才会产生中断。在MCS-51系列单片机中,产生中断的条件如下:
(1)中断允许(EA=1):在中断允许(EA=1)的情况下,中断是被允许的。如果中断允许(CL=0),则除了NMI(不可屏蔽中断)和复位中断外,其他中断都会被屏蔽。
(2)中断优先级和中断标志位(IP和IE):当IE和IP中相应的中断标志位(TF、IE1、TI、RI、TF1、TF0等)被设置为1时,才会引起中断。所以编写程序时要注意预处理程序和中断服务程序中IE和IP的值。
(3)中断方向控制(IDL):在IDLE=1的情况下,外部中断请求不会被响应。在IDLE=0的情况下,外部中断请求可以被响应。
(4)CPU状态(系统时钟和时钟周期):系统时钟频率越高,中断响应时间越快;时钟周期越短,中断响应时间也会越短。
单片机中断服务程序的执行顺序是按照优先级来决定的,优先级高的中断服务程序先执行,优先级低的中断服务程序后执行。
在MCS-51系列单片机中,各种中断服务程序的优先级如下:
(1)复位中断(最高优先级)
(2)NMI中断(次高优先级)
(3)优先级0中断(TF0和IE0)
(4)优先级1中断(TF1和IE1)
(5)串口中断(TI和RI)
(6)定时器中断(TF2和EXF2)
(7)中断优先级预留(未来扩充)
编写中断服务程序的目的是处理中断产生的事件,中断服务程序的实现需要注意以下几点:
(1)定义中断服务程序(ISR):中断服务程序有自己的入口和出口地址,在定义ISR时需要加入关键字“interrupt”。
(2)备份寄存器:在ISR中需要备份一些寄存器(如ACC、B、DPTR等)的值,因为中断服务程序执行时会覆盖一些寄存器的值,如果不备份这些寄存器,可能导致原程序在中断服务程序返回时出现错误。
(3)清除中断标志位:在ISR中必须清除中断标志位(如TF、IE1、TI、RI等),否则会出现重复中断。
(4)恢复现场:在ISR执行完毕后,需要恢复ISR之前的程序状态,包括恢复备份的寄存器值和返回地址。
(5)使用__interrupt宏定义:MCS-51系列单片机使用__interrupt来定义ISR,这个宏定义包含了备份和恢复寄存器等一系列操作。