呼吸灯指的是 LED 灯的亮 → 灭 → 亮有一个渐变的过程,就好像 LED 灯会呼吸一样,实现呼吸灯利用了 PWM 的思想,即改变每个显示周期中 LED 灯亮、灭的时间,可以用延时或者定时器来实现。具体代码如下:
延时方式:
#include "reg52.h"
unsigned int t=500; //每个周期的显示时间
unsigned int t0=1; //初始周期中LED灯点亮的时间
sbit LED1=P1^0;
void delay(unsigned int t);
void delay(unsigned int t)
{
while(t--);
}
void main(void)
{
while(1)
{
/****LED1由暗到亮****/
for(t0=1;t0<t;t0++) /***LED1=1的时间由1%-99%
第一次t0=1,LED1的点亮时间占1%,熄灭时间占99%
…………
最后一次t0=99,LED1的点亮时间占99%,熄灭时间占1%***/
{
LED1=0;delay(t0);
LED1=1;delay(t-t0);
}
/****LED1由亮到暗****/
for(t0=t-1;t0>0;t0--) /***LED1=0的时间由99%-1%
第一次t0=99,LED1的点亮时间占99%,熄灭时间占1%
…………
最后一次t0=1,LED1的点亮时间占1%,熄灭时间占99%***/
{
LED1=0;delay(t0);
LED1=1;delay(t-t0);
}
}
}
定时器方式:
#include "reg52.h"
sbit Led = P1^0;
#define fosc 11059200 //单片机晶振
#define Time(t) 256-(t*fosc)/12 //工作方式2初值,单位us
#define PwmStage(n) 100/n //占空比改变的量,每次改变n
unsigned int count = 0; //用来进行时间计数
unsigned char PWM = 0; //用来存储PWM值
unsigned int update = 0; //PWM值更新变量
bit flag = 0; //用来进行呼吸灯呼吸方向设定
//定时器初始化,工作方式2,初值100us
void Timer0_Init(void)
{
TMOD = 0x02; //定时器工作在方式2,8位自动重装载定时器
TH0 = Time(100); //100us定时初值
TL0 = Time(100);
ET0 = 1;
EA = 1;
TR0 = 1;
}
//呼吸灯主程序
void LedBreath(void)
{
if( count == PwmStage(5) )
{
Led = 1;
count = 0;
}
if( count == PWM )
{
Led = 0;
}
if( update == 200 ) //200次是20ms,每20ms改变一次PWM值
{
if( flag == 0 ) //flag=0时,认为是占空比增加的模式
{
update = 0; //清零变量
PWM ++; //占空比增加1,对应增加的比例为5%
if( PWM == PwmStage(5) )
{
flag = 1; //占空比增加到100%后,flag置1,开始减少占空比
}
}
else if( flag == 1 ) //flag=1时,认为是占空比减少的模式
{
update = 0; //清零变量
PWM --; //占空比减少1,对应减少的比例为5%
if( PWM == 0 )
{
flag = 0;
}
}
}
}
void main(void)
{
Timer0_Init();
Led = 1;
while(1)
{
LedBreath();
}
}
void Timer0(void) interrupt 1
{
count ++;
update ++;
}