第 6 篇:中断——让单片机同时做多件事
目前的程序有个大问题:delay() 占着 CPU 不放,期间什么都干不了。中断就是解法。
1. 用生活例子理解中断
你正在看书(主程序)
电话响了(中断发生)
↓
放下书,接电话(执行中断服务函数)
↓
挂电话,继续看书(返回主程序)
整个过程你不需要一直盯着电话——打电话的人会主动通知你。
2. STC89C52 的 5 个中断源
| INT0 (P3.2) | 外部引脚电平变化 | 按键、传感器报警 |
| INT1 (P3.3) | 外部引脚电平变化 | 同上 |
| 定时器 0 | 定时器溢出 | 精确定时 |
| 定时器 1 | 定时器溢出 | 精确定时、波特率发生器 |
| 串口 | 收到/发完数据 | 串口通信 |
3. 外部中断配置
void exti0_init(void)
{
IT0 = 1; // 下降沿触发(1→0 的瞬间)
EX0 = 1; // 使能 INT0 中断
EA = 1; // 开总中断
}
// 中断服务函数(函数名固定,不能改)
void int0_isr(void) interrupt 0 // 0 = 中断向量号
{
LED = ~LED; // 按一次键(P3.2),LED 状态取反
}
4. 完整的按键中断控制程序
#include <reg52.h>
sbit LED = P1^0;
void exti0_init(void) { IT0=1; EX0=1; EA=1; }
void int0_isr(void) interrupt 0
{
LED = ~LED; // 翻转 LED
}
void main()
{
exti0_init();
LED = 1;
while (1)
{
// 主循环什么都不用做!
// 按键响应全在中断里完成
}
}
不需要 delay 消抖? 外部中断是硬件检测电平边沿,机械抖动的多个边沿…也会触发多次中断。解决:在中断里软件消抖。
5. 中断优先级
默认优先级:INT0 > Timer0 > INT1 > Timer1 > Serial
如果 INT0 正在执行,Timer0 又触发 → Timer0 排队等
如果 Timer0 和 INT1 同时触发 → Timer0 先执行
6. 小结
- 中断 = 硬件帮你"盯着",不用写死循环检测
- 51 单片机有 5 个中断源,外部 INT0/INT1 最常用
- 中断服务函数用 interrupt N 声明
- 中断让主循环可以"空闲"——实际上是解放了 CPU
下一篇:定时器——精确控制时间
下一篇:定时器——精确控制时间


