呼吸灯·

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

ii11nnocent

ii11nnocent

1780 0

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

相关文章

优先推荐同专题、同标签和同作者内容,补足热门文章。

评论 0

登录 后参与评论

评论

成为第一个评论的人