概念基础

什么是中断

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

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

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

51单片机的中断系统

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

中断源中断标志中断向量(地址)优先级序号(C语言)
外部中断0 INT0IE00003H10
定时/计数器0 T0TF0000BH21
外部中断1 INT1IE10013H32
定时/计数器1 T1TF1001BH43
串口中断RI/TI0023H54

中断系统结构

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

中断控制

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

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

中断响应条件:

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

中断允许寄存器 IE

位序76543210
名称EA--ESET1EX1ET0EX0
控制位(0禁止,1允许)总开关串口定时器1外部中断1定时器0外部中断0
位地址AFHACHABHAAHA9HA8H

中断优先级寄存器 IP

位序7654321
名称---PSPT1PX1PT0PX0
优先级控制位(0低,1高)串口定时器1外部中断1定时器0外部中断0
位地址BCHBBHBAHB9HB8H

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

位序76543210
位名称TF1TR1TF0TR0IE0IT1IE0IT0
  • 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

位序76543210
位名称------TIRI
  • 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(按键)连接,如此一来就可以通过按键来触发中断;

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