<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        單片機檢測交流電掉電程序應用(RGB控制)

        作者:流浪魚   來源:本站原創   點擊數:  更新時間:2014年03月17日   【字體:

             RBG軟燈帶是,等燈飾配件中常見的負載。一般作為背景燈裝飾,以及護欄管。程序實現功能,利用墻壁開關,控制RGB燈帶,分成4檔,第一檔:RGB之間實現漸變效果。第二檔:R亮,第三檔,B亮,第四檔:G亮。當然還有其他很多花樣。本程序難點,構造簡單實用的RGB漸變函數,第二,如何在漸變中檢測交流電掉電。實驗器材:PIC12F509一片,RGB燈帶一條,RGB控制線路板一塊。

         
        程序如下: 

        #include<pic.h>

        __CONFIG(0X01A);

        #define uchar unsigned char

        #define uint unsigned int

        #define TIME_MAX 1000

         

        uint key2_time_cnt;//按鍵去抖計數器

        uchar num;

        uchar key_flag;

        uint PWM;

         

        uint  a,c;

        uchar i,p,num,f,k;

        uint r,g,b;

         

        void delay(uint x)

        {

        uint c,d;

         for(c=x;c>0;c--)

           for(d=110;d>0;d--);

         

        }

         

        void timer1(uint t)

        {

        uint n;

        for(n=0;n<t;n++)

        {

         

        if(GP5==0)//

        {

               key2_time_cnt++;

               if(key2_time_cnt==TIME_MAX)

               {

                

                 key_flag=1;

               }

        }

         

        else

        {

               key2_time_cnt=0;

               if(key_flag==1)

               {

               key_flag=0;

               num=1;

               }

         

        }

        }

        }

         

        void timer2(uint t)

        {

        uint n;

        for(n=0;n<t;n++)

        {

         

        if(GP5==0)//

        {

               key2_time_cnt++;

               if(key2_time_cnt==TIME_MAX)

               {

                

                 key_flag=1;

               }

        }

         

        else

        {

               key2_time_cnt=0;

               if(key_flag==1)

               {

               key_flag=0;

               num=3;

               }

         

        }

        }

        }

         

        void led1_on()                

        {

          GP0=1;

          if(g!=0&&b==5)

               {

                      g--;

                      r++;

               }

           if(r!=0&&g==5)

                 {

                      r--;

                      b++;

                 }

          if(b!=0&&r==5)

               {

               b--;

               g++;

               }

           if(g+r+b!=50)

               {

               g=40;

               r=5;

               b=5;

               }

           for(a=0;a<30;a++)

         {

                if(g!=0) //綠色漸變

                { 

               

                       GP1=0;

                       timer1(g);

             

                       GP1=1;

                }

         

                 if(r!=0) //紅色漸變

                 {

                        GP2=0;

                        timer1(r);

                        GP2=1;

                 }

                if(b!=0) //藍色漸變

                {

                      GP4=0;

                      timer1(b);

                      GP4=1;

                }

         

          }

         

        }

         

        void key_scan()

        {

        if(GP5==0)//按鍵按下

        {

               key2_time_cnt++;

               if(key2_time_cnt==TIME_MAX)

               {

                

                 key_flag=1;

               }

        }

         

        else

        {

               key2_time_cnt=0;

               if(key_flag==1)

               {

               key_flag=0;

               num++;

               if(num>3)num=0;

               }

         

        }

         

        }

        void main()

        {

        TRIS=0b00110000;

        GP0=1;

        GP1=0;

        GP2=0;

        g=40;

        r=5;

        b=5;

        while(1)

        {

        key_scan();

        if(num==0)

        {

          led1_on();

        }

         

        else if(num==1)

        {

        GP0=1;//綠色亮

        GP1=0;
        GP4=0;

        }

        else if(num==2)

        {

        GP0=0;

        GP1=1;//紅色亮
        GP4=0;

        }

        else if(num==3)

        {

        GP0=0;

        GP1=0;
        GP4=1;//藍色亮

        }

         

         

        }

         

        }

        RGB函數構造比較巧妙,不知道原創者是誰?不想多費唇舌。交流掉電檢測才是要說的重點,
        if()
        {}
        else
        {}
        格式,開始時,如果GP5口上有低電平出現,對變量key2_time_cnt進行自加,當數值大于1000,(大概是12MS)左右,認為是交流電掉電了,讓斷電標志key_flag置1 ,當GP5口變為高電平的時候,把key2_time_cnt清零,同時判斷斷電標志是否有效,如果有效,讓分檔變量num加1,如果有4種功能那么從0加到3就要歸零。此交流檢測函數簡單實用,可以放在主程序循環中,檢測掉電不會漏檔。如何在漸變中響應交流檢測,就是利用檢測函數作為延時的循環主體。這樣既可以延時,又可以檢測IO口的變化。

        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