第10讲 51单片机中断系统
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
串行口接收/发送 定时/计数器2(T2)
IE1 TF1
RI/TI TF2
0013H 001BH
0023H 002BH
最低优先级
五、外部中断(INT0,INT1)申请过程
1.实验开发板中的外部中断接口电路
K1:外部中断1的按键,接P3.2线 K2:外部中断2的按键,接P3.3线
2.外部中断的申请过程
20
While(1) /*循环*/ } void int0( ) interrupt 0 using 0 /*外中断0的中断服务函数*/ { EX0=0; /*禁止外部中断0中断*/ P1=0x0f; /*低4位LED灭,高4位LED亮*/ Delay(800) ; /*延时800ms*/ P1=0xf0; /*高4位LED灭,低4位LED亮*/ Delay(800); /*延时800ms */ EX0=1; /*中断返回前,打开外部中断0中断*/ }
EA:总的中断允许控制位(总开关): =0 时禁止全部中断;=1 时允许中断。
3.中断优先级控制寄存器IP IP
— — PT2 PS PT1
(0B8H)
PX1 PT0 PX0
PX0/PX1:INT0/1优先级控制位: =0 时属低优先级; =1 时属高优先级。 PT0/PT1/PT2:T0/1/2中断优先级控制位: =0 时属低优先级; =1 时属高优先级。 PS1:串行口中断优先级控制位: =0 时属低优先级; =1 时属高优先级。
九、 中断嵌套
中断嵌套只能发生在单片机正在执行一个低优先级中断服 务程序的时候,此时又有一个高优先级中断产生,就会产生 高优先级中断打断低优先级中断服务程序,去执行高优先级 中断服务程序。高优先级中断服务程序完成后,再继续执行
低优先级中断服务程序。
【例5-4】电路如图5-10所示,设计一个中断嵌套程序。要 求K1和K2都未按下时,P1口的8只LED呈流水灯显示,当 K1按下再松开时,产生一个低优先级的外中断0请求(跳沿 触发),进入外中断0中断服务程序,左右4只LED交替闪烁
for(;;) { for(a=0;a<9;a++) { { Delay(500) /*延时*/ P1=play [a]; /*将已经定义的流水灯显示数据送到P1口*/ } EA=1; /*总中断允许*/ EX0=1; /*允许外部中断0中断*/ EX1=1 /*允许外部中断1中断*/ IT0=1; /*选择外部中断0为跳沿触发方式*/ IT1=1; /*选择外部中断1为跳沿触发方式*/ IP=0; /*两个外部中断均为低优先级*/ } }
【例】PX1=1;外中断INT1被设置成高优先级 PT0=0;定时器T0被设置成低优先级 总线方式 IP=0x04; //IP=0000 0100 将PX1设为1 PT0设为0;
4.中断优先级处理原则 对同时发生多个中断申请时: ☞不同优先级的中断同时申请(很难遇到) ——先高后低 ☞相同优先级的中断同时申请(很难遇到) ——按序执行 ☞正处理低优先级中断又接到高级别中断 ——高打断低 ☞正处理高优先级中断又接到低级别中断 ——高不理低
25
void int0_isr(void) interrupt 0 using 0 /*外中断0的中断服务函数*/ { for(;;) P1=0x0f; /*低4位LED灭,高4位LED亮*/ Delay(500) ; /*延时*/ P1=0xf0; /*高4位LED灭,低4位LED亮*/ Delay(500); /*延时*/ } void int1_isr (void) interrupt 2 using 1 /*外中断1的中断服务函数*/ { for(;;) { P1=0xff; /*全灭*/ Delay(500) ; /*延时*/ P1=0; /*全亮*/ Delay(500);} /*延时*/ }
三、中断系统硬件结构
四、单片机的中断矢量与优先级
中断矢量: 单片机的 6 个中断源分别对应有各 自的中断服务程序入口地址——中断矢量
中 断 源 申请标志 中断矢量 中断优先级 最高优先级
外部中断0( INT0)
定时/计数器0(T0)
IE0
TF0
0003H
000BH
外部中断1( INT1) 定时/计数器1(T1)
。此时按下K2再松开时,产生一个高优先级的外中断1请求
29
(跳沿触发),进入外中断1中断服务程序,P1口的8只LED 全部闪烁。当显示一段时间后,再从外中断1返回继续执行外
中断0中断服务程序,即P1口控制8只LED左右4只LED交替闪
烁。。设置外中断1为高优先级,外中断0为低优先级。
30
两个外中断嵌套控制8只LED显示的电路
。在外部中断1输入引脚P3.3( INT1* )引脚接有一只按钮
开关K2。程序要求K1和K2都未按下时,P1口的8只LED呈 流水灯显示,仅K1(P3.2)按下时,左右4只LED交替闪烁 。仅按下K2(P3.3),P1口的8只LED全部闪亮。两个外中 断的优先级相同。
22
两个外中断控制8只LED显示的电路
26
八、中断控制实例分析
实例1:用外部中断0来改变P1口LED灯的亮灭
实例2: 用LED数码管显示计数器对INT0的计数值 (1位数码管显示) 实例3:用LED数码管显示计数器对INT1的计数值 (2位数码管显示)
【例】编写一个用于统计外中断0的中断次数的中 断服务程序 int x; void int0() interrupt 0 using 1 { x++; }
S52系列有6个中断源(比S51多一个T2) ⑴2个外部中断请求:INT0,INT1 ⑵3个片内定时器/计数器T0、T1和T2中断请求: TF0,TF1,(TF2) ⑶1个串行口中断请求:TI/RI
二、与中断相关的特殊功能寄存器
1.定时器控制寄存器TCON (88H)
是管理定时器工作的SFR(其中低4位管外部中断, 高4位管定时器/计数器中断) TCON TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 TF0/TF1:定时器0/定时器1溢出中断申请标志位: =0:定时器未溢出; =1:定时器溢出申请中断,进中断后自动清零。 TR0/TR1:定时器运行启停控制位: =0:定时器停止运行; =1:定时器启动运行。
位的LED和高4位的LED交替闪烁。具体电路如下图所示。
18
控制8只LED交替闪烁的电路
19
参考程序如下: #include <reg51.h> void Delay(unsigned int i) /*延时函数Delay( ),i为形式参数,不 能赋初值*/ { unsigned int j; for(;i > 0;i--) for(j=0;j<333;j++) /*晶振为12MHz,j的选择与晶振频率有关*/ {;} /*空函数*/ } void main( ) /*主函数*/ { EA=1; /*总中断允许*/ EX0=1; /*允许外部中断0中断*/ IT0=1; /*选择外部中断0为跳沿触发方式*/ { P1=0;} /* P1口的8只LED全亮*/
Leabharlann Baidu
中断嵌套流程图
2.中断涉及的几个环节(单片机最多只能实现二级嵌套)
一开始你正在电脑上看视频
①中断源
手机
②中断申请
③开放中断
手机铃声响了 提醒你去接
你准备去接电话 在电脑上暂停我的这个视频 你开始接电话 挂断电话 回来
④保护现场
⑤中断服务
⑥恢复现场
⑦中断返回
继续看我的视频
3.AT89S52单片机的中断源
31
参考程序如下。
#include <reg51.h> unsigned char play [9]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf ,0xbf,0x7f};/*定义流水灯的显示数据*/ void Delay(unsigned int i) { unsigned int j; for(;i > 0;i--) for(j=0;j<125;j++) {;} } /*延时函数Delay( )*/
23
参考程序如下。
#include <reg51.h> void Delay(unsigned int i) /*延时函数Delay( ),i为形式参 数,不能赋初值*/ { unsigned int j; for(;i > 0;i--) for(j=0;j<125;j++) {; } /*空函数*/ }void main( ) /*主函数*/ { unsigned char play [9]={ 0xff,0xfe,0xfd,0xfb,0xf7,0xef, 0xdf,0xbf,0x7f};/*定义了流水灯的显示数据*/ unsigned char a;
3. 中断函数注意如下: (1)中断函数不能进行参数传递,如果中断函数中包 含任何参数声明都将导致编译出错。 (2)中断函数没有返回值,如果企图定义一个返回值 将得不到正确的结果,建议在定义中断函数时将其定义 为void类型,以明确说明没有返回值。
七、C51编程举例 本节通过几个例程介绍有关中断应用的程序的编写。
2.中断允许寄存器IE (0A8H)
IE
EA — ET2 ES ET1 EX1 ET0 EX0
EX0/EX1/ET1/ET0/ES 位: 分别是INT0/1,Timer0/1,串行口的中断允 许控制位: =0 时禁止中断; =1 时允许中断。 ET2:T2中断允许控制位(仅52系列有) =0 时禁止中断; =1 时允许中断。
1. 单一外中断的应用
【例】在 51单片机的 P1口上接有 8只 LED 。在外部中断 0输入 引脚P3.2(INT0*)引脚接有一只按钮开关K1。程序要求将 外部中断 0设置为负跳沿触发。在程序启动时, P1口上的 8 只 LED 亮。按一次按钮开关 K1 ,使引脚接地,产生一个负
跳沿触发的外中断 0 中断请求,在中断服务程序中,让低 4
C51编译器从绝对地址8m+3处产生一个中断向量,其中 m为中断号,也即interrupt后面的数字。该向量包含一 个到中断函数入口地址的绝对跳转。
2.using n修饰符 修饰符using n用于指定本函数内部使用的工作寄 存器组,其中n的取值为0~3,表示寄存器组号。 可以省略 省略后系统自动选择
本例程包含了两个部分,一是中断系统初始化部分,另一是 中断处理服务函数部分。
21
2. 两个外中断的应用
当多个中断源时,只需增加相应的中断服务函数即可。例5-3是 处理两个外中断请求的例子 【例】如下图所示,在51单片机的P1口上接有8只LED。在外 部中断0输入引脚P3.2(INT0*)引脚接有一只按钮开关K1
TCON TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 IT0/IT1:外部中断请求的触发方式选择位: =0:在INT0/INT1端申请中断的信号低电平触发; =1:在INT0/INT1端申请中断的信号负跳变触发. IE0/IE1:外部中断申请标志位: =0:没有外部中断申请; =1:有外部中断申请。
第十讲
51单片机中断系统
一、单片机中断系统
1.中断的定义
所谓中断,是指CPU正在处理某些事务的时候 ,外部又发生了某一事件,请求CPU及时处理。于 是,CPU暂时中断当前的工作,转而处理所发生的 事件。处理完毕,再回到原来被中断的地方,继续 原来的工作。这样的过程,称为中断。
中断示意图
中断方式流程图
⑴在CPU已经开放了外部中断允许的前提下; ⑵在INT0/INT1引脚输入一个负脉冲或低电平; ⑶TCON寄存器中的IE0/IE1标志位自动变“1”, ⑷检测到IE0/IE1变“1”后,将产生指令:
执行中断服务程序; ⑸并将IE0/IE1标志位自动清“0”,以备下次申请。
六、C51中断函数的编写
1.interrupt m 修饰符
interrupt m C51中断函数必须通过它进行修饰。在C51 程序设计中,当函数定义时用了interrupt m修饰符,系统编 译时把对应函数转化为中断函数,自动加上程序头段和尾段, 并按51系统中断的处理方式自动把它安排在程序存储器中的相 应位置。
在该修饰符中,m的取值为0~31,对应的中断情况如下: 0——外部中断0 1——定时/计数器T0 2——外部中断1 3——定时/计数器T1 4——串行口中断 5——定时/计数器T2 其它值预留。
IE1 TF1
RI/TI TF2
0013H 001BH
0023H 002BH
最低优先级
五、外部中断(INT0,INT1)申请过程
1.实验开发板中的外部中断接口电路
K1:外部中断1的按键,接P3.2线 K2:外部中断2的按键,接P3.3线
2.外部中断的申请过程
20
While(1) /*循环*/ } void int0( ) interrupt 0 using 0 /*外中断0的中断服务函数*/ { EX0=0; /*禁止外部中断0中断*/ P1=0x0f; /*低4位LED灭,高4位LED亮*/ Delay(800) ; /*延时800ms*/ P1=0xf0; /*高4位LED灭,低4位LED亮*/ Delay(800); /*延时800ms */ EX0=1; /*中断返回前,打开外部中断0中断*/ }
EA:总的中断允许控制位(总开关): =0 时禁止全部中断;=1 时允许中断。
3.中断优先级控制寄存器IP IP
— — PT2 PS PT1
(0B8H)
PX1 PT0 PX0
PX0/PX1:INT0/1优先级控制位: =0 时属低优先级; =1 时属高优先级。 PT0/PT1/PT2:T0/1/2中断优先级控制位: =0 时属低优先级; =1 时属高优先级。 PS1:串行口中断优先级控制位: =0 时属低优先级; =1 时属高优先级。
九、 中断嵌套
中断嵌套只能发生在单片机正在执行一个低优先级中断服 务程序的时候,此时又有一个高优先级中断产生,就会产生 高优先级中断打断低优先级中断服务程序,去执行高优先级 中断服务程序。高优先级中断服务程序完成后,再继续执行
低优先级中断服务程序。
【例5-4】电路如图5-10所示,设计一个中断嵌套程序。要 求K1和K2都未按下时,P1口的8只LED呈流水灯显示,当 K1按下再松开时,产生一个低优先级的外中断0请求(跳沿 触发),进入外中断0中断服务程序,左右4只LED交替闪烁
for(;;) { for(a=0;a<9;a++) { { Delay(500) /*延时*/ P1=play [a]; /*将已经定义的流水灯显示数据送到P1口*/ } EA=1; /*总中断允许*/ EX0=1; /*允许外部中断0中断*/ EX1=1 /*允许外部中断1中断*/ IT0=1; /*选择外部中断0为跳沿触发方式*/ IT1=1; /*选择外部中断1为跳沿触发方式*/ IP=0; /*两个外部中断均为低优先级*/ } }
【例】PX1=1;外中断INT1被设置成高优先级 PT0=0;定时器T0被设置成低优先级 总线方式 IP=0x04; //IP=0000 0100 将PX1设为1 PT0设为0;
4.中断优先级处理原则 对同时发生多个中断申请时: ☞不同优先级的中断同时申请(很难遇到) ——先高后低 ☞相同优先级的中断同时申请(很难遇到) ——按序执行 ☞正处理低优先级中断又接到高级别中断 ——高打断低 ☞正处理高优先级中断又接到低级别中断 ——高不理低
25
void int0_isr(void) interrupt 0 using 0 /*外中断0的中断服务函数*/ { for(;;) P1=0x0f; /*低4位LED灭,高4位LED亮*/ Delay(500) ; /*延时*/ P1=0xf0; /*高4位LED灭,低4位LED亮*/ Delay(500); /*延时*/ } void int1_isr (void) interrupt 2 using 1 /*外中断1的中断服务函数*/ { for(;;) { P1=0xff; /*全灭*/ Delay(500) ; /*延时*/ P1=0; /*全亮*/ Delay(500);} /*延时*/ }
三、中断系统硬件结构
四、单片机的中断矢量与优先级
中断矢量: 单片机的 6 个中断源分别对应有各 自的中断服务程序入口地址——中断矢量
中 断 源 申请标志 中断矢量 中断优先级 最高优先级
外部中断0( INT0)
定时/计数器0(T0)
IE0
TF0
0003H
000BH
外部中断1( INT1) 定时/计数器1(T1)
。此时按下K2再松开时,产生一个高优先级的外中断1请求
29
(跳沿触发),进入外中断1中断服务程序,P1口的8只LED 全部闪烁。当显示一段时间后,再从外中断1返回继续执行外
中断0中断服务程序,即P1口控制8只LED左右4只LED交替闪
烁。。设置外中断1为高优先级,外中断0为低优先级。
30
两个外中断嵌套控制8只LED显示的电路
。在外部中断1输入引脚P3.3( INT1* )引脚接有一只按钮
开关K2。程序要求K1和K2都未按下时,P1口的8只LED呈 流水灯显示,仅K1(P3.2)按下时,左右4只LED交替闪烁 。仅按下K2(P3.3),P1口的8只LED全部闪亮。两个外中 断的优先级相同。
22
两个外中断控制8只LED显示的电路
26
八、中断控制实例分析
实例1:用外部中断0来改变P1口LED灯的亮灭
实例2: 用LED数码管显示计数器对INT0的计数值 (1位数码管显示) 实例3:用LED数码管显示计数器对INT1的计数值 (2位数码管显示)
【例】编写一个用于统计外中断0的中断次数的中 断服务程序 int x; void int0() interrupt 0 using 1 { x++; }
S52系列有6个中断源(比S51多一个T2) ⑴2个外部中断请求:INT0,INT1 ⑵3个片内定时器/计数器T0、T1和T2中断请求: TF0,TF1,(TF2) ⑶1个串行口中断请求:TI/RI
二、与中断相关的特殊功能寄存器
1.定时器控制寄存器TCON (88H)
是管理定时器工作的SFR(其中低4位管外部中断, 高4位管定时器/计数器中断) TCON TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 TF0/TF1:定时器0/定时器1溢出中断申请标志位: =0:定时器未溢出; =1:定时器溢出申请中断,进中断后自动清零。 TR0/TR1:定时器运行启停控制位: =0:定时器停止运行; =1:定时器启动运行。
位的LED和高4位的LED交替闪烁。具体电路如下图所示。
18
控制8只LED交替闪烁的电路
19
参考程序如下: #include <reg51.h> void Delay(unsigned int i) /*延时函数Delay( ),i为形式参数,不 能赋初值*/ { unsigned int j; for(;i > 0;i--) for(j=0;j<333;j++) /*晶振为12MHz,j的选择与晶振频率有关*/ {;} /*空函数*/ } void main( ) /*主函数*/ { EA=1; /*总中断允许*/ EX0=1; /*允许外部中断0中断*/ IT0=1; /*选择外部中断0为跳沿触发方式*/ { P1=0;} /* P1口的8只LED全亮*/
Leabharlann Baidu
中断嵌套流程图
2.中断涉及的几个环节(单片机最多只能实现二级嵌套)
一开始你正在电脑上看视频
①中断源
手机
②中断申请
③开放中断
手机铃声响了 提醒你去接
你准备去接电话 在电脑上暂停我的这个视频 你开始接电话 挂断电话 回来
④保护现场
⑤中断服务
⑥恢复现场
⑦中断返回
继续看我的视频
3.AT89S52单片机的中断源
31
参考程序如下。
#include <reg51.h> unsigned char play [9]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf ,0xbf,0x7f};/*定义流水灯的显示数据*/ void Delay(unsigned int i) { unsigned int j; for(;i > 0;i--) for(j=0;j<125;j++) {;} } /*延时函数Delay( )*/
23
参考程序如下。
#include <reg51.h> void Delay(unsigned int i) /*延时函数Delay( ),i为形式参 数,不能赋初值*/ { unsigned int j; for(;i > 0;i--) for(j=0;j<125;j++) {; } /*空函数*/ }void main( ) /*主函数*/ { unsigned char play [9]={ 0xff,0xfe,0xfd,0xfb,0xf7,0xef, 0xdf,0xbf,0x7f};/*定义了流水灯的显示数据*/ unsigned char a;
3. 中断函数注意如下: (1)中断函数不能进行参数传递,如果中断函数中包 含任何参数声明都将导致编译出错。 (2)中断函数没有返回值,如果企图定义一个返回值 将得不到正确的结果,建议在定义中断函数时将其定义 为void类型,以明确说明没有返回值。
七、C51编程举例 本节通过几个例程介绍有关中断应用的程序的编写。
2.中断允许寄存器IE (0A8H)
IE
EA — ET2 ES ET1 EX1 ET0 EX0
EX0/EX1/ET1/ET0/ES 位: 分别是INT0/1,Timer0/1,串行口的中断允 许控制位: =0 时禁止中断; =1 时允许中断。 ET2:T2中断允许控制位(仅52系列有) =0 时禁止中断; =1 时允许中断。
1. 单一外中断的应用
【例】在 51单片机的 P1口上接有 8只 LED 。在外部中断 0输入 引脚P3.2(INT0*)引脚接有一只按钮开关K1。程序要求将 外部中断 0设置为负跳沿触发。在程序启动时, P1口上的 8 只 LED 亮。按一次按钮开关 K1 ,使引脚接地,产生一个负
跳沿触发的外中断 0 中断请求,在中断服务程序中,让低 4
C51编译器从绝对地址8m+3处产生一个中断向量,其中 m为中断号,也即interrupt后面的数字。该向量包含一 个到中断函数入口地址的绝对跳转。
2.using n修饰符 修饰符using n用于指定本函数内部使用的工作寄 存器组,其中n的取值为0~3,表示寄存器组号。 可以省略 省略后系统自动选择
本例程包含了两个部分,一是中断系统初始化部分,另一是 中断处理服务函数部分。
21
2. 两个外中断的应用
当多个中断源时,只需增加相应的中断服务函数即可。例5-3是 处理两个外中断请求的例子 【例】如下图所示,在51单片机的P1口上接有8只LED。在外 部中断0输入引脚P3.2(INT0*)引脚接有一只按钮开关K1
TCON TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 IT0/IT1:外部中断请求的触发方式选择位: =0:在INT0/INT1端申请中断的信号低电平触发; =1:在INT0/INT1端申请中断的信号负跳变触发. IE0/IE1:外部中断申请标志位: =0:没有外部中断申请; =1:有外部中断申请。
第十讲
51单片机中断系统
一、单片机中断系统
1.中断的定义
所谓中断,是指CPU正在处理某些事务的时候 ,外部又发生了某一事件,请求CPU及时处理。于 是,CPU暂时中断当前的工作,转而处理所发生的 事件。处理完毕,再回到原来被中断的地方,继续 原来的工作。这样的过程,称为中断。
中断示意图
中断方式流程图
⑴在CPU已经开放了外部中断允许的前提下; ⑵在INT0/INT1引脚输入一个负脉冲或低电平; ⑶TCON寄存器中的IE0/IE1标志位自动变“1”, ⑷检测到IE0/IE1变“1”后,将产生指令:
执行中断服务程序; ⑸并将IE0/IE1标志位自动清“0”,以备下次申请。
六、C51中断函数的编写
1.interrupt m 修饰符
interrupt m C51中断函数必须通过它进行修饰。在C51 程序设计中,当函数定义时用了interrupt m修饰符,系统编 译时把对应函数转化为中断函数,自动加上程序头段和尾段, 并按51系统中断的处理方式自动把它安排在程序存储器中的相 应位置。
在该修饰符中,m的取值为0~31,对应的中断情况如下: 0——外部中断0 1——定时/计数器T0 2——外部中断1 3——定时/计数器T1 4——串行口中断 5——定时/计数器T2 其它值预留。