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)。

  • 7
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值