应广单片机应用之-呼吸灯

        在很多的单片机方案应用中,很多都会用到到指示灯,比如流水灯,RGB七彩灯,对了还有呼吸灯.现在用PMS150C做个demo,稍作修改就可以用在pms152,pms132B灯应广其他系列的单片机中.不多说,上代码.一切尽在代码中.


#include    "extern.h"

/*定时时间是否到了cinit*/
bit     FLAG_NMS;
/*计数值cinit*/
byte    count;
/*定时器初始化cinit*/
word    T16COUNTER;

byte ucMsCnt;

byte ucPwmDt;
bit  ucPwmInc;

BIT        PWM             :PA.3;

BIT        TEST            :PA.4;

/*定时器初始化*/
void PwmTmr2Init ( void )
{
    tm2ct = 0x0;/*计数值*/
    //pwm duty
    tm2b = 0;//START_PWM_CNT;
    //8 位 pwm, 预分频 = 64, 分频 = 2,
    tm2s = 0b0_11_00000;
    
    /*0010=HIRC输出,0100=ILRC; 
     ,01= PB2,10=PA3,11=PB4, 
     PWM模式,禁用极性反转*/
    tm2c = 0b0010_10_1_0;
}

/***************************************/
void    TIME16_Init(void)
{
    /*关中断*/
//    INTRQ        =    0;
    
    /*停止定时器*/
//       T16M.5        =0;   

    /*计数值清零*/
    T16COUNTER    =488;

    STT16 T16COUNTER;


    /*ms标记reset*/
    FLAG_NMS    =0;

    /*计算方法16M/*/
    $    T16M    IHRC,/1,BIT11;    

    $    INTEN    T16;

}

void    FPPA0 (void)
{
    .ADJUST_IC    SYSCLK=IHRC/4      //    SYSCLK=IHRC/2

    TIME16_Init();

    $ PWM  out,low;
    $ TEST  out,low;

    
    PwmTmr2Init();

    ucPwmInc=1;
    ucPwmDt=0;

    engint;
    
    while (1)
    {
           if(FLAG_NMS)
           {

               ucMsCnt++;
               if(ucMsCnt>10)
               {
                      ucMsCnt=0;

                   
                   /*增加*/
                   if(ucPwmInc)
                   {
                       if(ucPwmDt<255)
                       {
                              /*更新*/
                              ucPwmDt++;
                           
                           /*切换*/
                           if(ucPwmDt==255)
                           {
                                 ucPwmInc=0;
                           }
                           
                           
                       }
                   }
                   /*减少*/
                   else
                   {
                           /*更新条件*/
                           if(ucPwmDt)
                           {
                            /*更新*/
                            ucPwmDt--;

         
                            /*切换条件*/
                            if(!ucPwmDt)
                            {
                                ucPwmInc=1;
                            }
                           }


                    
                   }

                    tm2b=ucPwmDt;
                   
               }
    
               
               FLAG_NMS=0;
           }
        

    }
}


void    Interrupt ( void )
{
    pushaf;

    if ( Intrq.T16 )  
    {

        Intrq.T16    =    0;
        
        STT16 T16COUNTER;

        
        
        if ( count>0 )
        {
            count--;
        }
        else
        {
            count   =   9;
            /*1ms*/
            FLAG_NMS=   1; 

           $    TEST  toggle;

        }

    }

    popaf;
}

下面是一个使用应广单片机控制WS2812B LED灯带实现多彩流水呼吸效果的程序,使用C语言编写: ``` #include <reg52.h> #define LED_PIN P1 #define LED_NUM 60 void delay_ms(unsigned int ms) { unsigned int i, j; for (i = 0; i < ms; i++) for (j = 0; j < 114; j++); } void send_byte(unsigned char byte) { unsigned char i; for (i = 0; i < 8; i++) { if (byte & 0x80) LED_PIN = 0xc0; else LED_PIN = 0x80; LED_PIN |= 0x40; byte <<= 1; } } void send_color(unsigned char r, unsigned char g, unsigned char b) { send_byte(g); send_byte(r); send_byte(b); } void send_reset() { unsigned char i; for (i = 0; i < 50; i++) LED_PIN = 0x00; } void main() { unsigned char i, j, value; unsigned char colors[LED_NUM][3]; for (i = 0; i < LED_NUM; i++) { colors[i][0] = 0; // R colors[i][1] = 0; // G colors[i][2] = 0; // B } while (1) { for (i = 0; i < LED_NUM; i++) { for (j = 0; j < 256; j++) { value = (exp(sin(j / 256.0 * 3.14159)) - 0.36787944) * 108.0; colors[i][0] = value; // R colors[i][1] = value / 3; // G colors[i][2] = value / 10; // B for (j = 0; j < LED_NUM; j++) send_color(colors[j][0], colors[j][1], colors[j][2]); send_reset(); delay_ms(5); } } } } ``` 在程序中,我们首先定义了使用的引脚和LED数目,然后定义了一些辅助函数,如delay_ms()函数用于延时,send_byte()函数用于发送一个字节的数据,send_color()函数用于发送一个LED的颜色数据,send_reset()函数用于发送复位信号。 在main()函数中,我们首先定义了一个colors数组,用于存储每个LED的颜色值。 然后,我们使用两个for循环来遍历每个LED,然后在内部循环中,使用呼吸灯算法来生成不同的颜色,并将其设置为当前LED的颜色。最后,使用send_color()函数将颜色输出到LED灯带上。 在呼吸灯算法中,我们使用了正弦函数和指数函数来生成一个0到255的值,然后根据这个值来计算RGB颜色,从而实现不同颜色的流水呼吸效果。具体的颜色计算公式为: ``` value = (exp(sin(j / 256.0 * 3.14159)) - 0.36787944) * 108.0; colors[i][0] = value; // R colors[i][1] = value / 3; // G colors[i][2] = value / 10; // B ``` 其中,value为呼吸灯算法生成的0到255的值,用来控制亮度。我们将其分别作为RGB三个分量的值,来生成多彩的流水呼吸效果。最后,使用send_reset()函数发送复位信号,完成一次数据传输。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值