IO中断笔记
一、IO中断的核心特点
- 全面支持:STC32G系列所有IO口均可设置为中断引脚
- 四种模式:支持下降沿、上升沿、低电平、高电平四种中断触发模式
- 独立配置:每组IO都有独立的中断入口地址,每个IO口可独立设置中断模式
二、当前版本限制
- 建议模式:当前版本建议只使用低电平中断和高电平中断
- 避免使用:暂时不要使用下降沿和上升沿中断模式
三、与外部中断的区别
- 传统外部中断:仅特定引脚支持,触发方式有限
- IO中断:所有IO口均可中断,功能更强大,配置更灵活
- 创新性:IO中断是STC32G单片机的创新功能,为8051单片机首次引入
一、关键寄存器
-
中断模式配置寄存器
-
中断使能寄存器
-
中断标志寄存器
PnINTF:中断标志位,需要软件清零
- 进入中断后必须手动清除标志位
二、编程步骤(以P3.5低电平中断为例)
// 1. 配置中断模式
P3IM1 = 0x20; // P3.5高电平使能
P3IM0 = 0x00; // P3.5低电平中断
// 2. 使能中断
P3INTE = 0x20; // 使能P3.5中断
// 3. 开启总中断
EA = 1;
三、中断服务函数编写
void P3_ISR() interrupt 40 // P3口中断号为40
{
unsigned char int_flag;
// 读取中断标志
int_flag = P3INTF;
// 清除中断标志(必须软件清零)
P3INTF = 0x00;
// 判断具体哪个引脚触发中断
if(int_flag & 0x20) // P3.5触发
{
// 中断处理代码
// 注意:中断服务函数中尽量避免使用延时!
}
}
四、中断向量号扩展
- 问题:C251编译器默认只支持0-31号中断
- 解决方案:
- 安装扩展工具:从STC官网下载"标准C251中断向量扩展"工具
- 汇编跳转:借用13号保留中断入口进行跳转(不推荐初学者)
中断优先级设置
- 问题现象:当多个中断同时存在时,低优先级中断可能影响高优先级任务
- 示例:数码管刷新(定时器中断)被IO中断打断,导致显示闪烁
二、优先级配置方法
-
优先级寄存器
-
优先级级别:0-3级(0最低,3最高)
-
示例:设置定时器0为最高优先级
IP = 0x02; // PT0=1,定时器0优先级设为1(二进制0010)
IPH = 0x00; // PT0H=0,与IP组合形成优先级
// 实际优先级 = (IPH << 1) | IP = 2(十进制)
三、优先级规则
- 高优先级打断低优先级:正在执行低优先级中断时,高优先级中断可以打断它
- 同优先级顺序执行:相同优先级时,按中断号顺序执行
- 中断号小的优先:同优先级下,中断号小的先执行
四、实际应用
- 定时器中断:通常设置为高优先级,确保实时任务不被中断
- IO中断:根据实际需求设置优先级,紧急事件(如急停按钮)应设高优先级
实战项目 - 简易中央门禁控制系统
一、项目需求
- 基本功能:8个按键控制8个门锁状态(LED表示)
- 应急功能:按下应急按钮立即打开所有门锁
- 安全保护:应急状态下,普通门锁操作被禁止
- 恢复机制:松开应急按钮后,5秒倒计时恢复原状态
二、核心代码实现
1. 全局变量定义
unsigned char door_lock = 0xFF; // 门锁状态,初始全部上锁
unsigned int time_countdown = 0; // 倒计时变量
2. 主循环中的处理
// 每10ms执行一次
if(time_countdown > 0)
{
time_countdown--; // 倒计时减1
// 数码管显示倒计时(秒)
seg0 = (time_countdown / 100) + 1;
if(time_countdown == 0)
{
// 倒计时结束,恢复门锁状态
// 此处可根据需要恢复之前的状态
}
}
else
{
// 正常状态下处理按键
key = MatrixKey(); // 读取矩阵按键
if(key != 0)
{
// 根据按键值切换对应门锁状态
door_lock ^= (1 << (key - 1));
LED = door_lock; // 更新LED显示
}
}
3. 应急按钮中断处理(P3.5低电平中断)
void P3_ISR() interrupt 40
{
unsigned char int_flag = P3INTF;
P3INTF = 0x00; // 清除中断标志
if(int_flag & 0x20) // P3.5触发
{
// 应急处理:打开所有门锁
door_lock = 0x00;
LED = door_lock;
// 启动5秒倒计时(500 * 10ms)
time_countdown = 500;
// 数码管显示"5"
seg0 = 5;
// 蜂鸣器提示
Beep(100);
}
}
三、项目亮点
- 实时响应:应急按钮使用IO中断,立即响应
- 状态保护:应急状态下禁止普通操作,防止误操作
- 安全恢复:5秒倒计时提供安全缓冲时间
- 可视化反馈:LED显示门锁状态,数码管显示倒计时