单片机RGB三色灯七彩渐变以及SOS效果实现

首先我们需要使用硬件定时器来实现类似软件PWM,开一个定时器,运行如下代码来达到我们想要的目的,之后我们只需要依次改变r_duty、g_duty、b_duty  占空比就可以实现想要的效果。

		if(r_duty == 0)
		{
				BSP_LED_Off(LEDR);
		}
		else if(r_duty == 255)
		{
				BSP_LED_On(LEDR);
		}
		else 
		{
				if(now_duty < r_duty)	
				{
						BSP_LED_On(LEDR);
				}
				else
				{
						BSP_LED_Off(LEDR);
				}
		}
		if(g_duty == 0)
		{
				BSP_LED_Off(LEDG);
		}
		else if(g_duty == 255)
		{
				BSP_LED_On(LEDG);
		}
		else 
		{
				if(now_duty < g_duty)	
				{
						BSP_LED_On(LEDG);
				}
				else
				{
						BSP_LED_Off(LEDG);
				}
		}
		if(b_duty == 0)
		{
				BSP_LED_Off(LEDB);
		}
		else if(b_duty == 255)
		{
				BSP_LED_On(LEDB);
		}
		else 
		{
				if(now_duty < b_duty)	
				{
						BSP_LED_On(LEDB);
				}
				else
				{
						BSP_LED_Off(LEDB);
				}
		}
}
now_duty ++;

七彩渐变效果实现,本例七彩渐变灯,前面还有红、绿、蓝、黄、紫、青、白七种单色灯,且七彩以这七种颜色实现,单色灯只需要给定初始占空比即可实现,本例不讨论,故now_rgb从8开始。以下代码仅供学习参考使用。

if(now_rgb == 8)//七彩灯模式
{
		if(now_duty == 255)
		{
				switch(now_Seven_and_SOS_Step)
				{
				case 0 :	
						if(now_seven_and_SOS_Cnt == 0)
						{
								if(r_duty == 255)
								{
										now_seven_and_SOS_Cnt = 1;
								}
								else
										r_duty ++;
						}
						else
						{
								if(r_duty == 0)
								{
										now_seven_and_SOS_Cnt = 0;
										now_Seven_and_SOS_Step ++;
								}
								else
										r_duty --;													
						}
				break;
				case 1 :	
						if(now_seven_and_SOS_Cnt == 0)
						{
								if(g_duty == 255)
								{
										now_seven_and_SOS_Cnt = 1;
								}
								else
										g_duty ++;
						}
						else
						{
								if(g_duty == 0)
								{
										now_seven_and_SOS_Cnt = 0;
										now_Seven_and_SOS_Step ++;
								}
								else
										g_duty --;													
						}
				break;
				case 2 :	
						if(now_seven_and_SOS_Cnt == 0)
						{
								if(b_duty == 255)
								{
										now_seven_and_SOS_Cnt = 1;
								}
								else
										b_duty ++;
						}
						else
						{
								if(b_duty == 0)
								{
										now_seven_and_SOS_Cnt = 0;
										now_Seven_and_SOS_Step ++;
								}
								else
										b_duty --;													
						}
				break;
				case 3 :	
						if(now_seven_and_SOS_Cnt == 0)
						{
								if(g_duty == 255)
								{
										now_seven_and_SOS_Cnt = 1;
								}
								else
								{
										r_duty ++;																
										g_duty ++;
								}
						}
						else
						{
								if(g_duty == 0)
								{
										now_seven_and_SOS_Cnt = 0;
										now_Seven_and_SOS_Step ++;
								}
								else
								{
										r_duty --;															
										g_duty --;
								}															
						}
				break;
				case 4 :	
						if(now_seven_and_SOS_Cnt == 0)
						{
								if(r_duty == 128)
								{
										now_seven_and_SOS_Cnt = 2;
								}
								else
								{
										now_seven_and_SOS_Cnt = 1;		
								}
						}
						else if(now_seven_and_SOS_Cnt == 1)
						{
								r_duty ++;																
								b_duty ++;
								now_seven_and_SOS_Cnt = 0;		
						}
						else if(now_seven_and_SOS_Cnt == 2)
						{
								if(r_duty == 0)
								{
										now_seven_and_SOS_Cnt = 0;		
										now_Seven_and_SOS_Step ++;
								}
								else
								{
										now_seven_and_SOS_Cnt = 3;		
								}
						}
						else if(now_seven_and_SOS_Cnt == 3)
						{
								r_duty --;																
								b_duty --;
								now_seven_and_SOS_Cnt = 2;		
						}
				break;
				case 5 :	
						if(now_seven_and_SOS_Cnt == 0)
						{
								if(b_duty == 128)
								{
										now_seven_and_SOS_Cnt = 2;
								}
								else
								{
										now_seven_and_SOS_Cnt = 1;		
								}
						}
						else if(now_seven_and_SOS_Cnt == 1)
						{
								g_duty ++;																
								b_duty ++;
								now_seven_and_SOS_Cnt = 0;		
						}
						else if(now_seven_and_SOS_Cnt == 2)
						{
								if(b_duty == 0)
								{
										now_seven_and_SOS_Cnt = 0;		
										now_Seven_and_SOS_Step ++;
								}
								else
								{
										now_seven_and_SOS_Cnt = 3;		
								}
						}
						else if(now_seven_and_SOS_Cnt == 3)
						{
								g_duty --;																
								b_duty --;
								now_seven_and_SOS_Cnt = 2;		
						}
				break;
				case 6 :	
						if(now_seven_and_SOS_Cnt == 0)
						{
								if(g_duty == 255)
								{
										now_seven_and_SOS_Cnt = 1;
								}
								else
								{
										r_duty ++;																
										g_duty ++;
										b_duty ++;
								}
						}
						else
						{
								if(g_duty == 0)
								{
										now_seven_and_SOS_Cnt = 0;
										now_Seven_and_SOS_Step = 0;
								}
								else
								{
										r_duty --;															
										g_duty --;
										b_duty --;					
								}															
						}
				break;
				}
		}
}

