Skip to content

定义与目的

  1. 定义:打断 CPU 当前工作的一个事件,这个事件的结合称为中断源。
  2. 目的:让 CPU 完成多任务工作。

中断源

  1. 打断 CPU 当前工作的事件集合称为中断源。
  2. 标准 51 单片机有 3 大类共 5 种中断源。
    • 外部中断:
      • 外部中断 0
      • 外部中断 1
    • 定时/计数器中断:
      • 定时/计数器 0 中断
      • 定时/计数器 1 中断
    • 串型类中断

外部中断

通过单片机引脚输入的中断信号。

数字信号的分类

  1. 电平信号
    • 高电平
    • 低电平
  2. 边沿信号
    • 上升沿信号
    • 下降沿信号

请求信号类型

51 单片机只支持低电平和下沿信号两种外部中断信号请求类型。

对应引脚

  1. 外部中断 0:12 引脚的第二功能。

  2. 外部中断 1:13 引脚的第二功能。

使用外部中断的步骤

  1. 开中断:51 单片机中断默认是关着的,开启后 12、13 引脚启动第二功能,第一功能作废。
  2. 设置中断请求的信号类型:低电平/下降沿。
  3. 中断处理函数。

开启中断 - IE 寄存器

  1. 作用:IE 寄存器是一个 8 位寄存器,用作控制中断开关。

  2. 各个位的作用

    '暂无图片'

    • EA:中断总开关
    • ES:串型中断
    • ET1:定时计数器 1 中断开关
    • EX1:外部中断 1 开关
    • ET0:定时计数器 0 中断开关
    • EX0:外部中断 0 开关
  3. 状态控制:0-关闭 1-开启。例,开启外部中断 0,IE 寄存器中的值为:0x81

  4. IE 寄存器可以进行位寻址,并且在头文件中已将 EA、ES 等进行定义和初始化,下面代码表示开启外部中断 1

    c
    EA = EX1 = 1;

设置中断请求信号类型 - TCON 寄存器

  1. 作用:设置中断请求信号类型(低电平/下降沿)

  2. 各个位的作用

    '暂无图片'

    • 高四位:设置定时计数器
    • IT0:外部中断 0 的请求信号类型。0-低电平 1-下降沿。
    • IE0:外部中断 0 的使能信号。
    • IT1:外部中断 1 的请求信号类型。0-低电平 1-下降沿。
    • IE1:外部中断 1 的使能信号。

中断处理子函数

  1. 特点

    • 无带入值、无返回值
    • 无需声明,直接使用。一般情况下定义到 main 函数下面。
    • 必须要有中断向量号
    • 中断处理子函数永远不能由其他函数调用。
  2. 中断向量

    • 中断处理函数与其他自定义函数唯一的区别在于中断函数具有中断向量。
    • 关键字:interrupt
    • 中断号
      • interrupt 后面跟着的号码称为中断号,取值范围 [0,4]
      • 0 - 外部中断 0
      • 1 - 定时计数器 0 中断
      • 2 - 外部中断 1
      • 3 - 定时计数器 1 中断
      • 4 - 串型中断
  3. 例题

    • 定义一个外部中断 0 的中断处理子函数

      c
      void inter0(void) interrupt 0 {
      	……
      }
    • 定义一个定时计数器 1 中断的中断处理子函数

      c
      void inter1(void) interrupt 3 {
      	……
      }
  4. 通常情况下,中断处理子函数第一句代码是关闭当前中断开关,也就是修改 IE 寄存器中的值,相当于挂上一个免战牌;最后一句代码是重新开启中断开关。

  5. 例题:通过外部中断按钮切换 LED 亮灭。

    c
    #include <STC12C5A60S2.H>
    typedef unsigned int UI;
    typedef unsigned char UC;
    sbit KET = P3 ^ 2;
    sbit LED = P1 ^ 0;
    
    void init(void) {
        EA = 1;
        EX0 = 1;
        IT0 = 0;
    }
    
    void timer(UI i) {
        UI j;
        while (i--) for (j = 600; j > 0; j--);
    }
    
    void main(void) {
        init();
        while (1);
    }
    
    void ExtInt0(void) interrupt 0 {
        EX0 = 0;
        timer(10);
        if (!KEY) LED = ~LED;
        EX0 = 1;
    }

基于 MIT 许可发布