欢迎光临
我们一直在努力

51单片机从零到实战(6)——新手最难理解的中断

第 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

下一篇:定时器——精确控制时间


下一篇:定时器——精确控制时间

赞(0)
未经允许不得转载:171主机测评 » 51单片机从零到实战(6)——新手最难理解的中断
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址