1.6 外部中断实验
学习目标:理解中断机制,掌握外部中断 0 的配置,实现按键中断控制 LED 翻转。
实验原理
什么是中断
中断是指 CPU 正在执行主程序时,外部或内部事件触发,CPU 暂停当前程序,转去执行中断服务程序(ISR),处理完后再返回主程序继续执行。
主程序 中断请求 中断服务程序
│ │
├─执行───────┤
│ ▼
├─执行───────► 保存现场
│ ├─处理中断事件
├─返回───────┤
│ └─恢复现场
├─执行───────中断 vs 查询:
- 查询:CPU 不断检测标志,浪费 CPU 时间
- 中断:事件主动通知 CPU,高效实时
51 单片机外部中断
| 中断源 | 中断号 | 入口地址 | 触发引脚 |
|---|---|---|---|
| 外部中断 0(INT0) | 0 | 0003H | P3.2 |
| 定时器 0(T0) | 1 | 000BH | - |
| 外部中断 1(INT1) | 2 | 0013H | P3.3 |
| 定时器 1(T1) | 3 | 001BH | - |
| 串口(UART) | 4 | 0023H | - |
中断相关寄存器
| 寄存器 | 功能 |
|---|---|
| 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 0 | C51 关键字,声明中断服务函数,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 太久的延时(影响实时性)
实验任务
- 外部中断 0 控制 LED 翻转
- 扩展:外部中断 0 和 1 分别控制两路 LED
- 扩展:用低电平触发方式实现,观察与下降沿触发的区别
考核点 / 验收标准
| 考核项 | 验收标准 | 分值 |
|---|---|---|
| 中断配置 | 正确完成 IT0/EX0/EA 中断四步配置 | 30 |
| 服务函数 | 正确编写 interrupt 0 中断服务函数 | 30 |
| 触发方式 | 理解并实现下降沿/低电平两种触发 | 20 |
| 消抖处理 | 中断方式下按键抖动处理正确 | 20 |
实操要求:现场实现外部中断 0 与 1 分别控制两路 LED。