RYMCU

Nebula Pi 开发板应用(三)—呼吸灯的实现

ii11nnocent 2 年前
# 呼吸灯

呼吸灯指的是 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 ++;	
}

Breath.mp4

后发布评论