10天学会嵌入式技术之51单片机-day-4
第十二章 中断系统
中断系统是单片机用于处理外部紧急事件的一种机制。中断系统工作的大致流程如下
图所示:当 CPU 正在处理某项任务时,外部发生了某个紧急事件,此时 CPU 会暂停当前
的工作,转而去处理这个紧急事件,处理完之后,再回到原来被中断的位置,继续处理原
来的工作。
中断系统使单片机能够实时响应外部事件,提高了系统的灵活性和响应能力。
关于中断系统,我们先需要了解如下术语:
(1 )中断源
中断源是指能够引发中断的事件。
(2)中断标志位
中断标志位用于标识某个中断是否发生,每个中断源都有一个与之对应的中断标志位。
当某个中断发生时,相应的中断标位就会置为 1,当 CPU 检测到标志位时,就会处理相应的中断。当中断处理完毕后,中断标志位需要复位(置 0),以便接收下一次中断,有些中
断源的标志位,会在 CPU 处理完中断后,自动复位,而有些则需要开发者手动复位,在使
用中断时,需要注意查看手册说明。
(3)中断服务程序
中断服务程序指处理中断的逻辑,当某个中断标志位置 1 时,CPU 会自动执行相应的
中断服务程序。
(4)中断优先级
中断优先级是指在多个中断同时发生时,单片机响应中断的先后顺序,并且高优先级
的中断可以打断低优先级的中断。
12.2中断源
STC89C52RC 共有 8 个中断源,8 个中断源可分为 3 类,3 个类别分别是外部中断、定
时器中断、串口中断,下面简要介绍每种类型。
12.2.1外部中断
(4个:INT0,INT1,INT2,INT3)
外部中断是指由单片机外部的紧急事件触发的中断,通过向单片机的特定引脚发送特
定的信号触发。STC89C52RC 共提供了 4 个外部中断引脚,分别是 INT0,INT1,INT2,
INT3,如下图所示。
51 单片机的外部中断支持两种触发方式,分别是低电平触发和下降沿触发。
12.2.2 定时器中断
(3个:Timer0、Timer1、Timer2)
定时器中断是指由单片机内部的定时器触发的中断。
定时器是大多数单片机都具备的一个功能模块,用于实现定时任务。其用法是,设置
一个定时值,然后开始计时,待计时结束后,触发相应的定时器中断,开发者可以在中断
服务程序中编写定时任务的逻辑。
STC89C52RC 共有三个定时器,分别是 Timer0、Timer1、Timer2,每个定时器都有一
个相对应的中断。
12.2.3 串口中断
串口中断是由单片机串口触发的中断。
串口是单片机用于收发数据的重要接口之一,当单片机通过串口接收到数据或者发送
完数据后都会触发相应的中断。
STC89C52RC 的串口引脚为 TxD 和 RxD,其中 TxD 用于发送数据,RxD 用于接收数
据,如下图所示。
12.3 中断服务程序
中断服务程序是指用于处理中断的一段代码,当中断发生时,CPU 就会暂停当前程序
的执行,转而执行对应的中断服务程序,处理完中断后再恢复到原来的程序。
STC89C52RC 共有 8 个中断源,分为 4 个外部中断、3 个定时器中断和 1 个串口中断,
开发者可以为每个中断源声明相应的中断服务程序,中断服务程序的声明语法如下。
12.4 中断优先级
STC89C52RC 共有四个中断优先级,每个中断源都可以单独设置优先级。若多个中断
同时发生,优先级高的会被优先处理;若两个中断的优先级相同,则根据其中断号决定处
理顺序,中断号越小越优先。
除此之外,高优先级的中断还可以打断低优先级的中断,也就是说当 CPU 正在处理一
个中断时,又发生了另外一个优先级比它还高的中断,此时 CPU 会暂停原来中断的服务程
序,转而去处理这个高优先级的中断,处理完之后,再回到原来低优先级的中断服务程序。
这个机制叫做中断嵌套,STC89C52RC 支持两级中断嵌套。
第 13 章 外部中断——按键控制 LED 亮灭
13.1 需求描述
使用外部中断的方式,通过 SW3 按键控制 LED1 的亮灭
13.2 硬件设计
若想通过外部中断的方式检测按钮,必须将按钮接入 4 个外部中断引脚之一,如下图
所示,可以看到 SW3 可用于触发外部中断 0。
13.3 外部中断使用说明
STC89C52RC 的外部中断需要进行如下配置才可使用。
13.3.1 启用中断
默认情况,CPU 会屏蔽所有中断请求,也就是说 CPU 不会响应任何中断请求,要使用
中断,必须先进行启用。
每个中断源是否被启用,是由单片机内部的两个寄存器控制的,这两个寄存器分别是
IE(Interrupt Enable,中断允许)寄存器和 XICON(Auxiliary Interrupt Control,辅助中断
控制)寄存器。
两个寄存器的具体结构如下。
两个寄存器各有 8 位,每位的作用可参考下图(STC89C52 系列中断系统结构图)。
从上图可以看出,STC89C52 系列的中断系统具有两级控制,首先是 EA 总控制位,其
次是每个中断源各自的控制位。因此若需要启用某个中断,需要先将总控制位 EA 置位 1,
再将该中断自身的控制为置为 1。
13.3.2配置外部中断触发方式
STC89C52 系列的外部中断支持两种触发方式,分别是低电平触发和下降沿触发,4 个
外部中断各需要 1 个控制位用于设置触发方式,这 4 个控制位分布于如下两个寄存器中,
分别是 XICON(Auxiliary Interrupt Control,辅助中断控制)寄存器中、TCON(Timer 0
and 1 Control)寄存器,如下图所示。
4 个控制位的具体作用可参考下图(STC89C52 系列中断系统结构图)。
从上图可以看出 IT0~IT3 分别用于设置外部中断 0 到 3 的触发方式,且 0 表低电平触
发,1 表示下降沿触发。
13.3.3 配置中断优先级(可选)
STC89C52 系列的中断系统支持四个优先级,所以每个中断源的优先级都需要通过 2
个控制位进行配置,8 个中断源共需要 16 个控制位,这 16 个控制位分布在如下 3 个寄存器
中,分别是 IPH(Interrupt Priority High,中断优先级高位)寄存器,IP(Interrupt Priority
Low,中断优先级低位)寄存器,XICON(Auxiliary Interrupt Control,辅助中断控制)寄
存器。
三个寄存器的具体结构如下。
13.3.4 定义中断服务程序
外部中断 0 到外部中断 3 的中断号分别是:0、2、6、7,以外部中断 0 为例,其中断
服务程序应定义为
void INT0_Handler() interrupt 0
{
}
13.4 软件设计
13.4.1 实现思路
(1)启用外部中断 0
// 打开中断总开关
EA = 1;
// 打开外部中断 0 开关
EX0 = 1
(2)配置外部中断 0 的触发方式
当前案例选择下降沿触发更为合理,因为选择低电平触发会导致按键按下时,外部中
断一直被重复触发。
// 配置外部中断为下降沿触发
IT0 = 1;
(3)配置中断优先级
当前程序只有一个,优先级可省略不配。
(4)中断服务程序
完成上述配置后,需要根据需求定义中断服务程序,当前需求相对比较简单,中断服
务程序如下。
void INT0_Func() interrupt 0
{// 中断中打开 LED0LED0 = ~LED0;
}
13.4.2 完整代码
#include <STC89C5xRC.H> //包含 STC89C52 的头文件
#define LED0 P00
void Init_INT0()
{// 打开中断总开关EA = 1;// 打开外部中断 0 开关EX0 = 1;// 配置外部中断为下降沿触发IT0 = 1;
}
void main()
{Init_INT0();while (1);
}
/**
* @brief 中断函数中打开 LED0,代表当触发中断时,LED0 会打开。
* 根据我们之前的设置,当按下 SW3 时,P32 为低电平,此时 LED0 打开。
*
* interrupt 0 表示 0 号中断触发时执行该函数的逻辑
* 如果用 C 语言编程,中断查询次序就是中断号
*/
void INT0_Func() interrupt 0
{// 中断中打开 LED0LED0 = ~LED0;
}