12、单片机中断系统
- 项目目标
- 中断系统是单片机中非常重要的组成部分,它是为了使单片机能够对外部或内部随机发生的事件实时处理而设置的。中断功能的存在,在很大程度上提高了单片机实时处理能力,它也是单片机最重要的功能之一,是学习单片机必须掌握的重要内容。了解中断概念,以INT外部中断为例详细讲解中断程序的编写方法。
- 知识要点
- 中断的概念
- 中断优先级控制。
- 中断的嵌套。
- 技能掌握
- 学会引起中断,懂得编写超过定时器时间范围的延迟函数
1、项目分析
- 本项目通过用定时器中断方式来实现流水灯控制,以及通过计数和定时相结合的方式实现长时间定时。通过中断方式和上一章查询方式的编程差异进行比较,了解并掌握中断的使用。
2、技术准备
1、单片机中断系统
-
为什么要引入中断原因
-
一个高速主机(单片机)和一个低速外设(如:温湿度传感器、光敏电阻、低速通信接口等)连接时,效率极低,低速外设工作时无端占用大量CPU时间,导致单片机无法进行多任务并行处理。
-
通常单片机只有1个CPU,但需要要处理诸多任务,如:运行程序、数据输入、数据输出及特殊情况处理等多项任务,此时就必须要求单片机具备中断处理能力,以应对特殊情况的紧急处理。
-
-
中断介绍
-
CPU在处理某一事件A时,发生了另一事件B的请求(中断请求);
-
CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);
-
待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断。
-
-
中断源
- 引起CPU中断的根源,称为中断源。
- 中断源向CPU提出的中断请求。
- CPU暂时中断原来的事务A,转去处理事件B。
- 对事件B处理完毕后,再回到原来被中断的地方(即断点),称为中断返回。
- 实现上述中断功能的部件称为中断系统(中断机构)。
- 引起CPU中断的根源,称为中断源。
2、中断传送方式特点
- 中断的优点
- 早期的计算机系统是不包含中断系统的,后来为了解决快速主机与慢速外设的数据传送问题,引入了中断系统,
- 优点:
- 分时操作。CPU可以分时为多个外设服务,提高了计算机的利用率;
- 实时响应。CPU能够及时处理应用系统的随机事件,系统的实时性大大增强;
- 可靠性高。CPU具有处理设备故障及掉电等突发性事件能力,从而使系统可靠性提高。
- 传送方式特点
- 中断功能强弱是计算机性能优劣的重要标志
1、提高CPU效率 解决速度矛盾
2、实现并行工作 应付突发事件……
- 中断功能强弱是计算机性能优劣的重要标志
3、中断环节
-
数据传送的双方平时各自做自己的工作,一旦甲方要求与乙方进行数据传送,就主动发出信号提出申请,乙方接到申请后若同意传送,安排好当前的工作,再响应与甲方发生数据传送。完事后,回去继续做打断前的工作。
-
中断涉及的几个环节
① 中断源(前面提到的甲方)
② 中断申请(甲方发出信号提出申请)
③ 开放中断(乙方同意传送)
④ 保护现场(安排好当前的工作)
⑤ 中断服务(响应乙方的要求)
⑥ 恢复现场(完事后,回去……)
⑦ 中断返回(继续做打断前的工作)
4、80C51中断系统的结构
- 80C51的中断系统有5个中断源(8052有 6个),2个优先级,可实现二级中断嵌套。
- INT0 (P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时,中断标志IE0(TCON.1)置1,向CPU申请中断。
- TNT1 (P3.3)可由IT1(TCON.2)选择其为低电平有效还是下降沿有效。当CPU检测到P3.3引脚上出现有效的中断信号时,中断标志IE1 (TCON.3)置1,向CPU申请中断。
- TF0(TCON.5),片内定时/计数器T0溢出中断请求标志。当定时/计数器T0发生溢出时,置位TF0,并向CPU申请中断。
- TF1(TCON.7),片内定时/计数器T1溢出中断请求标志。当定时/计数器T1发生溢出时,置位TF1,并向CPU申请中断。
- RI(SCON.0)或TI(SCON.1),串行口中断请求标志。当串行口接收完一帧串行数据时置位RI或当串行口发送完一帧串行数据时置位TI,向CPU申请中断。
- 51单片机一共支持5个中断源:
- 2外部中断源
- 外部中断请求0:由 INT0(P3.2引脚)输入;
- 外部中断请求1:由 INT1(P3.3引脚)输入;
- 3个内部中断源
- 内部定时计数器0溢出中断(T0)请求
- 内部定时计数器1溢出中断(T1)请求
- 内部串行口发送/接收中断请求
- 2外部中断源
5、中断优先级控制
-
中断优先级:处理中断源的优先顺序。
-
51单片机有两大中断优先级:高优先级 与 低优先级
-
高优先级的中断先响应,等高优先级的中断响应完后才响应低优先级的中断
-
当多个中断都被分配为同一优先等级,并且发生中断时,由【查询电路】来确定最终优先级。
-
每个中断源的中断优先级都是由中断优先级寄存器IP中的相应位的状态来规定的。
- PX0(IP.0),外部中断0优先级设定位;
- PT0(IP.1),定时/计数器T0优先级设定位;
- PX1(IP.2),外部中断1优先级设定位;
- PT1(IP.3),定时/计数器T1优先级设定位;
- PS (IP.4),串行口优先级设定位;
- PT2 (IP.5) ,定时/计数器T2优先级设定位。
-
-
对于同一优先级,单片机中对其中中断次序:
-
外部中断0 > 定时/计时器T0 > 外部中断1 > 定时/计数器T1 > 串行口。
-
-
-
中断源关闭
- 设置 总开关(EA)和分开关(ETx、EXx、ES等)
-
中断嵌套
-
高优先级中断时可以打断低优先级的中断处理过程。
-
-
中断响应程序
-
51单片机给每个中断安排了一个唯一的中断入口地址。
中断源 入口地址 外部中断0(INT0) 0003H 定时/计数器0(T0) 000BH 外部中断1(INT1) 0013H 定时/计数器1(T1) 001BH 串行口中断 0023H
-
-
80C51单片机的中断优先级有三条原则:
- CPU同时接收到几个中断时,首先响应优先级别最高的中断请求,正在进行的中断过程不能被新的同级或低优先级的中断请求所中断。
- 正在进行的低优先级中断服务,能被高优先级中断请求所中断
- 为了实现上述后两条原则,中断系统内部设有两个用户不能寻址的优先级状态触发器。其中一个置1,表示正在响应高优先级的中断,它将阻断后来所有的中断请求;另一个置1,表示正在响应低优先级中断,它将阻断后来所有的低优先级中断请求。
6 中断控制
1 IE
-
中断允许寄存器(IE,Interrupt Enable):对中断系统所有中断以及某个中断源的开放和屏蔽控制。
- EX0(IE.0),外部中断0允许位;
- ET0(IE.1),定时/计数器T0中断允许位;
- EX1(IE.2),外部中断0允许位;
- ET1(IE.3),定时/计数器T1中断允许位;
- ES(IE.4),串行口中断允许位;
- EA (IE.7),CPU中断允许(总允许)位(设置为1开启总中断开关,设置为0则禁止所有中断)。
2 IP
-
中断优先级寄存器(IP,Interrupt Priority):用于设定各个中断源属于两级中断(抢占优先级和固有优先级,或称为高优先级和低优先级)的哪一级。
- PX0,外部中断0优先级控制位;
- PT0,定时/计数器0中断优先级控制位;
- PX1,外部中断1优先级控制位;
- PT1,定时/计数器1中断优先级控制位;
- PS,串行口中断优先级控制位;
-
若其中的某一位设置为1,则对应的中断源设置为高优先级;若设置为0,则对应的中断源设置为低优先级。
3 TCON
-
定时器/计数器控制寄存器(TCON,Timer Control Register):控制定时器/计数器的启动、停止以及管理外部中断。
- TF1:定时器1溢出标志位。当定时器1溢出时,该位被硬件置1。可以通过软件将其清零。
- TR1:定时器1运行控制位。当该位被置1时,启动定时器1;当被清零时,停止定时器1。
- TF0:定时器0溢出标志位。当定时器0溢出时,该位被硬件置1。可以通过软件将其清零。
- TR0:定时器0运行控制位。当该位被置1时,启动定时器0;当被清零时,停止定时器0。
- IE1:外部中断1使能位。当该位被置1时,使能外部中断1;当被清零时,禁止外部中断1。
- IT1:外部中断1触发方式控制位。用于设置外部中断1的触发方式,具体为电平触发或边沿触发(设置为1表示下降沿触发方式,设置0表示低电平触发方式)。
- IE0:外部中断0使能位。当该位被置1时,使能外部中断0;当被清零时,禁止外部中断0。
- IT0:外部中断0触发方式控制位。用于设置外部中断0的触发方式,具体为电平触发或边沿触发(设置为1表示下降沿触发方式,设置0表示低电平触发方式)。
7、一次中断过程的完整步骤
-
1、中断请求:中断事件一旦发生,中断源就提交中断请求(将中断标志位置1),欲请求CPU暂时放下目前的工作转向为该中断作专项服务。
-
2、中断使能:虽然中断源提交了中断请求,但是,能否得到CPU的响应,还要取决于该中断请求能否通过若干关卡送达CPU(中断使能位等于1,关卡放行),这些关卡有以下两类:
- 此中断源的中断允许位;
- 全局中断允许位。
-
3、中断响应:如果一路放行,则CPU响应该中断请求,记录断点,跳转到中断服务程序。对于INT和TMR中断,中断响应时中断标志位会被硬件自动清零。
-
4、中断处理:对中断源进行有针对性的服务。
-
5、中断返回:返回到主程序断点处,继续执行主程序。
- 1、3、5由硬件自动完成。
- 2、4是用户编程完成。
- 中断响应条件为1、2同时满足。
8、中断请求标记的置位和清除
- 外部中断
- 下降沿触发方式条件下,在产生中断请求时由硬件置位(置1)中断请求标记,当CPU响应中断时由硬件清除(清0 )。电平触发方式条件下,中断请求标记由外部中断源控制。具体是:当CPU检测到INT引脚上出现低电平时,中断标志IE由硬件置位,INT引脚上出现高电平时,中断标志IE由硬件清除。
- 定时器中断
- 计数溢出时由硬件置位中断请求标记,当CPU响应中断由硬件清除。
- 串口中断
- 当串行口接收完一帧数据后请求中断,由硬件置位中断请求标记RI,RI必须由软件清除。当串行口发送完一帧数据后请求中断,由硬件置位中断请求标记TI,TI必须由软件清除。
- 每个中断源的3个位
- 优先级定义位:每个中断源可以选择中断优先权(Priority二选一或四选一)
- 中断使能位:每个中断源均可使能(Enable)或使不能(Disable)
- 中断请求标记位:每个中断源均有独立的中断请求标记(Flag)
- 中断请求标记的产生:中断事件发生时,由硬件自动产生
- 中断请求标记的清除:中断事件被响应时,由硬件自动
- 优先级定义位:每个中断源可以选择中断优先权(Priority二选一或四选一)
9、中断使用步骤
1 中断初始化化
-
软件清楚对应的中断源中断标志位,以消除之前中断标志对现在的影响。
-
默认或设置中断的优先级。
-
其他设置:
-
若为外部中断,应设置低电平触发方式或下降沿触发方式
-
若为定时/计数器中断,应将定时/计数器初值送入寄存器 THx、TLx中。
-
-
打开相应中断源的总开关与分开关EA。
- 全局中断使能位(Global Enable,总开关)
- =0:全局中断禁止;
- =1:全局中断允许。
- 全局中断使能位(Global Enable,总开关)
2 中断服务函数
-
中断函数的写法
void 中断函数名() interrupt 中断编号 { }
-
说明
-
interrupt必须要加,表示定义成中断服务函数。
-
n是中断号,中断号是编译器识别不同中断的唯一编号。
中断源 中断编号 中断响应函数编写 外部中断0(INT0) 0 INT0_i interrupt 0 定时/计数器0(T0) 1 T0_i interrupt 1 外部中断1(INT1) 2 INT1_i interrupt 2 定时/计数器1(T1) 3 T1_i interrupt 3 串行口中断 4 COM_i interrupt 4
-
-
中断服务函数和普通函数的异同:
- 相同点
- 函数的形式非常类似,中断响应过程和普通函数调用过程也非常相似。
- 不同点
- 1、中断服务函数不需要声明,普通函数一般需要声明。
- 2、普通函数的执行是可预测的,而中断服务函数的执行是不可预测的。
- 3、普通函数的跳转是软件(函数调用语句)完成的,中断的跳(中断响应)是由硬件完成的,只要发生了中断事件,并且中断被允许,硬件自动完成中断的跳转(中断响应)
- 4、普通函数通过函数名找到被调用函数,中断服务函数:通过中断号找到中断服务函数。所以我们可以知道,中断服务函数中的函数名其实并没有什么作用。
- 相同点
-
使用中断函数时应遵循以下规则
- (1) 中断函数不能进行参数转递;
- (2) 在任何情祝下都不能直接调用中断函数。
3 中断返回
- 一旦某个中断请求得到响应,单片机必须把它的相对应中断标志位清0,否则,单片机会因中断标志未能得到及时清除而重新响应同一中断请求,这是绝对不允许的。
1、外部中断标志清除
- 当外部中断工作在电平触发方式下,外部中断标志 IE0或 IE1 是依靠单片机检测其引脚 INTO或 INT1上为低电平而置位的。尽管 RETI 指令能使中断标志IE0 或 IE1 自动清除成 “0’ 状态,但无法改变引脚 INTO或 INT1上电平始终为低电平的事实,所以单片机在运行过程中会再次检测到 INTO或INT1引脚上的低电平而置位 IE0或 IE1。
2、串行口中断标志清除
- 串行口有两个中断标志位TI和RI,硬件无法判别是哪个中断标志引发的中断请求,所以中断响应后,RETI 指令无法自动清除中断标志,只能由软件清除。编程时应在中断服务程序的适当位置采用指令清除 TI 或 RI。
10、项目实施
项目1、外部中断低电平触发
/*
实验:外部中断0的低电平触发方式
效果:INT0为低电平,则LED全亮
分析:
1 搭建项目的基本结构
2 定义INT0/LED端口
3 开启外部中断
总开关/分开关/触发方式
4 定义INT0的中断服务函数
操作:
硬件:P3.2 与 GND 相连,INT0 位为低电平,调用中断服务函数
软件:P3^2位为低电平
*/
// 注意:进行本项目程序,先用杜邦线将单片机P3.2与最右下角接口连接起来。