中断系统是单片机的核心功能之一,通过中断可以实现按键检测(外部中断)、定时任务(定时器中断)、串口通信(串口中断)等工作,完成对外部事件或内部事件的快速响应。
本文以AT89C51为例,对单片机的中断系统做介绍:
一、中断源与中断优先级:
1.1 AT89C51共有5个中断源:
外部中断 0 (INT0),定时器 0 (TF0),外部中断 1 (INT1),定时器 1 (TF1),串口中断 (RI/TI)。
1.2 中断优先级规则:
同级中断:按默认优先级顺序响应(INT0 > TF0 > INT1 > TF1 > 串口)。
不同级中断:高优先级可打断低优先级中断(中断嵌套)。
二、中断相关寄存器:
2.1 TCON(Timer Control Register,地址 0x88)
-
控制外部中断触发方式和中断标志。
-
关键位(8位):
IT0(TCON.0):设置 INT0 触发方式(0=低电平触发,1=下降沿触发)。
IE0(TCON.1):INT0 中断标志(硬件置位,需软件清零)。
IT1(TCON.2):设置 INT1 触发方式(0=低电平触发,1=下降沿触发)。
IE1(TCON.3):INT1 中断标志。
TR0(TCON.4):对定时器0初始值的设定。
TF0(TCON.5):定时器 0 溢出标志。
TR1(TCON.6):对定时器1初始值的设定。
TF1(TCON.7):定时器 1 溢出标志。
2.2 IE(Interrupt Enable,地址 0xA8)
-
中断使能控制寄存器。
-
关键位(8位):
EX0(IE.0):INT0 中断使能。
ET0(IE.1):定时器 0 中断使能。
EX1(IE.2):INT1 中断使能。
ET1(IE.3):定时器 1 中断使能。
ES(IE.4):串口中断使能。
EA(IE.7):总中断开关(1=允许中断,0=禁止所有中断)。
2.3 IP(Interrupt Priority,地址 0xB8)
-
设置中断优先级(0=低优先级,1=高优先级)。
-
关键位:PX0、PT0、PX1、PT1、PS。
三、中断的处理流程:
1.中断触发:
当某个中断源满足条件触发(如引脚电平变化、定时器计数溢出等),硬件自动置位对应的中断标志位(如 IE0、TF0 等)。
2.中断响应条件:
-
总中断允许(EA=1)。
-
中断源对应的中断使能位(如 EX0)为 1。
-
无更高优先级中断正在执行。
3.跳转到中断服务程序(ISR):
CPU 将程序计数器(PC)指向对应的中断向量地址,执行 ISR。
4.清除中断标志:
-
定时器中断(TF0/TF1):硬件自动清除标志。
-
外部中断(IE0/IE1):需软件清零。
-
串口中断(RI/TI):需软件清零。
四、中断服务程序函数:
1.中断向量表存储了每个中断源对应的中断服务程序的入口地址。当某个中断发生时,CPU会根据中断号查找相应的中断向量,跳转到对应的中断服务程序执行。
2.using n 是用来选择工作寄存器组。Interrupt n 中的n指的是中断号。using n一般可以不写。
五、外部中断:
接下来以外部中断0为例,写外部中断0配置(采用下降沿触发):
#include<reg51.h>
void main()
{
EA = 1; //开启总中断开关
EX0 = 1; //开启INT0中断开关
IT0 = 0; //INT0采用下降沿触发中断
while(1); //主循环
}
void INT0_ISR() interrupt 0
{
P1 = 0X00; //写用户需要的功能代码,这里例如将P1口引脚全部置低电平
IE = 0; //清除中断标志
}
首先配置中断的初始化函数,打开中断。然后再配置中断的主体函数。
六、定时器中断:
后面讲
七、串口中断:
后面讲