一、中断概述
中断技术是在微机中广泛使用的一种资源共享技术。
中断
中断是指当CPU在正常执行程序时,由于外部或内部事件强迫CPU停止当前执行的程序,转去为事件服务(中断服务),服务完毕,又能自动返回到被中断的程序中继续执行。
中断功能
实现CPU与外设的速度匹配和并行工作;
实现实时控制;
实现故障检测和自动处理。
中断控制
设置中断源(引起中断的事件),确定它们提出中断请求的方式;
确定中断优先级和中断的嵌套方式;
中断现场的保护与恢复。
中断嵌套示意图
中断处理过程
中断处理过程如下:
中断源提出申请,并建立相应的中断标志(由硬件置位标志位);
CPU结束当前指令,响应该中断申请,同时把主程序断点处地址(程序计数器PC当前值)压入堆栈,即保护断点;
保护现场。把断点处的有关信息(如工作寄存器、累加器、标志位的内容),压入堆栈;
执行中断服务程序;
恢复现场。把保存的现场内容从堆栈弹出,以恢复寄存器和存储单元的原有内容;
返回主程序(或调用程序),执行中断返回指令,把断点处地址从栈顶弹出,从断点处继续执行主程序(或调用程序)。
二、MCS-51 中断系统
中断源
5个中断源:2个外部中断INT0、INT1,3个内部中断T0、T1、串行口。
2个优先级:高级中断和低级中断,由用户定义。
MCS-51 中断系统结构图
中断控制寄存器
与中断控制有关的寄存器有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单片机中断优先级的控制原则是:
低优先级中断请求不能打断高优先级的中断服务;但高优先级中断请求可以打断低优先级的中断服务,从而实现中断嵌套。
如果一个中断请求已被响应,则同级的其他中断响应将被禁止。
如果同级的多个请求同时出现,则按CPU查询次序确定哪个中断请求被响应。其查询次序为:外部中断0 -> 定时中断0 -> 外部中断1 -> 定时中断1 -> 串行中断。
中断请求的撤除
中断响应后,如果不及时清除中断请求标志,会引起中断的混乱。下面按中断请求的类型说明中断请求的撤除方法。
(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应用举例以及串口中断实现的接收程序。中断技术是单片机系统中非常重要的一部分,合理利用中断可以大大提高系统的实时性和可靠性。在实际应用中,需要根据具体需求合理设置中断源、中断优先级和中断服务程序,以实现高效可靠的系统控制。