第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)。

下面我们来看一下外部中断结构图:

屏幕截图 2024 06 08 114441

图中 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修订,后期不再维护

posted @ 2024-08-20 09:53  hazy1k  阅读(45)  评论(0编辑  收藏  举报