中断是计算机在执行某一程序的过程中,由计算机系统内部或外部的某种原因而必须终止当前程序的运行,先去执行相应的处理程序,然后再返回继续执行原程序。而实现中断功能的软、硬件系统统称为中断系统。常情况下,一个程序中可能会有多个中断,优先级越高的中断优先执行。如果在一个中断的服务过程中,有一个优先级更高的中断插入,则当前中断暂停,前往执行优先级更高的中断。当优先级高的中断执行完毕后再返回继续执行低优先级的中断。
而能够触发中断的事件称为中断源,89C51 单片机中共有 5 个中断源,两个外部中断(INT0、INT1)、两个定时器 / 计数器 T0、T1 的溢出中断(最常用的一种)、串行口的发送和接受中断 (只占用一个中断源)。
中断查询次序(中断号)
中断号是系统分配给每个中断源的代号,以便识别和处理。
与中断有关的特殊功能寄存
与中断有关的特殊功能寄存器一共有 4 个:
1、定时 / 计数器控制寄存器 (TCON)、
2、串行口控制寄存器 (SCON)、
3、中断允许控制寄存器 (IE)、
4、中断优先级控制寄存器 (IP)
中断结构
这些中断寄存器就像开关一样控制着中断的开启以及设置优先级。
外部中断
从单片机外部引脚 INT0 和 INT1 输入中断请求信号的中断。
外部中断的触发方式有两种电平触发 IT0 =0 和跳变触发 (边沿) IT0 = 1,可以通过定时 / 计数器控制寄存器 TCON 编程选择。
定时 / 计数器控制寄存器 TCON
控制定时 / 计数器 T0 和 T1 的溢出中断
控制外部中断的触发方式.,由 IT0 和 IT1 控制
锁存外部中断请求标志位
串行口控制寄存器 SCON
串行口的接收发送数据中断请求标志位 (RI 和 TI)
TI:串行口发送中断请求标志位。CPU 每发送一帧数据,硬件置位 1 (TI=1),但是中断被响应时,需要在中断服务程序中通过软件对 TI 清零
RI:串行口接受中断请求标志位。每接收一帧数据,硬件置位 1 (TI=1),但是中断被响应时,一样需要在中断服务程序中通过软件对 TI 清零
串行口中断不能由硬件自动清除中断请求标志位,需要用户通过软件进行控制清零。
中断允许控制寄存器 IE
IE 是控制中断的开关,通过对 IE 的清 0 和置 1 操作来控制中断的屏蔽和开放。
中断允许控制寄存器 IE 对中断的开放与屏蔽实现两级控制,存在一个总的中断控制位 EA
中断优先级控制寄存器 IP
PS :串行口中断优先级控制位。PS=1,串行口中断为高优先级;PS=0,为低优先级。
PT1 :定时 / 计数器 1 中断优先级控制位。当 PT1=0 时,T1 溢出中断为低优先级;当 PT1=1 时,T1 溢出中断为高优先级。
PT0 :定时 / 计数器 0 中断优先级控制位。当 PT0=0 时,T0 溢出中断为低优先级;当 PT0=1 时,T0 溢出中断为高优先级。
PX1 :外部中断 1 的中断优先级控制位。当 PX1=0 时,外部中断 1 为低优先级;当 PX1=1 时,外部中断 1 为高优先级。
PX0 :外部中断 0 的中断优先级控制位。当 PX0=0 时,外部中断 0 为低优先级;当 PX0=1 时,外部中断 0 为高优先级。
同级内第二优先级的次序:
外部中断 0 > T0 溢出中断 > 外部中断 1 > T1 溢出中断 > 串行口中断
实例:外部中断控制 LED 亮灭
#include<reg52.h>
void Delay(int xms) //@12.000MHz
{
unsigned char data i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void init() // 中断的初始化
{
EA = 1; // 打开总中断控制
EX0 = 1; // 允许外部中断0
IT0 = 1; // 外部中断为下降沿触发方式
}
void main()
{
init();
while(1)
{
P2=0;//LED亮
}
}
void int0() interrupt 0 // 中断服务程序
{
P2=0xff;//LED熄灭
Delay(1000);
}