Skip to content

1.6 外部中断实验 ​

学习目标:理解中断机制,掌握外部中断 0 的配置,实现按键中断控制 LED 翻转。

实验原理 ​

什么是中断 ​

中断是指 CPU 正在执行主程序时,外部或内部事件触发,CPU 暂停当前程序,转去执行中断服务程序(ISR),处理完后再返回主程序继续执行。

主程序        中断请求        中断服务程序
  │            │
  ├─执行───────┤
  │            ▼
  ├─执行───────► 保存现场
  │            ├─处理中断事件
  ├─返回───────┤
  │            └─恢复现场
  ├─执行───────

中断 vs 查询:

  • 查询:CPU 不断检测标志,浪费 CPU 时间
  • 中断:事件主动通知 CPU,高效实时

51 单片机外部中断 ​

中断源中断号入口地址触发引脚
外部中断 0(INT0)00003HP3.2
定时器 0(T0)1000BH-
外部中断 1(INT1)20013HP3.3
定时器 1(T1)3001BH-
串口(UART)40023H-

中断相关寄存器 ​

寄存器功能
IE中断使能:EA(总开关)、EX0(INT0 使能)
IT0触发方式:0=低电平触发,1=下降沿触发
TCON中断标志:IE0(INT0 中断标志)

触发方式:

  • 低电平触发(IT0=0):INT0 引脚为低电平即触发
  • 下降沿触发(IT0=1):INT0 引脚由高到低跳变触发(推荐)

程序设计 ​

外部中断 0 控制 LED 翻转 ​

c
/****************************************************
 * 实验名称:外部中断0——按键中断翻转LED
 * 功能:按键(接P3.2/INT0)触发中断,LED 翻转
 ****************************************************/
#include <reg51.h>

sbit LED = P1^0;

// 外部中断0 服务函数(关键字 interrupt 0)
void ext0_isr(void) interrupt 0
{
    LED = ~LED;     // 翻转 LED
}

void main(void)
{
    EA = 1;         // 开总中断
    EX0 = 1;        // 使能外部中断0
    IT0 = 1;        // 下降沿触发

    while (1)
    {
        // 主程序可以执行其他任务
        // LED 翻转由中断自动完成
    }
}

电路要点 ​

AT89C51
┌──────┐
│ P3.2 ├──[按键]──GND    (INT0 中断输入)
│ P1.0 ├──[R]──[LED]──VCC(LED 输出)
└──────┘

下降沿触发时,按键按下产生下降沿触发一次中断;按键抖动可能产生多次边沿,可在 ISR 中加少量延时或消抖。

带消抖的中断服务程序 ​

c
void delay(unsigned int ms)
{
    unsigned int i, j;
    for (i = ms; i > 0; i--)
        for (j = 120; j > 0; j--);
}

void ext0_isr(void) interrupt 0
{
    delay(10);      // 简单消抖
    LED = ~LED;
}

关键知识点 ​

知识点说明
interrupt 0C51 关键字,声明中断服务函数,0 为中断号
EA总中断开关(EA=1 允许中断)
EX0外部中断 0 使能位
IT0触发方式:1=下降沿,0=低电平
中断服务函数不能有返回值、不能传参,用 interrupt 关键字声明

中断配置步骤(四步) ​

1. 设置触发方式:IT0 = 1(下降沿)或 0(低电平)
2. 使能中断:EX0 = 1
3. 打开总中断:EA = 1
4. 编写中断服务函数:void isr(void) interrupt 0 { ... }

常见问题 ​

Q1:中断不触发?

  • 检查 EA=1; EX0=1; 是否都已设置
  • 检查触发方式与按键电路是否匹配

Q2:一次按键触发多次?

  • 按键抖动产生多次下降沿,ISR 中加延时消抖
  • 或改用查询方式处理

Q3:中断函数写法不对?

  • 必须用 interrupt 0 关键字
  • 中断函数内部不要用 delay 太久的延时(影响实时性)

实验任务 ​

  1. 外部中断 0 控制 LED 翻转
  2. 扩展:外部中断 0 和 1 分别控制两路 LED
  3. 扩展:用低电平触发方式实现,观察与下降沿触发的区别

考核点 / 验收标准 ​

考核项验收标准分值
中断配置正确完成 IT0/EX0/EA 中断四步配置30
服务函数正确编写 interrupt 0 中断服务函数30
触发方式理解并实现下降沿/低电平两种触发20
消抖处理中断方式下按键抖动处理正确20

实操要求:现场实现外部中断 0 与 1 分别控制两路 LED。

aioteer · 物联网专业课程群

💬AI 伴学配置