51单片机中断程序代码,为什么外部中断0中断函数运行之后,T0中断函数就无法继续执行了?

51单片机中断的使用及优先级设置51单片机有两个外部中断,两个定时器/计数器,两个外部中断分别是int0,int1。定时器/计数器分别是t0,t1,还有一个串口中断TI/RI,加起来有五个中断。它们在硬件上的排列顺序是INT0,T0,INT1,T1,TI/RI,这5个中断源的中断顺序号依次就是interrupt 后面的0,1,2,3,4。其中定时器可以选择工作方式,因为我们使用定时器的方式不一而足,有的程序会用来计时,有的程序用来计数,根据程序要求设置工作方式各取所需。下图显示了51单片机中的4个寄存器,分别是TCON,SCON,IE,IP,还有我们常用的定时器模式控制寄存器TMOD。一、TMOD:定时器/计数器工作方式控制寄存器TMOD中存放两个定时器/计数器,每个定时器都可以设置它们的工作方式,如定时器0的工作方式1设置就是TMOD=0x01,定时器1设置方法同定时器0,不过设置位数变到前4位TMOD=0x10。如果两个都用方式1的话就是TMOD=0x11了吧。二、IP:优先级寄存器IP寄存器是控制中断优先级的寄存器,在51单片机中可以设置中断为高优先级或低优先级,以达到嵌套的目的。想要嵌套中断,必须使用到我们前面说过一嘴的IP寄存器,否则int0的优先级只是查询优先级最高,而不是中断优先级最高。IP寄存器结构如下图,通过设置IP寄存器可以设定由哪个中断最先运行,51单片机可以设置二级中断服务嵌套。通过IP寄存器结构我们可以明显看到下面5个中断所处的位置,因此可以轻易的设置想要的中断优先级,例如设置PX0,即外部中断int0优先级最高,就是IP=0x01;或者PX0=1;效果相同。举一反三,其他中断也是如此设置。三、protues仿真了解了中断和定时器的基本使用方式就可以画仿真图以及写程序了,先画一个简单的仿真图。四、编写代码图中52单片机有两个按键和两个LED灯,我们设置他们的功能。1.使用定时器定时2秒,两秒后点亮两个LED灯,点亮LED灯后重置定时器,如果LED灯被熄灭后间隔两秒又会被重新点亮。2.按键1按下后,通过中断int0把两个LED熄灭一段时间,int0优先级设置为最高(优先级必须设置,设置后才能嵌套,否则即使它是int0,也不能嵌套进int1中)。3.按键2被按下后,LED1闪烁5次。4.最后效果是,当定时器点亮两个LED灯,我们按下按键2,LED1闪烁。此时,按下按键1,LED1和LED2全部熄灭并保持一段时间后,LED1继续未完成的闪烁,直至完成后两个LED灯依旧点亮。通过简单的功能实现,我们可以充分的了解外部中断和定时器的具体应用。代码如下:#include"reg52.h"
#define uchar unsigned char
//定义字符类型
#define uint unsigned int
sbit led=P2^0;
//定义IO口P2.0为led
sbit led1=P2^1;
uchar flag; //定义flag类型
void delay(){
//延时程序
int i,j;
for(i=500;i>0;i--)
for(j=100;j>0;j--);
}
void init()//初始化,即打开各中断开关
{
TMOD=0x01;
TH0=(65536-50000)/256; //定时器0装初值
TL0=(65536-50000)%256; //同上
IT0=1;//外部中断0为跳变沿触发方式
IT1=1;//外部中断1为跳变沿触发方式
EA=1;//开总中断
EX0=1;//打开外部中断0
EX1=1;//打开外部中断1
ET0=1;//打开定时器0中断开关
TR0=1;//打开定时器0运行开关
IP=0x01;//设置int0优先级为高,与PX0=1;等效
}
/*按键1*/
void int0() interrupt 0 using 0//外部中断0的执行程序。
{
//interrupt 0指外部中断0 using 0指第0组寄存器
led=0;
//熄灭LED灯
led1=0;
delay();//延时
delay();
delay();
}
void t0() interrupt 1 using 1 //定时器
{
TH0=(65536-50000)/256; //定时器0装初值
TL0=(65536-50000)%256; //同上
flag++; //记录定时器经过的时间
if(flag==40){
//定时2秒后执行,flag=40时约两秒
led=1;
//点亮LED灯
led1=1;
flag=0; //重置定时,达到每两秒点亮一次的目的
}
}
/*按键2*/
void int1() interrupt 2 using 2//外部中断1的执行程序。
{
unsigned char i;
for(i=0;i<10;i++)//实现led闪烁五次。
{
led=~led;
delay();
}
}
void main()//主函数
{
init();
//初始化
led=0;
//指定LED灯开始的时候是熄灭状态
led1=0;
while(1);
}
proteus仿真加keil4代码文件下载链接:https://download.csdn.net/download/CenJuLong/18281185`

我要回帖

更多关于 单片机中断程序代码 的文章

 

随机推荐