您现在的位置是:首页 >技术教程 >51单片机的中断系统网站首页技术教程
51单片机的中断系统
一、中断系统概述
中断是指当某个事件(外部或内部触发)发生时,CPU暂停当前任务,转去处理该事件,处理完成后返回原任务继续执行。51单片机的中断系统支持5个中断源,分为2个优先级。
二、中断源
用来打断主程序的事件称为中断源
51单片机共有5个中断源,按优先级从高到低依次为:
1. 外部中断0(INT0):由P3.2引脚触发。
2. 定时器/计数器0中断(TF0):定时器0溢出或计数完成时触发。
3. 外部中断1(INT1):由P3.3引脚触发。
4. 定时器/计数器1中断(TF1):定时器1溢出或计数完成时触发。
5. 串口中断(RI/TI):串口接收完成(RI)或发送完成(TI)时触发。
三、中断相关寄存器
51单片机通过以下寄存器控制中断:
1. 中断允许寄存器(IE)
- 控制中断的开启与关闭。
- 地址:`0xA8`,支持位寻址。
- 各位定义:
EA : 全局中断使能(1=开启,0=关闭)
ET2 : 定时器2中断使能(仅某些型号支持)
ES : 串口中断使能
ET1 : 定时器1中断使能
EX1 : 外部中断1使能
ET0 : 定时器0中断使能
EX0 : 外部中断0使能
2. 中断优先级寄存器(IP)
- 设置中断优先级(高或低)。
- 地址:`0xB8`,支持位寻址。
- 各位定义:
PT2 : 定时器2优先级(高=1)
PS : 串口中断优先级
PT1 : 定时器1优先级
PX1 : 外部中断1优先级
PT0 : 定时器0优先级
PX0 : 外部中断0优先级
3. 定时器控制寄存器(TCON)
- 控制外部中断触发方式。
- 地址:`0x88`,支持位寻址。
- 关键位:
IT0 : 外部中断0触发方式(0=低电平,1=下降沿)
IT1 : 外部中断1触发方式(同上)
IE0/IE1 : 外部中断0/1标志位(硬件自动置1,需软件清零)
4. 串口控制寄存器(SCON)
- 控制串口中断标志。
- 地址:`0x98`,支持位寻址。
- 关键位:
RI : 接收完成标志(需软件清零)
TI : 发送完成标志(需软件清零)
四、中断优先级
- 51单片机支持两级优先级:高优先级和低优先级。
- 优先级规则:
1. 高优先级中断可打断低优先级中断。
2. 同优先级中断按自然优先级顺序执行(INT0 > TF0 > INT1 > TF1 > RI/TI)。
3. 正在执行的中断不能被同优先级中断打断。
五、中断处理流程
1. 中断触发:事件发生,硬件置位中断标志(如TCON中的IE0)。
2. 中断响应:CPU检测到中断请求,若中断已开启(EA=1且对应中断使能位=1),则执行中断服务程序(ISR)。
3. 中断服务程序:
- 跳转到对应的中断向量地址(如INT0为`0x0003`)。
- 执行用户编写的ISR代码。
- 退出前需清除中断标志(如RI/TI需软件清零)。
4. 中断返回:执行`RETI`指令,恢复原程序执行。
六、中断向量地址
每个中断源有固定的入口地址:
- INT0 : `0x0003`
- TF0 : `0x000B`
- INT1 : `0x0013`
- TF1 : `0x001B`
- RI/TI : `0x0023`
在C语言中,可通过`interrupt`关键字指定中断号:
c
void ISR_Name() interrupt 0 { // 0对应INT0
// 中断处理代码
}
七、中断配置步骤
以外部中断0(INT0)为例:
1. 设置触发方式:`IT0 = 1`(下降沿触发)。
2. 开启中断:
c
EA = 1; // 开启全局中断
EX0 = 1; // 开启外部中断0
3. 编写中断服务函数:
c
void INT0_ISR() interrupt 0 {
// 处理中断
// 无需手动清除IE0(硬件自动完成)
}
八、常见问题
1. 中断不触发:检查EA是否开启,中断标志是否清除。
2. 中断冲突:合理设置优先级,避免高优先级中断长时间占用CPU。
3. 中断标志未清除:如串口中断需手动清除RI/TI。
九、注意事项
- 中断服务函数尽量简短,避免使用延时函数。
- 多个中断共享变量时,需使用`volatile`关键字防止编译器优化。
- 优先级设置需根据实际需求合理分配。
通过灵活配置中断系统,51单片机可以实现高效的实时控制,适用于按键检测、定时任务、通信等场景。