呼吸灯顾名思义和人的呼吸一样,有吸气和呼气2个过程,在LED小灯上就会展示出来一个从亮到暗和一个从暗到亮的过程。
单片机可以通过使用具有PWM波引脚功能,通过改变每一次周期的占空比来完成呼吸灯的功能,但这种方法太占用单片机的资源了,因此可以使用定时器来实现呼吸灯的功能。
void TIM3_IRQHandler(void) //TIM3中断 0.2ms一次中断
{
static uint8_t PWM_time = 0;
static uint8_t PWM_value = 0;
static uint8_t Direct_flag = 0;
TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除TIMx的中断待处理位:TIM 中断源
PWM_time++; //改变的占空比一次的标志
if(PWM_time == PWM_value) //判断是否到了点亮LED的时候
LED1 = 1; //关灯
if((PWM_time == 50) && (Direct_flag == 0)) //当前周期结束 50*0.2ms 10ms一个周期
{
LED1 = 0; //打开LED小灯
PWM_time = 0; //重新计时,去改变占空比
PWM_value++;
if(PWM_value == 50) //占空比更改方向
Direct_flag = 1;
}
if((PWM_time == 50) && (Direct_flag == 1)) //当前周期结束 50*0.2ms 10ms一个周期
{
LED1 = 0; //打开LED小灯
PWM_time = 0; //重新计时,去改变占空比
PWM_value--;
if(PWM_value == 0) //占空比更改方向
{
LED1 = 1;
Direct_flag = 0;
}
}
}
通过使用单片机的定时器功能,产生一个0.2ms触发一次的中断,当加计数到50表示一个周期结束了,一个周期时长10MS,一个周期结束后改变一次占空比。