关于呼吸灯实现原理
实现呼吸灯主要是通过改变一个周期内的高低电平时间的占比来实现。在一个固定的周期中,当低电平时间所占周期时间越长,则亮度越高(假设低电平有效);当不断改变低电平所占的时间(占空比)就可以实现呼吸灯。(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;
}
}
}
}