基于51定时器下的呼吸灯

关于呼吸灯实现原理

        实现呼吸灯主要是通过改变一个周期内的高低电平时间的占比来实现。在一个固定的周期中,当低电平时间所占周期时间越长,则亮度越高(假设低电平有效);当不断改变低电平所占的时间(占空比)就可以实现呼吸灯。(PWM原理就差不多这个原理)

 

因此要实现呼吸灯就要不断改变占空比,并且按照占空比递增(灯逐渐变亮)、占空比递减(灯逐渐变暗)来实现!!!

呼吸灯实现

1.通过延时函数实现

        通过延时函数使灯亮一定的时间然后熄灭,并且不断改变灯亮的时间(灯亮、熄总时间不能改变);因为使用延时函数会使程序执行过程中停顿而影响整体,故使用定时器来实现计时 效果会更好。

2.通过定时器实现 

         定时器配置 

#include <REGX52.H>

/**
   *@brieef		定时器0初始化,1毫秒@11.0592MHz 
   *@param		无
   *@retival	无
   */
void Timer0Init(void)	//1毫秒@11.0592MHz
{

	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x66;			//设置定时初值
	TH0 = 0xFC;			//设置定时初值
	TF0 = 0;			//清除TF0标志
	TR0 = 1;			//定时器0开始计时
	ET0=1;         		//允许中断
	EA=1;          	 	//允许总中断
	PT0=0;         	 	//中断优先级
	
}



/*
****				定时器中断函数模板
void Timer0_run() interrupt 1
{	
	TL0 = 0x66;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值

		
	}
}
*/

         呼吸灯执行

#include <REGX52.H>
#include "time0.h"


sbit LED=P3^0;	//呼吸灯显示




int main ()
{
	Timer0Init();    //定时器初始化
	while(1)
	{
		
		
	}
}



void Timer0_run() interrupt 1            //定时器中断执行函数
{	
	static unsigned char Compare=0;		//PWM比较数
	static unsigned char Count;			//PWM计次数
	static unsigned char Flag;			//标志位
	TL0 = 0xA4;		//设置定时初值
	TH0 = 0xFF;		//设置定时初值		//100 us计时

	Count++;
	Count%=100;
	Compare%=100;	//控制数范围0~199
	if(Compare>=99) //用于置Flag,已达到呼与吸转换
	{
		Flag=!Flag;
		Compare=0;
		Count=0;
	}
/***********************************************************************************
  * @brief  当Flag等于0时,灯由灭到亮	

  */	
	if(Flag==0)
	{
			if(Count<Compare)
		{
			LED=0;
		}
		else if(Count>Compare)
		{
			LED=1;
			if(Count>=99)
			{
				Compare=Compare+1;
				
			
			}
		}
		
	}

/***********************************************************************************
  * @brief  当Flag等于1时,灯由亮到灭	

  */	
	else if(Flag==1)
	{
			if(Count<Compare)
		{
			LED=1;
		}
		else if(Count>Compare)
		{
			LED=0;
			if(Count>=99)
			{
				Compare=Compare+1;
				
			
			}
		}
		
	}

	

}
  • 18
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值