前言
51单片机中断系统简单介绍
快速对照表
| 中断名称 | 中断源 | 中断向量地址 | 中断号 | 优先控制 | 标志位 | 控制位 |
|---|---|---|---|---|---|---|
| 外部中断0 | INT0 | 0x0003 | 0 | PX0 | IE0 | EX0 |
| 定时计数器0 | T0 | 0x000B | 1 | PT0 | TE0 | ET0 |
| 外部中断1 | INT1 | 0x0013 | 2 | PX1 | IE1 | EX1 |
| 定时计数器1 | T1 | 0x001B | 3 | PT1 | TE1 | ET1 |
| 串行口中断 | UART | 0x0023 | 4 | PS | RI+TI | ES |
IE中断允许寄存器
IE是一个8位寄存器,支持位寻址,地址为0xA8,每一位的定义如下:
| 名称 | 地址 | 说明 |
|---|---|---|
| EA | B7 | CPU总中断允许控制位,为1时才允许CPU响应任意中断 |
| - | B6 | 51单片机中未使用 |
| - | B5 | 51单片机中未使用 |
| ES | B4 | 串行口中断允许位,为1时启用串行口中断 |
| ET1 | B3 | 定时计数器T1中断允许位,为1时启用定时计数器中断1 |
| EX1 | B2 | 外部中断1允许位,为1时启用外部中断1 |
| ET0 | B1 | 定时计数器T0中断允许位,为1时启用定时计数器中断0 |
| EX0 | B0 | 外部中断0允许位,为0时启用外部中断1 |
“位寻址”的意思是可以只访问8位寄存器的某1位。
“B7”代表寄存器的第7位,以此类推。
IP中断优先级控制寄存器
IP是一个8位寄存器,支持位寻址,地址为0xB8,每一位的定义如下:
| 名称 | 地址 | 说明 |
|---|---|---|
| - | B7 | 51单片机中未使用 |
| - | B6 | 51单片机中未使用 |
| - | B5 | 51单片机中未使用 |
| PS | B4 | 串行口中断优先级控制位,为1时设为高优先级 |
| PT1 | B3 | 定时计数器T1中断优先级控制位,为1时设为高优先级 |
| PX1 | B2 | 外部中断1优先级控制位,为1时设为高优先级 |
| PT0 | B1 | 定时计数器T0中断优先级控制位,为1时设为高优先级 |
| PX0 | B0 | 外部中断0优先级控制位,为1时设为高优先级 |
- 51单片机的中断共有2级,高优先级和低优先级,默认为低优先级
- 使用中断优先级控制寄存器
IP可以设置某一些中断为高优先级 - 同级中断响应顺序(从上到下):
INT0:外部中断0T0:定时计数器中断0INT1:外部中断1T1:定时计数器中断1UART:串行口中断- 高优先级的中断可以中断低优先级的中断,反之不行
- 中断在响应过程中会屏蔽同级别的其他中断,即相同优先级的中断无法再次引发中断(除非中断响应程序执行完)
TCON定时计数器中断控制寄存器
IP是一个8位寄存器,支持位寻址,地址为0x88,每一位的定义如下:
| 名称 | 地址 | 说明 |
|---|---|---|
| TF1 | B7 | T1溢出中断标志,定时计数器产生溢出时由硬件置1,中断响应完成后置0 |
| TR1 | B6 | 定时器1的运行控制位,为1时启动定时器1,定时器开始计时 |
| TF0 | B5 | T0溢出中断标志,定时计数器产生溢出时由硬件置1,中断响应完成后置0 |
| TR0 | B4 | 定时器0的运行控制位,为1时启动定时器0,定时器开始计时 |
| IE1 | B3 | 外部中断1中断标志,为1时代表外部中断向CPU请求中断,中断响应完成后置0 |
| IT1 | B2 | 外部中断1中断源类型选择,为0时响应上升/下降沿信号,为1时仅响应下降沿信号 |
| IE0 | B1 | 外部中断0中断标志,为1时代表外部中断向CPU请求中断,中断响应完成后置0 |
| IT0 | B0 | 外部中断0中断源类型选择,为0时响应上升/下降沿信号,为1时仅响应下降沿信号 |

中断程序例子
原则上中断服务子程序的执行速度要越快越好,以防阻塞其他中断。
#include <AT89X51.h>
//初始化INT0
void initINT0()
{
EA = 1; //开启中断
EX0 = 1; //开启外部中断0
IT0 = 0; //收到响应上升/下降沿信号产生中断
}
//INT0中断服务子函数,后面的0是INT0的中断号
void INT0Interrupt() interrupt 0
{
P2 = ^P2; //反转P2口的输出
}
//主程序
void main()
{
initINT0(); //初始化INT0
for (;;) //死循环,防止程序结束
{
}
}本文链接:https://blog.chrxw.com/archives/2020/04/05/1178.html
转载请保留本文链接,谢谢