第7章 中断系统

一、中断概述

中断技术是在微机中广泛使用的一种资源共享技术。

  1. 中断
    中断是指当CPU在正常执行程序时,由于外部或内部事件强迫CPU停止当前执行的程序,转去为事件服务(中断服务),服务完毕,又能自动返回到被中断的程序中继续执行。

  2. 中断功能

    • 实现CPU与外设的速度匹配和并行工作;
    • 实现实时控制;
    • 实现故障检测和自动处理。
  3. 中断控制

    • 设置中断源(引起中断的事件),确定它们提出中断请求的方式;
    • 确定中断优先级和中断的嵌套方式;
    • 中断现场的保护与恢复。

中断嵌套示意图

  1. 中断处理过程
    中断处理过程如下:
    • 中断源提出申请,并建立相应的中断标志(由硬件置位标志位);
    • CPU结束当前指令,响应该中断申请,同时把主程序断点处地址(程序计数器PC当前值)压入堆栈,即保护断点;
    • 保护现场。把断点处的有关信息(如工作寄存器、累加器、标志位的内容),压入堆栈;
    • 执行中断服务程序;
    • 恢复现场。把保存的现场内容从堆栈弹出,以恢复寄存器和存储单元的原有内容;
    • 返回主程序(或调用程序),执行中断返回指令,把断点处地址从栈顶弹出,从断点处继续执行主程序(或调用程序)。

二、MCS-51 中断系统

  1. 中断源
    • 5个中断源:2个外部中断INT0、INT1,3个内部中断T0、T1、串行口。
    • 2个优先级:高级中断和低级中断,由用户定义。

MCS-51 中断系统结构图

  1. 中断控制寄存器
    与中断控制有关的寄存器有4个:

    • TCON:定时控制寄存器
    • SCON:串行口控制寄存器
    • IE:中断允许寄存器
    • IP:中断优先级寄存器

    (1) 定时控制寄存器(TCON)

    8F 8E 8D 8C 8B 8A 89 88
    TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 (88H)
    INT1触发请求标志
    INT0触发方式 0:电平触发(低) 1:边沿触发(下跳沿)
    INT0请求标志 0:无请求(硬件置位或清除) 1:有请求
    • IT0(IT1):外中断请求信号方式控制位
      • IT0(IT1)=1,脉冲方式(后沿负跳变有效)
      • IT0(IT1)=0,电平方式(低电平有效)
    • IE0(IE1):外部中断请求标志位
      当CPU采样(S5P2)到INT0或INT1端出现有效中断请求时,此位由硬件置1。在中断响应完成后转向中断服务程序时,再由硬件自动清零。
    • TF0(TF1):计数溢出标志位
      当计数器产生计数溢出时,此位由硬件置位。当转向中断服务程序时,再由硬件自动清0。计数溢出标志位的使用有两种情况:
      • 采用中断方式时,做中断请求标志位来使用;
      • 采用查询方式时,作查询状态位来使用。

    (2) 串口控制寄存器(SCON)

    9F 9E 9D 9C 9B 9A 99 98
    SM0 SM1 SM2 REN TB8 RB8 TI RI (98H)
    串行口发送中断请求标志
    串行口接收中断请求标志

    其中与中断有关的控制位共有两位:TI和RI,分别为串口发送和接收中断请求标志位。当串口发送(或接收)完一帧数据后,由硬件置位;在转向中断服务程序后,用软件清零。

    (3) 中断允许寄存器(IE)

    AF AE AD AC AB AA A9 A8
    EA / / ES ET1 EX1 ET0 EX0 (A8H)
    • EA:中断允许总控制位
      • EA=0,禁止所有中断;EA=1,开放所有中断。
    • EX0(EX1):外部INT0、INT1中断允许位
      • EX0(EX1)=0,禁止;EX0(EX1)=1,允许。
    • ET0(ET1):定时/计数器T0、T1中断允许位
      • ET0(ET1)=0,禁止;ET0(ET1)=1,允许。
    • ES:串行中断允许位
      • ES=0,禁止; ES=1,允许。

    (4) 中断优先级寄存器(IP)

    BF BE BD BC BB BA B9 B8
    / / / PS PT1 PX1 PT0 PX0 (B8H)
    • PX0:外部中断0(INT0)优先级设定位
    • PT0:定时中断0(T0)优先级设定位
    • PX1:外部中断1(INT1)优先级设定位
    • PT1:定时中断1(T1)优先级设定位
    • PS: 串行中断优先级设定位

    为0的位优先级为低级;为1的位优先级为高级。若5个中断源都定义为相同优先级时,CPU按下列顺序查询执行。

    INT0 -> T0 -> INT1 -> T1 -> TI、RI

MCS-51单片机中断优先级的控制原则是:

  1. 低优先级中断请求不能打断高优先级的中断服务;但高优先级中断请求可以打断低优先级的中断服务,从而实现中断嵌套。

  2. 如果一个中断请求已被响应,则同级的其他中断响应将被禁止。

  3. 如果同级的多个请求同时出现,则按CPU查询次序确定哪个中断请求被响应。其查询次序为:外部中断0 -> 定时中断0 -> 外部中断1 -> 定时中断1 -> 串行中断。

  4. 中断请求的撤除
    中断响应后,如果不及时清除中断请求标志,会引起中断的混乱。下面按中断请求的类型说明中断请求的撤除方法。
    (1) 定时中断由硬件自动撤除
    定时中断响应后,硬件自动把标志位(TFx)清零。
    (2) 外部中断的自动与强制撤除
    若外部中断以脉冲方式触发,则由硬件自动地把标志位(IEx)清零。若以电平方式触发,则需由外部电路和软件配合撤除。
    (3) 串行中断软件撤除
    串行中断的标志位是TI和RI,但对这两个中断标志位不进行自动清零。因为在中断响应后,还需测试这两个标志位的状态,以判定是接收操作还是发送操作,然后才能清除。所以串行中断请求的撤除应使用软件方法。
    即:
    CLR TI ; TI <- 0 CLR RI ; RI <- 0

