第15章 外部中断实验
第十五章 外部中断实验
1. 导入
通过学习中断系统介绍,我们知道51 单片机外部中断有 2 个, 外部中断 0 和外部中断 1, 它们的使用方法是一样的, 所以只要学会一个即可掌握所有外部中断使用。 本章所要实现的功能是: 使用独立按键 K3 控制 LED 亮灭, K3 连接外部中断 0( P3.2) 管脚。
2. 外部中断介绍
简单回顾一下51单片机的中断:当中央处理机 CPU 正在处理某件事的时候外界发生了紧急事件请求, 要求CPU 暂停当前的工作, 转而去处理这个紧急事件, 处理完以后, 再回到原来被中断的地方, 继续原来的工作, 这样的过程称为中断。
STC89C5X 系列单片机提供了 4 个外部中断: 外部中断 O(INTO)、 外部中断1(INT1)、 外部中断 2(INT2)、 外部中断 3(INT3)。
下面我们来看一下外部中断结构图:
图中 INT0 和 INT1 即为外部中断 0 和外部中断 1 输入口。
-
INT0 对应的是 P3.2 口的附加功能, 可由 IT0(TCON.0)选择其为低电平有效还是下降沿有效。 当 CPU 检测到 P3.2 引脚上出现有效的中断信号时, 中断标志 IE0(TCON.1)置 1, 向 CPU 申请中断。
-
INT1 对应的是 P3.3 口的附加功能, 可由 IT1(TCON.2)选择其为低电平有效还是下降沿有效。 当 CPU 检测到 P3.3 引脚上出现有效的中断信号时, 中断标志 IE1(TCON.3)置 1,向 CPU 申请中断。
更多可以参考:外部中断_百度百科 (baidu.com)
51单片机---中断介绍(外部中断的使用,含源码,小白可入)_51单片机外部中断-CSDN博客
3. 外部中断配置
通过学习我们知道要让51单片机发生中断必须要满足以下3个条件:
-
中断源有中断请求
-
此中断源的中断允许位为1
-
CPU开中断(EA=1)
比如我们配置外部中断0,对于的配置程序:
EA = 1; // 打开总中断开关
EX0 = 1; // 开外部中断0
ITO = 0/1; // 设置外部中断的触发方式
如果我们需要配置外部中断1,只需要把EX0改成EX1,ITO改成ITI就行了。
因为独立按键一端是共地的, 当按下后对应单片机 IO 口被拉低, 而默认单片机 IO 口是高电平, 这样就有一个下降沿过程, 所以通常使用外部中断都是配置为下降沿触发, 即 IT0=1;
为了方便管理,我们通常将外部中断的配置放到一个自定义函数内方便管理:
void exit0_init()
{
IT0 = 1; // 跳变沿触发方式(下降沿)
EX0 = 1; // 打开INT0的中断1允许
EA = 1; // 打开总中断
}
当触发中断后会立即进入中断服务函数,如下:
void exit() interrupt 0 // 外部中断函数
{
// 编写我们要实现的功能
}
在中断函数中 exit 是函数名, 可自定义, 但必须符合 C 语言标识符定义规则, interrupt 是一个关键字, 表示 51 单片机中断。 后面的“ 0” 是中断号, 外部中断 0 中断号为 0, 如果是外部中断 1, 则中断号为 2。
4. 硬件设计
本实验使用到硬件资源如下:
-
独立按键模块( K3)
-
LED 模块( D1)
LED 模块和独立按键模块电路在前面章节已介绍过, 这里就不多说。 可将 K3键连接在单片机 P3.2 口( 外部中断 0) , K4 按键连接在 P3.3 口( 外部中断 1) 。D1 指示灯连接在单片机 P2.0 口。
5. 软件设计
本章所要实现的功能是: 使用独立按键 K3 控制 LED 亮灭。
#include <REGX52.H>
//定义LED1管脚
sbit LED1 = P2^0;
//定义独立按键K3控制脚
sbit KEY3 = P3^2;
// 延时函数
void delay_10us(unsigned int ten_us)
{
while(ten_us--);
}
// 外部中断0配置函数
void exti0_init()
{
IT0 = 1; // 下降沿有效
EX0 = 1; // 启用中断0
EA = 1; // 开启总中断
}
// 当出现中断执行下面的函数
void exti0() interrupt 0 // 外部中断0中断函数
{
delay_10us(1000); // 消抖
if(KEY3 == 0) // 判断K3键是否按下
LED1 = !LED1; // LED1状态翻转
}
void main()
{
exti0_init();//外部中断0配置
while(1)
{
}
}
这个程序还是比较好理解, 首先定义 K3 键与 LED1 的控制管脚, 然后定义了外部中断 0 配置函数 exti0_init, 该函数内容是按照前面介绍的配置方法实现, 即开启总中断、 外部中断 0 功能, 设置外部中断 0 为下降沿触发。 然后进入 while循环, 在循环体内没有执行任何功能程序。
有人就会问, 在主函数中怎么没有看到按键对 LED 的控制呢? 因为我们在exti0_init()函数内就已经把按键管脚配置为外部中断 0 下降沿触发, 当有按键按下, 即会进入对应中断服务函数执行相应的功能程序, LED 的控制就在中断函数内完成的。
6. 小结
中断系统其实还是比较难的,因为我这里是使用控制LED所以看起来比较简单。我们重点是要理解中断系统还有怎么配置。流程可以参考如下:
-
首先定义我们需要的管脚
-
配置中断系统
-
写中断函数,即发生中断了需要单片机做什么事情
-
主函数调用一下中断函数
我们前面的实验都可以用中断系统来改造,有时间不妨练习一下
2024.7.20修订,后期不再维护