SOS功能实现    红灯快闪3下,然后慢闪3下,再快闪3下,接着停顿8s,再继续上述循环闪烁,(快闪1s三下,慢闪2s一下)

else if(now_rgb == 9)//SOS模式
{
		if(now_duty == 255)
		{
				switch(now_Seven_and_SOS_Step)
				{
				case 0 :	
				case 1 :	
				case 2 :	
						if(now_seven_and_SOS_Cnt < 30)
						{
								r_duty = 255;
								g_duty = 0;
								b_duty = 0;
						}
						else if(now_seven_and_SOS_Cnt < 60)
						{
								r_duty = 0;
						}
						else
						{
								now_Seven_and_SOS_Step ++;
								now_seven_and_SOS_Cnt = 255;
						}
						now_seven_and_SOS_Cnt ++;
				break;
				case 3 :
				case 4 :	
				case 5 :	
						if(now_seven_and_SOS_Cnt < 180)
						{
								r_duty = 255;
								g_duty = 0;
								b_duty = 0;
						}
						else if(now_seven_and_SOS_Cnt < 240)
						{
								r_duty = 0;
						}
						else
						{
								now_Seven_and_SOS_Step ++;
								now_seven_and_SOS_Cnt = 255;
						}
						now_seven_and_SOS_Cnt ++;
				break;
				case 6 :
				case 7 :	
				case 8 :
						if(now_seven_and_SOS_Cnt < 30)
						{
								r_duty = 255;
								g_duty = 0;
								b_duty = 0;
						}
						else if(now_seven_and_SOS_Cnt < 60)
						{
								r_duty = 0;
						}
						else
						{
								now_Seven_and_SOS_Step ++;
								now_seven_and_SOS_Cnt = 255;
						}
						now_seven_and_SOS_Cnt ++;										
				break;
				case 9 :
				case 10 :	
				case 11 :	
				case 12 :
				case 13 :	
				case 14 :	
						if(now_seven_and_SOS_Cnt >= 240)
						{
								if(now_Seven_and_SOS_Step == 14)
										now_Seven_and_SOS_Step = 0;
								else
										now_Seven_and_SOS_Step ++;
								now_seven_and_SOS_Cnt = 255;		
						}
						now_seven_and_SOS_Cnt ++;										
				break;										
				}
		}
}

以上代码都是利用上述rgb占空比所用定时器时基now_duty实现,具体时间可以适时调整。

RGB三色灯七彩渐变以及SOS效果实现源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值