0%

51单片机中断原理及简单应用

我们设想一种状况:有一天你正在看教学♂视频,这时候你老妈突然给你发了条微信“儿砸,干嘛呢”,然后你立马暂停了你的视频,回了句“我,打钱!”。实际上上述过程中就发生了一次中断。

中断的概念

上述过程中,你本来在激动地看着视频,但是一条微信打断了这一切,那条消息就叫做中断源。引起CPU中断的根源叫做中断源,中断源向CPU提出申请,CPU暂时中断事件A(教学视频),转而处理事件B(乞讨),对事件B处理完后,再回到原来中断的地方(即断点)(视频暂停的位置)。实现该过程的部件叫做中断系统。
中断流程图

中断嵌套/中断优先级

上述过程中,你刚打开微信,准备向你妈乞讨,这时候你同学发来一条消息“上号”,你将选择先打把游戏,再回到微信对你妈说“刚刚在学习没看到”,然后再回到教学视频。同学找你发生在你正准备乞讨时,也就是正在执行中断响应时,那么“上号”就是嵌套的更高级的中断。如果上述两个事件同时发生,你还是会先“上号”,那么就认为“上号”的优先级高于“乞讨”。
中断嵌套
那么如何确定两个中断哪个优先级更高呢?这取决于中断优先级寄存器的设置,我们再后面会讲到。

中断源

51单片机共有5个中断源:

  1. INT0:外部中断0,P3.2引脚接入,低电平或下降沿有效;
  2. INT1:外部中断1,P3.3接入,低电平或下降沿有效;
  3. T0:定时器计数器0中断,由T0计数器计满回零引起;
  4. T1:定时器计数器1,T1引起;
  5. TI/RI:串行口中断,串行端口完成一帧字符发送/接收后引起。
中断源 中断优先级 中断号 入口地址
INT0 最高 0 0003H
T0 第二 1 000BH
INT1 第三 2 0013H
T1 第四 3 001BH
TI/RI 最低 4 0023H

中断允许寄存器

中断允许寄存器IE用来设置各中断源的打开与关闭。
中断允许寄存器IE

中断请求标志TCON

控制中断及定时器。
中断请求标志TCON

中断系统的结构

中断系统结构图

上面我们已经介绍了TCON与IE,现在我们来讲一下该结构怎么工作。我们以INT0为例,由上知IT0用来选择外部中断0触发方式,假设我们选择了低电平有效,那当我们遇到低电平,那么进入IE0,当IE0配置为1,即允许中断,在IE寄存器中,EX0也为中断允许控制,当EX0也为1,则进入中断总开关EA,当EA也为1,则进入IP判断优先级,随后执行中断程序。

设置外部中断/编写程序

编写程序设计中断一般有以下几个步骤:

  1. 设置触发中断方式
  2. 设置允许外部中断
  3. 允许总中断
    完成程序后,等待中断发生,机器响应中断并执行服务函数。
    下面我们编写程序,目标是按下独立按键K3是LED等状态转换
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     #include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器
    typedef unsigned int u16; //对数据类型进行声明定义
    typedef unsigned char u8;
    sbit k3=P3^2; //定义按键K3
    sbit led=P2^0; //定义P20口是led
    void delay(u16 i)
    {
    while(i--);
    }
    void Int0Init()
    {
    //设置INT0
    IT0=1;//跳变沿出发方式(下降沿)
    EX0=1;//打开INT0的中断允许。
    EA=1;//打开总中断
    }
    void main()
    {
    Int0Init(); // 设置外部中断0
    while(1);
    }
    void Int0() interrupt 0 //外部中断0的中断函数
    {
    delay(1000); //延时消抖
    if(k3==0)
    {
    led=~led;
    }
    }