51单片机学习之中断系统


概念基础

什么是中断

当你正在看动漫时,突然手机来电话了,你暂停动漫,去接电话,在接电话的时候,又有人敲门,你暂时放下电话,去开门。我们可以把看动漫当作在执行主程序,那么电话就是中断源,电话铃响了就是中断请求,暂停动漫即是现场保护,接电话就是中断响应,有敲门声就是更高一级的中断请求,去开门则是中断嵌套,把门打开继续接电话就是中断返回,电话OK后继续看动漫则是现场恢复

内核与外设之间的主要交互方式有两种轮询中断,轮询工作效率极低,而且不具有响应紧急事件的功能;中断系统则使内核具备了应对突发事件的能力。

中断既然可以处理紧急事件,也就是不知道中断什么时候发生,所以每个中断都需要一个中断入口地址,即为中断向量,这样的话,无论中断什么时候发生,它都有一个确定的程序执行初始点。中断响应之后,执行的那段程序称之为中断服务函数,顾名思义它是专门为这个中断服务的。

51单片机的中断系统

80C51的中断系统有5个中断源 (忽略定时/计数器2) ,2个优先级,可实现二级中断嵌套。

中断源 中断标志 中断向量(地址) 优先级 序号(C语言)
外部中断0 INT0 IE0 0003H 1 0
定时/计数器0 T0 TF0 000BH 2 1
外部中断1 INT1 IE1 0013H 3 2
定时/计数器1 T1 TF1 001BH 4 3
串口中断 RI/TI 0023H 5 4

中断系统结构

从前面的介绍我们可以知道,不管主程序执行到什么地方,只要外部中断0产生请求,内核就要响应该中断,就回到0003H这个地址去执行代码。如果使用汇编语言,则要记住每个中断源对应的地址;C语言则需要记住序号即可。

中断控制

4个特殊功能寄存器来实施中断控制:

  • 中断允许寄存器 IE (Interrupt Enable )
  • 中断优先级寄存器 IP ( Interrupt Priority )
  • 定时/计数器及外部中断控制寄存器 TCON
  • 串口控制寄存器 SCON

中断响应条件:

  • 中断源有中断请求
  • 此中断源的中断允许位为1
  • CPU中断允许位为1

中断允许寄存器 IE

位序 7 6 5 4 3 2 1 0
名称 EA - - ES ET1 EX1 ET0 EX0
控制位(0禁止,1允许) 总开关 串口 定时器1 外部中断1 定时器0 外部中断0
位地址 AFH ACH ABH AAH A9H A8H

中断优先级寄存器 IP

位序 7 6 5 4 3 2 1
名称 - - - PS PT1 PX1 PT0 PX0
优先级控制位(0低,1高) 串口 定时器1 外部中断1 定时器0 外部中断0
位地址 BCH BBH BAH B9H B8H

定时/计数器的控制寄存器 TCON

位序 7 6 5 4 3 2 1 0
位名称 TF1 TR1 TF0 TR0 IE0 IT1 IE0 IT0
  • TF1:定时/计数器T1溢出中断请求位(0:无中断请求,1:有中断请求)
  • TR1:定时/计数器T1启动位(0:停止定时/计数器,1:启动定时/计数器)
  • TF0:定时/计数器T0溢出中断请求位
  • TR0:定时/计数器T0启动位
  • IE1:外部中断1请求标志位
  • IT1:外部中断1触发方式控制位(0:低电平触发,1:下降沿触发)
  • IE0:外部中断0请求标志位
  • IT0:外部中断0触发方式控制位(0:低电平触发,1:下降沿触发)

下降沿

电平从高电平(数字“1”)变为低电平(数字“0”)的那一瞬间叫作下降沿。

串行口控制寄存器 SCON

位序 7 6 5 4 3 2 1 0
位名称 - - - - - - TI RI
  • TI:串行接口发送完成中断请求标志位( 响应中断时需手动软件清除)
  • RI:串行接口接收完成中断请求标志位( 响应中断时需手动软件清除)

一次中断的完整步骤

  1. 中断请求

    中断事件一旦发生,中断源提交中断请求(将中断标志位置为1),欲请求CPU暂停目前的工作,转向为该中断作专项服务;

  2. 中断使能

    虽然中断源提交了中断请求,但是能否得到CPU的响应,还要取决于该中断请求能否通过若干的关卡送达CPU(中断使能位为1,关卡放行),关卡有两类:

    • 此中断源的中断允许位
    • 全局中断允许位
  3. 中断响应

    如果一路通畅,则CPU响应该中断请求,记录断点,跳转到中断服务程序。对于INT和TMR中断,中断响应时中断标志位会被硬件自动清零。

  4. 中断处理

    对中断源进行有针对性的服务;

  5. 中断返回

    返回到主程序断点处,继续执行主程序;

1,3,5由硬件自动完成,2,4由用户编程完成。中断响应条件为1,2同时满足。

程序代码

#include<reg52.h>

void Delay(unsigned int ms){
    unsigned int i ,j;
    for(i = ms; i > 0; i--){
        for(j = 112; j>0; j--);
    }
}
void main(){
    P1 =   0x0f;    //0000 1111
    EX1 = 1;        //外部中断1 INT1 打开
    EA =1;            //全局中断打开
    IT1 = 1;        //设置触发方式为下降沿触发
    while(1);
}

//中断服务函数
void low() interrupt 2{
    P1 = ~P1;
    Delay(200);
}

首先设置P1管脚连接的排灯为后四个灯亮,把各个卡点开启(如外部中断1 和 全局中断),IT1(P3.3)设置触发方式为下降沿,之后可以将引脚P3.3与P3.6(按键)连接,如此一来就可以通过按键来触发中断;

当按键按下松手时即是一个下降沿,此时会触发中断,执行中断服务函数,转变为前四个灯亮。


文章作者: Mahoo Huang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Mahoo Huang !
评论
  目录