前言

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:外部中断0
  • T0:定时计数器中断0
  • INT1:外部中断1
  • T1:定时计数器中断1
  • UART:串行口中断
  • 高优先级的中断可以中断低优先级的中断,反之不行
  • 中断在响应过程中会屏蔽同级别的其他中断,即相同优先级的中断无法再次引发中断(除非中断响应程序执行完)

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 (;;)    //死循环,防止程序结束
    {
    }
}
最后修改:2020 年 04 月 08 日
如果觉得我的文章对你有用,请随意赞赏