中断管理

ORG 0000H
LJMP MAIN ; 跳过中断地址表,转主程序
ORG 0003H
LJMP INT0F ; 转INT0中断服务
ORG 000BH
LJMP T0F ; 转T0中断服务
ORG 0013H
LJMP INT1F ; 转INT1中断服务
ORG 001BH
LJMP T1F ; 转T1中断服务
ORG 0023H
LJMP SIOF ; 转串口中断服务
ORG 0030H
MAIN: MOV SP,#5FH ; 主程序

利用定时器扩充中断源

定时器T0设置为方式2(自动重装常数)外部计数方式。TH0、TL0的初值均为0FFH,并允许T0中断,且CPU开放中断。

MOV TMOD,#06H
MOV TL0,#0FFH
MOV TH0,#0FFH
SETB TR0
SETB ET0
SETB EA

定时器方式0应用举例(第5章)

设单片机晶振频率fosc=6MHz,使用定时器1以方式0产生周期为500us的方波,并由P1.0输出。以查询或中断方式完成。

解:

  • 计算定时初值x
    欲产生500us的方波,只需在P1.0端以250us为周期交替输出高低电平即可实现。为此,定时时间应为250us。晶振为6MHz,则1个机器周期为2us。
    则: (2^13-x)*2uS=250uS
    x=8067=1111110000011B
    即: TH1=0FCH,TL1=03H。

查询方式程序:

MOV TMOD,#00H ; T1工作在方式0
SETB TR1 ; 启动T1工作
LOOP: MOV TL1,#03H
MOV TH1,#0FCH ; 置定时初值
WAIT: JNB TF1,WAIT ; 定时未到,循环等待
CLR TF1 ; 定时到,清TF1
CPL P1.0 ; 由P1.0输出,信号取反
SJMP LOOP ; 循环输出方波

中断方式程序:

ORG 001BH ; T1中断入口
LJMP SUBT ; 跳至中断服务程序SUBT
ORG 100H
MOV TMOD,#00H ; T1工作在方式0
MOV TL1,#03H
MOV TH1,#0FCH ; 置定时初值
SETB EA ; 开中断
SETB ET1 ; 允许T1中断
LOOP: SETB TR1 ; 启动T1工作
WAIT: SJMP WAIT ; 等待中断
LJMP LOOP
ORG 200H ; 中断服务程序
SUBT: CPL P1.0 ; 输出信号取反
MOV TL1,#03H
MOV TH1,#0FCH ; 重置定时初值
RETI ; 中断返回

乙机接收程序(第5章)--串口中断实现

(查询方式)与甲机发送相呼应,接收器把接收到的32个字节数据存放在内部RAM的20H~3FH中,波特率与晶振频率同上。若奇校验出错,则置进位位1。程序如下:

START:MOV TMOD,#20H ; T1方式2
MOV TL1,#OE8H
MOV TH1,#OE8H
SETB TR1
MOV R0,#20H
MOV R7,#32
LOOP: MOV SCON,#01010000B ; 串行口方式1,能接收
DONE: JNB RI,DONE ; 等待接收一帧
CLR RI ; 清RI,再接收
MOV A,SBUF ; 取数据
JNB P,ERROR ; 校验错,转出错处理
ANL A,#7FH ; 去掉奇校验位
MOV @R0,A ; 奇校验,存数据
INC R0 ; 指向下一数据
DJNZ R7,LOOP ; 数据块,未接收完,循环
AJMP START ; 循环接收
ERROR: ... ; 出错处理

(中断方式)程序如下:

START:MOV TMOD,#20H ; T1方式2
MOV TL1,#OE8H
MOV TH1,#OE8H
SETB TR1
MOV R0,#20H
MOV R7,#32
MOV SCON,#01010000B ; 串口方式1,接收
SETB EA ; 开总中断
SETB ES ; 开串口中断
SJMP $ ; 等待接收或处理其他
ORG 0023H ; 串口中断处理子程序
LJMP ZDCL
ORG 100H
ZDCL: CLR RI ; 清RI,再接收
MOV A,SBUF
MOV A,SBUF ; 取数据
JNB P,ERROR ; 校验错,转出错处理
ANL A,#7FH ; 去掉奇校验位
MOV @R0,A ; 奇校验,存数据
INC R0 ; 指向下一数据
DJNZ R7,FH ; 数据块,未接收完,循环
CLR ES ; 关串口中断
FH: RETI ; 返回主程序
ERROR: ... ; 出错处理

包括中断概述、MCS-51中断系统、中断管理、利用定时器扩充中断源、定时器方式0应用举例以及串口中断实现的接收程序。中断技术是单片机系统中非常重要的一部分,合理利用中断可以大大提高系统的实时性和可靠性。在实际应用中,需要根据具体需求合理设置中断源、中断优先级和中断服务程序,以实现高效可靠的系统控制。