LED 呼吸灯程序及原理

发布于 2020-08-30  72 次阅读


主程序如下所示

int main (void){//主程序
	//定义需要的变量
	u8 MENU;
	u16 t,i;
	//初始化程序
	RCC_Configuration(); //时钟设置
	LED_Init();
	//设置变量的初始值
	MENU = 0;
	t = 1;
	//主循环
	while(1){
		//菜单0
		if(MENU == 0){ //变亮循环
			for(i = 0; i < 10; i++){
				GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1)); //LED1接口输出高电平1
				delay_us(t); //延时
				GPIO_WriteBit(LEDPORT,LED1,(BitAction)(0)); //LED1接口输出低电平0
				delay_us(201-t); //延时
			}
			t++;
			if(t==200){
				MENU = 1;
			}
		}
		//菜单1
		if(MENU == 1){ //变暗循环
			for(i = 0; i < 10; i++){
				GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1)); //LED1接口输出高电平1
				delay_us(t); //延时
				GPIO_WriteBit(LEDPORT,LED1,(BitAction)(0)); //LED1接口输出低电平0
				delay_us(201-t); //延时
			}
			t--;
			if(t==1){
				MENU = 0;
			}
		}		
	}
}


/*********************************************************************************************
 * 杜洋工作室 www.DoYoung.net
 * 洋桃电子 www.DoYoung.net/YT 
*********************************************************************************************/
/*

【变量定义】
u32     a; //定义32位无符号变量a
u16     a; //定义16位无符号变量a
u8     a; //定义8位无符号变量a
vu32     a; //定义易变的32位无符号变量a
vu16     a; //定义易变的 16位无符号变量a
vu8     a; //定义易变的 8位无符号变量a
uc32     a; //定义只读的32位无符号变量a
uc16     a; //定义只读 的16位无符号变量a
uc8     a; //定义只读 的8位无符号变量a

#define ONE  1   //宏定义

delay_us(1); //延时1微秒
delay_ms(1); //延时1毫秒
delay_s(1); //延时1秒

基本思路

利用人眼的视觉暂留现象,通过控制一个周期里面“亮”和“暗”所占的时间,可以实现控制LED的显示亮度,进而通过不断改变“占空比”就可以实现“呼吸灯”的效果。
在程序中,t++是用来调节精度的,比如可以改成t=t+2就把精度从1变成了2。t的最大值决定了达到最高亮度所需要的时间,或者说决定了呼吸灯的速度。for循环的意义则是为了能够让某个固定亮度多保持若干个周期,也是为了控制呼吸灯的速度。


追求理性 独立思考 不做韭菜