中断原理应用程序的设计说明Word格式文档下载.docx
《中断原理应用程序的设计说明Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《中断原理应用程序的设计说明Word格式文档下载.docx(14页珍藏版)》请在冰点文库上搜索。
6.2中断系统的控制
定时器/计数器控制寄存器TCON
TCON的功能是接收外部中断源(、)和定时器(T0、T1)送来的中断请求信号。
字节地址为88H,可以进行位操作。
表5-5列出了TCON的格式。
8FH
8EH
8DH
8CH
8BH
8AH
89H
88H
TF1
TR1
TF0
TR0
IT0
IT1
IE0
表6-5定时器/计数器控制寄存器TCON的格式
•IT0和IT1分别为外部中断和的触发方式控制位,可以进行置位和复位。
•IE0和IE1分别为外部中断和的中断请求标志位。
•TF0和TF1分别为定时器/计数器T0和T1的中断请求标志。
•TR0和TR1分别为定时器/计数器T0和T1的启动/停止位。
中断允许控制寄存器IE
CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制。
表6-6中断允许控制寄存器IE的格式
§
EX0(IE.0),外部中断0允许位;
ET0(IE.1),定时/计数器T0中断允许位;
EX1(IE.2),外部中断0允许位;
ET1(IE.3),定时/计数器T1中断允许位;
ES(IE.4),串行口中断允许位;
EA(IE.7),CPU中断允许(总允许)位。
中断优先级控制寄存器IP
MCS-51单片机有两个中断优先级,即可实现二级中断服务嵌套。
每个中断源的中断优先级都是由中断优先级寄存器IP中的相应位的状态来规定的。
表6-7中断优先级控制寄存器IP的格式
PX0(IP.0),外部中断0优先级设定位;
PT0(IP.1),定时/计数器T0优先级设定位;
PX1(IP.2),外部中断0优先级设定位;
PT1(IP.3),定时/计数器T1优先级设定位;
PS(IP.4),串行口优先级设定位;
PT2(IP.5),定时/计数器T2优先级设定位。
串行通信控制寄存器SCON
SCON的功能主要是接收串行通信口送到的中断请求信号,具体格式见串口通信有关章节。
MCS-51单片机的中断优先级有三条原则:
CPU同时接收到几个中断时,首先响应优先级别最高的中断请求。
正在进行的中断过程不能被新的同级或低优先级的中断请求所中断。
正在进行的低优先级中断服务,能被高优先级中断请求所中断。
为了实现上述后两条原则,中断系统部设有两个用户不能寻址的优先级状态触发器。
其中一个置1,表示正在响应高优先级的中断,它将阻断后来所有的中断请求;
另一个置1,表示正在响应低优先级中断,它将阻断后来所有的低优先级中断请求。
一个中断源的中断请求被响应,需满足以下必要条件。
(1)CPU开中断,即IE寄存器中的中断总允许位EA=1。
(2)中断源发出中断请求,即该中断源对应的中断请求标志位为1。
(3)中断源的中断允许位=1,即该中断没有被屏蔽。
(4)无同级或更高级的中断正在被服务。
6.3中断嵌套
中断嵌套的概念
是指终端系统正在执行一个中断服务时,有另一个优先级更高的中断提出中断请求,这时会暂时终止当前正在执行的级别较低的中断源的服务程序,去处理级别更高的中断源,待处理完毕,再返回到被中断了的中断服务程序继续执行,这个过程就是中断嵌套。
6.4中断程序设计
例1:
外部中断0的应用举例
本实例中LED灯依次点亮,形成流水灯,同时伴有蜂鸣器发声。
当按住时,8位LED全部点亮,蜂鸣器停止发声。
当松开时,程序恢复到原来的状态。
图6—8外部中断应用原理图
#include<
reg52.h>
//包含头文件
#include<
intrins.h>
//包含_crol_()函数所在头文件
unsignedchartemp,num;
//声明临时变量
unsignedintx,y,z;
sbitbeep=P2^3;
//蜂鸣器位声明
sbitduan=P1^6;
//数码管段控制位声明
sbitwei=P1^7;
//数码管位控制位声明
voiddelay(uint);
//声明延时子函数
voidmain()
{
EA=1;
//开总中断
EX0=1;
//开外部中断
duan=0;
//关闭数码管的段选
wei=0;
//关闭数码管的位选
temp=0xfe;
//临时变量赋值
while
(1)//程序无限循环
{
for(num=0;
num<
8;
num++)//8位LED依次点亮
{
P0=temp;
beep=0;
//蜂鸣器发声
delay(100);
//延时100ms
temp=_crol_(temp,1);
//循环左移函数
P0=0xff;
beep=1;
//蜂鸣器关闭
}
voiddelay(z)
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
voidex0()interrupt0
P0=0x00;
//点亮8位LED
//关闭蜂鸣器
程序解析:
(1)本程序的一大特点是用_crol_()函数实现了8位LED的依次点亮。
简单明了,让同学们知道了在编写程序时调用一些函数会使程序的编写大为简化,但要注意在程序开头包含该函数所在的头文件。
(2)在编写中断服务子函数时,一定要注意函数的标号(即中断的优先级),该程序用的是,在所有中断中优先级最高,所以标号为0。
(3)在主函数的函数初始化中一定要依次开总中断,外部中断。
这样外部中断才能够被触发。
(4)注意延时子函数的编写,这个会经常用到。
例2:
用定时器T0的中断控制8位LED闪烁
本实例要求用定时器T0中断方式控制P0口8位LED以100ms周期性闪烁。
图6-9定时器T0的中断控制8位LED原理图
//包含51单片机寄存器定义的头文件
voidmain(void)
ET0=1;
//定时器T0中断允许
TMOD=0x01;
//使用定时器T0的模式2
TH0=(65536-46083)/256;
//定时器T0的高8位赋初值
TL0=(65536-46083)%256;
TR0=1;
//启动定时器T0
while
(1)//无限循环等待中断
;
voidTime0(void)interrupt1using0//“interrupt”声明函数为中断服务函数
//其后的1为定时器T0的中断编号;
0表示使用第0组工作寄存器
P0=~P0;
TH0=(65536-50000)/256;
//定时器T0的高8位重新赋初值
TL0=(65536-50000)%256;
(1)本程序首先要注意初始化定时器的程序编写方法。
具体见定时器有关章节。
(2)注意中断服务子函数中的中断标号和定时器初值重装问题。
例3:
用定时器T0的方式控制播放《好人一生平安》
本实例要求定时器T0的中断控制播放《好人一生平安》,T0工作于方式0。
硬件电路图如下。
图6-10用定时器T0的方式控制播放《好人一生平安》电路图
//包含51单片机寄存器定义的头文件
sbitsound=P2^3;
//将sound位定义为P2.3
unsignedintC;
//储存定时器的定时常数
//以下是C调低音的音频宏定义
#definel_dao262//将“l_dao”宏定义为低音“1”的频率262Hz
#definel_re286//将“l_re”宏定义为低音“2”的频率286Hz
#definel_mi311//将“l_mi”宏定义为低音“3”的频率311Hz
#definel_fa349//将“l_fa”宏定义为低音“4”的频率349Hz
#definel_sao392//将“l_sao”宏定义为低音“5”的频率392Hz
#definel_la440//将“l_a”宏定义为低音“6”的频率440Hz
#definel_xi494//将“l_xi”宏定义为低音“7”的频率494Hz
//以下是C调中音的音频宏定义
#definedao523//将“dao”宏定义为中音“1”的频率523Hz
#definere587//将“re”宏定义为中音“2”的频率587Hz
#definemi659//将“mi”宏定义为中音“3”的频率659Hz
#definefa698//将“fa”宏定义为中音“4”的频率698Hz
#definesao784//将“sao”宏定义为中音“5”的频率784Hz
#definela880//将“la”宏定义为中音“6”的频率880Hz
#definexi987//将“xi”宏定义为中音“7”的频率523H
//以下是C调高音的音频宏定义
#defineh_dao1046//将“h_dao”宏定义为高音“1”的频率1046Hz
#defineh_re1174//将“h_re”宏定义为高音“2”的频率1174Hz
#defineh_mi1318//将“h_mi”宏定义为高音“3”的频率1318Hz
#defineh_fa1396//将“h_fa”宏定义为高音“4”的频率1396Hz
#defineh_sao1567//将“h_sao”宏定义为高音“5”的频率1567Hz
#defineh_la1760//将“h_la”宏定义为高音“6”的频率1760Hz
#defineh_xi1975//将“h_xi”宏定义为高音“7”的频率1975Hz
voiddelay()
unsignedchari,j;
for(i=0;
i<
250;
i++)
for(j=0;
j<
j++)
//以下是《渴望》片头曲的一段简谱
unsignedintcodef[]={re,mi,re,dao,l_la,dao,l_la,//每行对应一小节音符
l_sao,l_mi,l_sao,l_la,dao,
l_la,dao,sao,la,mi,sao,
re,
mi,re,mi,sao,mi,
l_la,l_la,dao,l_la,l_sao,l_re,l_mi,
l_sao,
re,re,sao,la,sao,
fa,mi,sao,mi,
la,sao,mi,re,mi,l_la,dao,
re,
l_la,dao,re,l_la,dao,re,mi,
0xff};
//以0xff作为音符的结束标志
//以下是简谱中每个音符的节拍
//"
4"
对应4个延时单位,"
2"
对应2个延时单位,"
1"
对应1个延时单位
unsignedcharcodeJP[]={4,1,1,4,1,1,2,
2,2,2,2,8,
4,2,3,1,2,2,
10,
4,2,2,4,4,
2,2,2,2,4,
2,2,2,2,2,2,2,
4,4,4,2,2,
4,2,4,4,
4,2,2,2,2,2,2,
2,2,2,2,6,
4,2,2,4,1,1,4,
10
};
//定时器T0中断允许
TMOD=0x00;
//使用定时器T0的模式1(13位计数器)
while
(1)//无限循环
i=0;
//从第1个音符f[0]开始播放
while(f[i]!
=0xff)//只要没有读到结束标志就继续播放
C=460830/f[i];
TH0=(8192-C)/32;
//可证明这是13位计数器TH0高8位的赋初值方法
TL0=(8192-C)%32;
//可证明这是13位计数器TL0低5位的赋初值方法
JP[i];
j++)//控制节拍数
delay();
//延时1个节拍单位
TR0=0;
//关闭定时器T0
i++;
//播放下一个音符
}
voidTime0(void)interrupt1using1
sound=!
sound;
//将P2.3引脚输出电平取反,形成方波
(1)首先,给出本实例的目的是让大家能够更好的理解定时器中断的用途,大家没有必要对程序中的每一条语句都了解的特别清楚,而主要抓住程序最后的定时器T0的中断服务函数即可。
(2)单片机播放歌曲涉及到音调与频率的关系,这不是我们要讲解的主要容,在此不做过多解析。