Spark 嵌入式工作室 www.sparkcn.co.cc
QQ : pzq@sparkcn.cn/csh@sparkcn 1 / 10
第五章 中断的学习
为了使单片机具有对外部或内部随机发生的事件的实时处理能力,单片机上引入
了中断的功能。中断是单片机系统上最重要的功能之一,这一点不论是在 51 单
片机,还是在 32 位的 ARM 上都是一样的。就是在电脑的处理器上,也是一样重
要。因此,中断的功能是学习单片机必须要掌握的功能。这一章我们就来学习一
下。
简介
我们先来举一个生活中的例子来先来感性的认识一下中断的概念。
你烧上一壶水,然后就去使用 Spark51 学习板去做单片机实验了。在实验的过程
中,水烧开警报响了,这个时候你就得停下手中的实验去把水灌上。然后回来再
接着实验,这个
流程
快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计
如图所示:
Spark 嵌入式工作室 www.sparkcn.co.cc
QQ : pzq@sparkcn.cn/csh@sparkcn 2 / 10
对于单片机来说这个过程就认为是中断。我们来对比的描述一下:使能中断(把
水壶的警报功能打开),然后,主程序运行(我们开始做实验),收到中断请求(水
开警报响),单片机记住断点(记住你实验到哪一步了),执行中断服务程序(去
灌水),返回主程序接着运行(回来接着刚才的实验)。看明白了么,是不是一样
的?参考下面的图:
OK,对中断有了一个感性的认识后,我们来看一下关于中断的几个具体概念:
中断源
引发中断的事件叫做中断源
中断服务程序
根据不同的中断执行的程序称为中断服务程序
中断向量
Spark 嵌入式工作室 www.sparkcn.co.cc
QQ : pzq@sparkcn.cn/csh@sparkcn 3 / 10
中断向量是单片机定义好的地址,当发生中断时,就去相应的中断向量执行。这
里有一点要说明,有些单片机在中断处放的是代码,即单片直接跟到这个向量处
执行。51 属于这种情况。有些单片机在中断向量处放的是中断处理程序的地址,
最中断系统到这里把中断服务程序的地址取到,再后再执行。有些 ARM 属于这
种情况。这两种情况的区别,希望大家可以好好体会一下。
中断优先级
如果两个中断源同时发出请求,那么先处理谁呢?这就根据预先定义好的优先级
来自理了。高优先级的中断甚至可以把低优先级的服务程序再中断。形成中断嵌
套。
中断系统
控制响应中断、记住断点、执行中断服务程序、返回、控制中断源优先级的这个
功能部件,称为中断系统。51 单片机的中断系统比较简单,但基本功能都有。
在 ARM 处理里,大家能看到更加复杂的中断系统
以上几个概念对于中断来说非常重要,希望大家好好理解一下,有问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
可以与我
们交流。
中断的概念相信大家已经理解了,下面我们一起学习 51 单片机的中断系统。
51 单片机的中断源:
中断源 描述 优先级 入口地址 序号(C 使用)
/INT0
外部中断
P3.2 端口引入,
低电平或下降沿触发
最高(0) 0x03 0
T0 计数中断 当 T0 计数溢出时触发 1 0x0B 1
/INT1
外部中断
P3.3 端口引入,
低电平或下降沿触发
2 0x13 2
T1 计数中断 当 T1 计数溢出时触发 3 0x1B 3
Spark 嵌入式工作室 www.sparkcn.co.cc
QQ : pzq@sparkcn.cn/csh@sparkcn 4 / 10
串口发送/
接收中断
串口发送完成或接收到
数据触发
4
0x23
4
T2 中断
8052 单片机特有 5 0x2B 5
中断相关的控制寄存器
1 中断允许寄存器(IE) 地址:0xA8 ,可以位寻址
位 7 6 5 4 3 2 1 0
标识 EA 未定义 未定义 ES ET1 EX1 ET0 EX0
复位值 0 0 0 0 0 0
功能描述:
EA:CPU 中断使能。这个是中断的总开关,EA=1,使能 CPU 中断系统
EX:EX0/1 分别为外部中断/INT0 和/INT1 的使能控制位,为 1 时使能中断
ET:ET0/1 分别为 T0 和 T1 的中断使能控制位,为 1 是使能中断
2 中断优先级管理寄存器(IP)地址:0xB8 可以位寻址
位 7 6 5 4 3 2 1 0
标识 未定义 未定义 未定义 PS PT1 PX1 PT0 PX0
复位值 0 0 0 0 0 0 0 0
功能描述:
51 的中断优先级管理功能较弱,也比较好理解,分高和低两个优先级组,在同
一组内再根据优先级排序。级别高的中断可以把级别低的再中断了,形成中断嵌
套
3 定时器控制寄存器(TCON)地址 :0x88H,可以位寻址
Spark 嵌入式工作室 www.sparkcn.co.cc
QQ : pzq@sparkcn.cn/csh@sparkcn 5 / 10
位 7 6 5 4 3 2 1 0
符号 TF1 TR TF0 TR0 IE1 IT1 IE0 IT0
复位值 0 0 0 0 0 0 0 0
功能描述:
这个寄存器的高 4 位我们在“定时器”那一章已经介绍过,现在看一下低 4 位
IE:表示外部中断/INT0 和/INT1 中断请求标志。置位时,表示有中断请求。
IT:外部中断/INT0 和/INT1 引脚电平触发方式选择位。IT=0 表示低电平触发中断,
IT=1 表示下降沿触发中断(见后面思考题)。
UART 的寄存器里还有两个标志位和中断相关,我们说到串口的时候再介绍。
实验硬件部分
本章实验我们以定时器的中断为例进行,通在中断服务程序里改变 LED 灯的状态
来直观的认识中断。后面我们会陆续见到另外几个中断,串口章节里会有
“串口中断”的讲解, “红外遥控器”,在那里我们会用到/INT0 外部中断。
因为同样是 LED 的状态控制,硬件部分和前面章节一样,这里不再赘述。有疑问
的童鞋可以去前面章节查看或完整原理图。
软件
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
程序清单 L5.1
1 void main(void)
2 {
3 //使能独立 LED 的,即 LEDS6 输出低电平
4 LEDEN = 0;
Spark 嵌入式工作室 www.sparkcn.co.cc
QQ : pzq@sparkcn.cn/csh@sparkcn 6 / 10
5 ADDR0 = 0;
6 ADDR1 = 1;
7 ADDR2 = 1;
8
9 /*设置 T0 为方式 1,内部 TR 控制启动,对 CPU 时钟 12 分频计数*/
10 TMOD = 0xF1;
11 /* 给定时器赋初值 */
12 TL0 = (u8)TIMER_N_MS(50);
13 TH0 = (u8)(TIMER_N_MS(50) >> 8);
14 /* 使能 T0 中断 */
15 ET0 = 1;
16 /*使能总中断*/
17 EA = 1;
18 /*启动定时器*/
19 TR0 = 1;
20 /*这里没有设置中断优先级*/
21 while (1)
22 {
23 }
24 }
L5.1(10-13) Timer0 基本初始化,前面“定时器”章节已经讲过了,这里我们选择
定时 50ms
L5.1(15) 使能 T0 中断
L5.1(17) 使能 CPU 全局中断
Spark 嵌入式工作室 www.sparkcn.co.cc
QQ : pzq@sparkcn.cn/csh@sparkcn 7 / 10
程序清单 L5.2 Timer 中断服务程序
1 void timer0_isr() interrupt 1
2 {
3 static u8 timer_50ms_cnt = 0;
4 TR0 = 0;
5 /* 赋初值让定时器再开始定时 */
6 TL0 = (u8)TIMER_N_MS(50);
7 TH0 = (u8)(TIMER_N_MS(50) >> 8);
8 /* 再次启动 */
9 TR0 = 1;
10 timer_50ms_cnt++;
11 if (timer_50ms_cnt >= 10)
12 {
13 LED0 = ~LED0;
14 timer_50ms_cnt = 0;
15 }
16 }
清单 L5.2 是 Timer0 的中断服务程序,这里说一下用在 Keil C51 中断服务程序的
写法。声明成如下形式。
void xxx_isr(void) interrupt interrupt_num
首先,函数原型应当是没有参数为 void,没有返回的函数。
然后 ,使用 Keil C51 的扩展的关键字 interrupt(注意,interrupt 只是 Keil C51 扩展
的,换到别的开发环境不一样的),后面跟相应中断的号码(号码在上面的
表格
关于规范使用各类表格的通知入职表格免费下载关于主播时间做一个表格详细英语字母大小写表格下载简历表格模板下载
里可以查到,在 Keil 的帮助文件里也能查到)。对应到这里 Timer0 的中断号码为
1。所以有 L5.2(1)那样的写法。
L5.2(3) 因为定时器无法一次定时 500ms,我们声明的一个静态变量用来辅助计数
L5.2 其余的程序都是大家前面见过的了,这里不再重复说了。只是还有一点比较
Spark 嵌入式工作室 www.sparkcn.co.cc
QQ : pzq@sparkcn.cn/csh@sparkcn 8 / 10
重要,这里没有见到把 T0 的溢出标志清零的语句。对,正是这样,前面讲定时
器的时候提到过这里,当响应中断后,溢出标志会自动清零,所以这里不用软件
来做。
仿真与下载
我们使用 TKStudio 的功能先仿真一下,看是否达到我们的要求。
工程
路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理
代码可以在
代码包里找到。
在仿真里我们像前面章节一样,依然用到断点的功能来观察中断的响应现象,如
图,进入仿真后,在中断服务程序的入口处(60 行)的地方打上断点。
多按几次 F5 后,看图片中位置 1 标注的变量(如下图),可以看到这个值是 50ms
多一点(相信大家都已经知道那一点误差是哪里来的),是符合我们的预期的。
Spark 嵌入式工作室 www.sparkcn.co.cc
QQ : pzq@sparkcn.cn/csh@sparkcn 9 / 10
下面我们通过 STC 的烧写软件把程序下到 Spark51 开发板下看下现象。像我们预
期的一样可以看到 LED0 在闪烁。
思考
1 查看编译后的汇编文件(用仿真调试即可看到),看在中断向量处编译器怎
么处理的?
2 在上一思考的基础上,猜想如果使用 interrupt 6 会出什么什么现现象,验证
之。
3 查找资料,中断系统是怎么记住断点的,执行中断服务前,系统自动做了什
么?编译器帮我们做了什么?(这个可能有点难,但还是希望你能去找一找,
应该试着查看 KEIL 里带的帮助文件了,很有用处的)
4 查找资料了解 51 单片机怎么样识别“低电平”和“下降沿”。外部中断对“下
降沿”有哪些限制条件(频率等。。)。
Spark 嵌入式工作室 www.sparkcn.co.cc
QQ : pzq@sparkcn.cn/csh@sparkcn 10 / 10
下回预告
前面我学习了流水灯、LED、定时器还有这章的中断,下一章我们为大家带
来 7 段数码管的知识和一个综合实验,把前面的知识融合在一起做个实验,巩固
一下。
作者简介
Spark 嵌入式工作室,成立于 2010 年,致力于嵌入式方面的软、硬件开发和
研究,团队成员都是有经验的开发工程师,擅长使用 51 单片机、STM32。
联系方式 QQ:pzq@sparkcn.cn
csh@sparkcn.cn
QQ 技术交流群:186232047 验证码:spark
因群加入成员很快,如遇群满,请到 www.sparkcn.co.cc 获取最新交流
群号,加入交流
代码包下载地址:www.sparkcn.co.cc 或直接到群里共享下载
参考资料
《单片机高级教程》 何立民 编著
简介
实验硬件部分
软件设计
仿真与下载
思考
下回预告
作者简介
参考资料