本文主要是关于C51中的中断系统的相关介绍。
1. 中断概念
中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的。中断功能的存在,很大程度上提高了单片机处理外部或内部事件的能力,中断是单片机最重要的功能之一。
中断在生活中的一个事例:你打开火,烧一壶水;然后去洗衣服,在洗衣服的过程中,突然听到水壶发出水开的报警声,这是,你停止洗衣服动作,立即去关火,然后将开水灌入开水壶中,灌完开水后,又回去继续洗衣服。这个过程中就发生了一次中断。
对单片机来讲,中断是指CPU在处理某一事件A时,发生了另一事件B,请求CPU迅速去处理(中断发生);CPU暂时停止当前的工作(中断响应),转去处理时间B(中断服务);待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理时间A(中断返回),这一个过程称为中断。
如下图是展示了生活中的中断实例以及单片机处理中断的过程示意图。
中断示意图
将生活事例与单片机中断结合分析,主任务是洗衣服,水开报警是一个中断请求,这一时刻相当于断点处,响应中断去关火,然后将开水灌入暖水瓶中,这一动作实际上是处理中断程序,灌完开水后再回去继续洗衣服,相当于处理完中断程序后再返回主程序继续执行主程序。
需要注意的是,水开是随时都有可能的,但是无论什么时候开,只要一开将立即去处理它,处理完后再回来继续接着洗刚才那件衣服。单片机在执行程序时,中断也是随时可能发生,但无论何时发生,只要一旦发生,单片机将立即暂停当前程序,赶去处理中断程序,处理完中断程序后再返回刚才暂停处接着执行原来的程序。
单片机中断时的程序流程图
引起CPU中断的根源称为中断源。中断源向CPU提出中断请求,CPU暂时中断原来的事务A,转去处理事件B,对事件B处理完毕后,再回到原来被中断的地方(即断点),称为中断返回。实现上述中断功能的部件称为中断系统(中断机构)。
当中央处理机CPU正在处理某件事时外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。实现这种功能的部件称为中断系统,请示CPU中断的请求源称为中断源。
微型机的中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断,要求为它服务的时候,就存在CPU优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU总是先响应优先级别最高的中断请求。
当CPU正在处理一个中断源请求的时候,发生了另外一个优先级比它还高的中断源请求。如果CPU能够暂停对原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低优先级中断服务程序,这样的过程称为中断嵌套。这样的中断系统称为多级中断系统,没有中断嵌套功能的中断系统称为单级中断系统。
中断的开启与关闭、设置启用哪一个中断等都是由单片机内部的一些特殊功能寄存器来决定的。
终端技术不仅解决了快速主机与慢速I/O设备的数据传送问题,而且还具有如下优点:
分时操作。CPU可以分时为多个I/O设备服务,提高了计算机的利用率;
实时响应。CPU能够及时处理应用系统的随机事件,系统的实时性大大增强。
可靠性高。CPU具有处理设备故障及掉电等突发性事件能力,从而使系统可靠性提高。
2. 中断结构及相关寄存器
89C51系列单片机提供了8个中断请求源,它们分别是:外部中断0(INT0)、外部中断1(INT1)、外部中断2(INT2)、外部中断3(INT3)、定时器0中断、定时器1(T0)中断、定时器2(T1)中断、串口(UART)中断。
需要注意,51单片机一定有基本的5个中断,但不全有8个中断,需要查看芯片手册,通常我们使用的都是基本的5个中断:INT0、INT1、定时器0/1、串口中断。
所有的中断都具有四个中断优先级(基本型只有两个)。
用户可以用关总中断允许位(EA/IE.7)或相应中断的允许位来屏蔽所有的中断请求,也可以用打开相应的中断允许位来使CPU响应相应的中断请求。
其中有些中断源可以用软件独立地控制位开中断或关中断状态。
每一个中断的优先级别均可用软件设置。高优先级的中断请求可以打断低优先级的中断,反之,低优先级的中断请求不可以打断高优先级及同优先级的中断。
当两个相同优先级的中断同时产生时,将由查询次序来决定系统先响应哪个中断。
STC89C5X系列单片机的各个中断查询次序表如下图所示:
中断源 中断向量地址 相同优先级内的查询次序 中断优先级设置IPH.IP 优先级0(最低) 优先级1 优先级2 优先级3(最高) 中断请求标志位 中断允许控制位
/INT0
外部中断0 0003H 0
最高 PX0H,PX0 0,0 0,1 1,0 1,1 IE0 EX0/EA
Timer0
定时器0 000BH 1 PT0H,PT0 0,0 0,1 1,0 1,1 TF0 ET0/EA
/INT1
外部中断1 0013H 2 PX1H,PX1 0,0 0,1 1,0 1,1 IE1 EX1/EA
Timer1 001BH 3 PT1H,PT1 0,0 0,1 1,0 1,1 TF1 ET1/EA
UART 0023H 4 PSH,PS 0,0 0,1 1,0 1,1 RI+TI
Timer2 002BH 5 PT2H,PT2 0,0 0,1 1,0 1,1 TF2+EXF2 (ET2)/EA
/INT2
外部中断2 0033H 6 PX2H,PX2 0,0 0,1 1,0 1,1 IE2 EX2/EA
/INT3
外部中断3 003BH 7 PX3H,PX3 0,0 0,1 1,0 1,1 IE3 EX3/EA
通过设置新增加的特殊功能寄存器IPH中的相应位,可将中断优先级设为四级。如果只设置IP或XICON,那么中断优先级就只有两级,与传统8051单片机两级中断优先级完全兼容。
上图中的中断查询次序即为中断号,当中断来临时,只有中断号正确才能进入中断。
以51单片机一定有的5个中断介绍,其内部结构框图如下所示:
5个基本中断内部结构框图
①. INT0对应的是P3.2口的附加功能,可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时,中断标志IE0(TCON.1)置1,向CPU申请中断。
②. INT1对应的是P3.3口的附加功能,可由IT1(TCON.2)选择其为低电平有效还是下降沿有效。当CPU检测到P3.3引脚上出现有效的中断信号时,中断标志IE1(TCON.3)置1,向CPU申请中断。
③. T0对应的是P3.4口的附加功能,TF0(TCON.5),片内定时/计数器T0溢出中断请求标志。当定时/计数器T0发生溢出时,置位TF0,并向CPU申请中断。
④. T1对应的是P3.5口的附加功能,TF1(TCON.7),片内定时/计数器T1溢出中断请求标志。当定时/计数器T1发生溢出时,置位TF1,并向CPU申请中断。
⑤. RXD和TXD对应的是P3.0和P3.1口的附加功能,RI(SCON.0)或TI(SCON.1),串行口中断请求标志。当串行口接收完一帧串行数据时置位RI或当串行口发送完一帧串行数据时置位TI,向CPU申请中断。
(1). 中断允许控制寄存器IE
CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。中断允许寄存器IE各个位如下所示:
位 7 6 5 4 3 2 1 0
字节地址:A8H EA ES ET1 EX1 ET0 EX0 IE
位说明:
EX0(IE.0),外部中断0(INT0)允许位;
ET0(IE.1),定时/计数器T0中断允许位;
EX1(IE.2),外部中断1(INT1)允许位;
ET1(IE.3),定时/计数器T1中断允许位;
ES(IE.4),串行口中断允许位;
EA(IE.7),CPU中断允许(总允许)位;
(2). 中断请求标志寄存器TCON
中断请求标志TCON各位如下所示:
位 7 6 5 4 3 2 1 0
字节地址:88H TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 TCON
位说明:
IT0(TCON.0),外部中断0触发方式控制位,IT0=0表示电平触发方式;IT0=1时表示边沿触发方式,下降沿有效;
IE0(TCON.1),外部中断0中断请求标志位;
IT1(TCON.2),外部中断1触发方式控制位;
IE1(TCON.3),外部中断1中断请求标志位;
TF0(TCON.5),定时/计数器T0溢出中断请求标志位;
TF1(TCON.7),定时/计数器T1溢出中断请求标志位;
(3). 中断优先级
同一优先级中的中断申请不止一个时,就会出现中断优先权排队问题。同一优先级的中断优先权排队,由中断系统硬件确定的自然优先级形成,其排列如下所示:
各中断源响应优先级及中断服务程序入口表
中断源 中断标志 中断服务程序入口 优先级顺序
外部中断0(/INT0) IE0 0003H 高
定时/计数器0(T0) TF0 000BH ↓
外部中断1(/INT1) IE1 0013H ↓
定时/计数器1(T1) TF1 001BH ↓
串行口 RI或TI 0023H 低
(4). 中断号
中断源符号 名称 中断引起原因 中断号
/INT0 外部中断0 P3.2引脚低电平或下降沿 0
T0 定时/计数器0 定时/计数器0计数回0溢出 1
/INT1 外部中断1 P3.3引脚低电平或下降沿 2
T1 定时/计数器1 定时/计数器1计数回0溢出 3
TI/RI 串行口中断 串行通信完成一帧数据发送或接收引起中断 4
(5). 中断响应条件
当三个条件:①中断源有中断请求;②此中断源的中断允许位为;③CPU开中断(即EA=1);同时满足时,CPU才有可能响应中断。
在使用中断时,需要做:①想使用的是哪个中断,选择响应的中断号;②希望的触发条件是什么;③希望在中断之后做什么。
以外部中断0为例,如下所示:
首先主程序需要一下代码:
EA=1; // 总中断允许位置1,打开总中断开关
EX0=1; // 外部中断0允许位置1,打开INT0
IT0=0/1; // 外部中断0触发方式控制位,置为0或1,表示电平或边沿触发中断
然后中断服务函数:
void int0() interrupt 0 using 1
{
// 编写中断之后做什么的代码
}
其中int0是函数名,可以自定义,需要符合C语言标识符定义规则;interrupt是一个关键字,表示51单片机中断;后面的0是中断号,外部中断0的中断号为0;后面的using 1可省略不写。
/************************************外部中断_单片机
1 中断介绍
在我们的日常生活中,经常会遇到这样的情况:我们正在看书,突然客厅的电话响了,这时往往会停止看书,转而去接电话,接完电话后又接着看书。这种停止当前工作,转而去做其他工作,做完后又返回来做先前工作的现象称为中断。
所以单片机虽然是个机器,它也有类似的中断现象,当单片机正在执行某程序时,如果突然出现意外情况,它就需要停止当前正在执行的程序,转而去处理意外情况,处理完后又接着执行原来的程序。
2 中断相关概念
图1 中断结构图
(1) 中断源
要让 CPU 中断当前的程序去做其他事情,需要向它发出请求信号,CPU 接收到中断请求信号后才能产生中断。让CPU产生中断的信号称为中断源(又称中断请求源)。
51系列单片机的中断源包括:两个外部中断源、两个定时器/计数器中断源和一个串行通信口中断源,如果它们向 CPU 发出中断请求信号,CPU 就会产生中断,停止执行当前的程序,转而去执行指定的程序(又称中断服务程序或中断子程序),执行完后又返回来执行原来的程序。
(2) 中断的优先级别
单片机内的CPU在工作时,如果一个中断源向它发出中断请求信号,它就会产生中断;如果同时有两个或两个以上的中断源发出中断请求信号,CPU会怎么办呢?CPU会先接受优先级别高的中断源请求,然后再接受优先级别低的中断源请求。
(3) 中断处理过程
① 响应中断请求。当 CPU 正在执行主程序时,如果接收到中断源发出的中断请求信号,就会响应中断请求,停止主程序,开始执行中断。
② 保护断点。为了在执行完中断后能返回主程序,在执行中断时,会将主程序的下一条指令的地址(又称断点地址)保存到数据存储器(RAM)的堆栈中。
③ 寻找中断入口地址。保护好断点后,CPU开始寻找中断入口地址(又称矢量地址),中断入口地址存放着相应的中断子程序,不同的中断源对应着不同的中断入口地址。
④ 执行中断子程序。CPU寻找到中断入口地址后,就开始执行中断入口地址处的中断子程序。由于几个中断入口地址之间只有8个单元空间(表中如0003H~000BH相隔8个单元),较小的中断子程序(程序只有一两条指令)可以写在这里,较大的中断子程序无法写入,通常的做法是将子程序写在其他位置,而在中断入口地址单元只写一条跳转指令,由该指令跳转到中断子程序。
⑤ 中断返回。执行完中断子程序后,就会返回到主程序,返回的方法是从RAM的堆栈中取出之前保存的断点地址,然后执行该地址处的主程序,从而返回到主程序。
(4)中断相关寄存器
(5)中断响应条件:①中断源有中断请求;②中断源的中断允许位为 1;③ CPU 开中断(即 EA=1)。
3 功能要求:外部中断属于单片机的内部资源,本实验所使用的独立按键KEY3和KEY3直接接在单片机开发板P3.2和P3.3,而P3.2和P3.3不仅是普通的IO口,而且还可以作为外部中断使用。故可以通过按键来模拟外部的脉冲信号输入到外部中断管脚来触发外部中断。要实现的功能是,当按下KEY3可控制LED1指示灯亮灭,按下KEY4可控制LED2指示灯亮灭。
4 原理分析
(1)在中断结构图1中,INT0和INT1即为外部中断0和外部中断1。
INT0对应的是P3.2口的附加功能,可由IT0选择其触发方式(低电平有效或者下降沿有效)。当CPU监测到P3.2引脚上出现有效的中断信号时,中断标志IE0置1(单片机自动完成),向申请中断。
INT1对应的是P3.3口的附加功能,可由IT1选择其触发方式(低电平有效或者下降沿有效)。当CPU监测到P3.3引脚上出现有效的中断信号时,中断标志IE1置1(单片机自动完成),向申请中断。
(2)外部中断寄存器的配置
1)中断请求标志寄存器 TCON
① IT0(TCON[0]):外部中断0触发方式控制位,当IT0=0时,为低电平触发方式;当IT0=1时,为边沿触发方式(下降沿有效);
② IE0(TCON[1]):外部中断0中断请求标志位;
③ IT1(TCON[2]):外部中断1触发方式控制位,当IT1=0时,为低电平触发方式;当IT1=1时,为边沿触发方式(下降沿有效);
④ IE1(TCON[3]):外部中断1中断请求标志位。
2)中断允许控制寄存器 IE
① EX0(IE[0]):外部中断0允许位;
② ET0(IE[1]):定时/计数器T0中断允许位;
③ EX1(IE[2]):外部中断1允许位;
④ ET1(IE[3]):定时/计数器T1中断允许位;
⑤ ES(IE[4]):串行口中断允许位;
⑥ IE[5]
⑦ IE[6]
⑧ EA(IE[7]):CPU中断允许位,即总允许位。
4 硬件设计
(1)系统框图
(2)独立按键和LED灯原理图
5 软件设计
1 #include "reg52.h"
2
3 typedef unsigned int u16;
4 typedef unsigned char u8;
5
6 //定义输入、输出管脚
7 sbit KEY3 = P3^2; //独立按键3控制管脚
8 sbit KEY4 = P3^3; //独立按键4控制管脚
9 sbit LED1 = P2^0; //LED1控制管脚
10 sbit LED2 = P2^1; //LED2控制管脚
11
12 //延时函数,ten_us=1时,大约延时10us
13 void delay_10us(u16 ten_us)
14 {
15 while(ten_us--);
16 }
17
18 //对外部中断0进行初始化设置
19 void exti0_init(void)
20 {
21 IT0 = 1; //下降沿触发方式
22 EX0 = 1; //打开INT0的中断允许
23 EA = 1; //打开总中断
24 }
25
26 //对外部中断1进行初始化设置
27 void exti1_init(void)
28 {
29 IT1 = 1; //下降沿触发方式
30 EX1 = 1; //打开INT1的中断允许
31 EA = 1; //打开总中断
32 }
33
34 void main()
35 {
36 exti0_init(); //对外部中断INT0进行配置
37 exti1_init(); //对外部中断INT1进行配置
38 while(1)
39 {
40
41 }
42 }
43
44 //外部中断0中断函数,中断号为0
45 void exti0() interrupt 0
46 {
47 delay_10us(1000); //消抖,忽略按下抖动过程
48 if(KEY3==0) //再次判断按键3是否按下
49 LED1 = !LED1; //LED1状态翻转
50 }
51
52 //外部中断1中断函数,中断号为2
53 void exti1() interrupt 2
54 {
55 delay_10us(1000); //消抖,忽略按下抖动过程
56 if(KEY4==0) //再次判断按键4是否按下
57 LED2 = !LED2; //LED2状态翻转
58 }
6 仿真结果
7 实现现象
当按下按键KEY3,指示灯LED1点亮,再按下按键KEY3,指示灯LED1熄灭,如次循环。同理,按键KEY4控制LED2。