提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
51单片机中断嵌套,定时器延时
前言
这里讲的是中断嵌套,具体的话是用定时器延时,外部中断触发,不断切换
提示:以下是本篇文章正文内容,下面案例可供参考
一、如何做到定时器延时?
1、设置定时器:若晶振为12M赫兹,则定时器每接受一个脉冲需要的时间为1us;设置定时其工作方式为方式2,为八位自动重装载模式(TMOD=0X02),既一次定时最多0.256ms,我们这里设置一次定时为0.2ms(即我们设置TL0=0X38,TH0=OX38);
2、定时器中断:定时器中断需要设置总中断,源中断,优先级以及定时器的计数运行控制位,打开总中断(EA = 1),源中断(ET0 = 1),优先级设置高优先级(PT0 = 1)(以便于在中断触发程序中调用),设置计数运行控制位为停止模式(TR0=0)(这里先不开启定时器,在定时器延时函数
中在开启定时器,延时完成后再关闭定时器),编写定时器中断程序(这里用的是定时时器0中断,中断触发等级为interrupt 1)。
二、如何做到外部中断?
外部中断:设置外部中断要设置触发方式,总中断,源中断,以及优先级(单一中断优先级可不设置,不设置默认为低优先级,以及外部中断请求标志位硬件自动清零),这里设置下降沿触发(IT0 = 1),打开总中断(EA = 1),源中断(EX0 = 1),编写中断触发程序(这里用的是外部中断0,即中断触发程序等级为最高(不是优先级,是指在同一个优先级里面的等级梯度 ),为interrupt 0)。
三、完整代码
代码如下(示例):
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
int a1,a2=0,a3,a4;
/*延迟函数*/
void delay_ms(uint x)
{
uint i,j;
for(i=0;i<=x;i++)
for(j=0;j<123;j++);
}
/*定时器延时函数*/
void T_delay_ms(int x);
void main()
{
uint a;
a = 0x01;
//设置定时器
TMOD = 0X02; //设置定时其工作方式为方式2
PT0 = 1;
TL0 = 0X38;
TH0 = 0X38; //设置一次定时为0.2ms
//设置中断
EA = 1;
ET0 = 1;
TR0=0; //定时器0中断
IT0 = 1;
EX0 = 1; //外部中断0
while(1)
{
P1 = a;
a = _crol_(a,1);
T_delay_ms(250);
}
}
/*定时器延时函数*/
void T_delay_ms(int x)
{
a1 = 5*x;
TR0=1;
while(!a2)
{}
a2 = 0;
TR0=0;
}
/*定时器中断函数*/
void ET0_int() interrupt 1
{
a1--;
if(a1 == 0)
a2 = 1;
}
/*外部中断0中断触发函数*/
void EX0_int() interrupt 0
{
int i,a3=0,a4=0;
if(a1!=0) //当SP在定时器延时函数里时,且一次延时还没有完全结束时
a3 = a1; //记录下a1的值以便于在中断结束后延时可以继续执行
if((a1==0)&&(a2==1))
{
a4 = 1;
a2 = 0;
}
for(i=0;i<5;i++)
{
P1 = 0XFF;
T_delay_ms(250);
P1 = 0X00;
T_delay_ms(250);
}
if(a3!=0)
{ a1 = a3; //给a1赋回延时被打断时的值
TR0=1; //打开中断
}
if(a4==1)
a2 = 1;
}
# 总结
<font color=#999AAA >
其他函数说明:
主函数:设置定时器,设置中断,令LED灯以250ms的间隔依次亮起。
中断执行函数:令全部LED灯熄灭与亮起交替,时间间隔为250ms,反复5次
定加粗样式时器延时函数:设置该函数有一个形参x,打开定时器(TR0=1),编写函数使延时可
以完成(要先定义两个全局变量a1,a2,在定时器中断执行函数中设置当延时完成时
a2为1,否则为0),当在定时器延时函数中检测到a2=0,则往下执行,使a1,a2复
位(a1=0;a2=0;)关闭定时器(TR0=0)。