亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

        標題: STC8單片機ws2812b驅動程序 [打印本頁]

        作者: 我是小五    時間: 2021-8-6 18:34
        標題: STC8單片機ws2812b驅動程序
        看見X寶 賣的ws2812燈帶覺得挺好玩,閑來無事買了一條1米60燈的。自己寫了個驅動 :功能 1 燈全亮(可調7色),2流水燈(可調7色),3 燈全亮閃爍(可調7色)
        制作出來的實物圖如下:


        單片機源程序如下:
        1. #include <ws2812b.h>

        2. bit BUS_1MS ;
        3. u8 RR=0XFE;
        4. u8 GG=0XFE;
        5. u8 BB=0XFE;
        6. u8 mode;
        7. u8 Loop_Speed=120; //流水燈延時變量
        8. unsigned char bdata LED_DAT; //可位操作的數據發送緩存變量
        9. sbit bit0=LED_DAT^0; //被發送數據的各位定義
        10. sbit bit1=LED_DAT^1;
        11. sbit bit2=LED_DAT^2;
        12. sbit bit3=LED_DAT^3;
        13. sbit bit4=LED_DAT^4;
        14. sbit bit5=LED_DAT^5;
        15. sbit bit6=LED_DAT^6;
        16. sbit bit7=LED_DAT^7;

        17.        

        18. /******************IO口初始化*************************/
        19. /* 功能 : 設置P1 P2 P3 口為雙向IO口*/

        20. void IO_init(void)
        21. {
        22.     P1M1 = 0;   P1M0 = 0;   //設置為準雙向口
        23.     P3M1 = 0;   P3M0 = 0;   //設置為準雙向口
        24.     P5M1 = 0;   P5M0 = 0;   //設置為準雙向口
        25. }
        26. /*****************************************************/
        27. void Timer0Init(void)                //1毫秒@24.000MHz
        28. {
        29.         AUXR |= 0x80;                //定時器時鐘1T模式
        30.         TMOD &= 0xF0;                //設置定時器模式
        31.         TL0 = 0x40;                //設置定時初始值
        32.         TH0 = 0xA2;                //設置定時初始值
        33.         TF0 = 0;                //清除TF0標志
        34.         TR0 = 1;                //定時器0開始計時
        35.         ET0 = 1;    //打開定時器0
        36.         EA =1 ;     //打開總中斷
        37. }

        38. void timer0() interrupt 1 //1毫秒@24.000MHz
        39. {
        40.         BUS_1MS = 1;
        41. }
        42. //*******************發送數據**********************//
        43. //數據格式G7-G0;R7-R0;B7-B0;//

        44. void SendData(u8 dat)
        45. {
        46.         LED_DAT = dat;
        47.         if(bit7==1){CODE_1} else{CODE_0}
        48.         if(bit6==1){CODE_1} else{CODE_0}
        49.         if(bit5==1){CODE_1} else{CODE_0}
        50.         if(bit4==1){CODE_1} else{CODE_0}
        51.         if(bit3==1){CODE_1} else{CODE_0}
        52.         if(bit3==1){CODE_1} else{CODE_0}
        53.         if(bit1==1){CODE_1} else{CODE_0}
        54.         if(bit0==1){CODE_1} else{CODE_0}

        55. }


        56. /******************流水燈函數******************************/
        57. /* 功能 : 流水燈函數 */       

        58. void loop_LED()
        59. {
        60. unsigned char i,j,k;
        61.         if(++k>=Loop_Speed)
        62.         {
        63.                 k=0;
        64.                 if(++j<=60)
        65.                 {               
        66.                         for(i=j;i>0;i--)  //關閉所有燈
        67.                         {
        68.                                 SendData(0x00);
        69.                                 SendData(0x00);
        70.                                 SendData(0x00);
        71.                         }
        72.                                 SendData(RR);
        73.                                 SendData(GG);
        74.                                 SendData(BB);       
        75.                 }       
        76.                 if(j==60) j=0;
        77.         }
        78. }

        79. /******************七彩全亮閃爍模式函數******************************/
        80. /* 功能 :全部LED 間隔50毫秒閃爍 */       

        81. void twinkle_LED()
        82. {
        83. unsigned char j,k;
        84.         k++;
        85.         if(k>100) k=0;
        86.         if(k==0)//Loop_Speed)
        87.         {
        88.                 for(j=0;j<60;j++)
        89.                 {               
        90.                         SendData(RR);
        91.                         SendData(GG);
        92.                         SendData(BB);       
        93.                 }               
        94.         }
        95.         if(k==50)//Loop_Speed)
        96.         {
        97.                 for(j=0;j<60;j++)
        98.                 {               
        99.                         SendData(0x00);
        100.                         SendData(0x00);
        101.                         SendData(0x00);       
        102.                 }               
        103.         }       
        104. }
        105. /******************七彩全亮模式函數******************************/
        106. /* 功能 : 點亮60顆LED */       

        107. void ON_LED()
        108. {
        109. unsigned char j,k;
        110. if(++k>=100)
        111. {
        112.          k=0;
        113.                 for(j=0;j<60;j++)
        114.                 {               
        115.                         SendData(RR);
        116.                         SendData(GG);
        117.                         SendData(BB);       
        118.                 }               
        119.         }
        120. }
        121. /******************七彩全滅模式函數******************************/
        122. /* 功能 :關閉全部LED  */       

        123. void OFF_LED()
        124. {
        125. unsigned char j,k;
        126. if(++k>=250)
        127. {
        128.          k=0;
        129.                 for(j=0;j<250;j++)
        130.                 {               
        131.                         SendData(0x00);
        132.                         SendData(0x00);
        133.                         SendData(0x00);       
        134.                 }               
        135.         }
        136. }
        137. /******************按鍵掃描******************************/
        138. /* 功能 : 設置S6按鍵長短按識別小于20MS短按 長于3S長按 */       
        139. void keyScan()
        140.         {
        141.                 static unsigned char i;
        142.     static unsigned int key_press_time = 0;  // ……請記得標為靜態變量
        143.                 static unsigned int key_press_time2 = 0;  // ……請記得標為靜態變量
        144.     if(s6==0)
        145.                         {
        146.         if(++key_press_time <=0 ) --key_press_time;//計量按鍵時間,并避免數據溢出
        147.         if(key_press_time==3000)
        148.                                 {
        149.             //在此寫下按鍵長按3s時要做的事情
        150.                                         LED2_REV();
        151.                                 Loop_Speed=        Loop_Speed-15;                       
        152.                                 }
        153.                         }
        154.                         else
        155.                         {
        156.         if(10<=key_press_time && key_press_time < 3000)
        157.                                 {
        158.             //大于20ms小于3s,視為短按,在此寫下寫短按的處理代碼
        159.                                         LED1_REV();
        160.                                         i++;
        161.                                         switch(i)  //s6按鍵LED7色控制
        162.                                         {
        163.                                                 case 0 : {RR=0X00;GG=0X00;BB=0XFE; break;}
        164.                                                 case 1 : {RR=0X00;GG=0XFE;BB=0X00; break;}
        165.                                                 case 2 : {RR=0XFE;GG=0X00;BB=0X00; break;}
        166.                                                 case 3 : {RR=0XFE;GG=0XFE;BB=0X00; break;}
        167.                                                 case 4 : {RR=0X00;GG=0XFE;BB=0XFE; break;}
        168.                                                 case 5 : {RR=0XFE;GG=0X00;BB=0XFE; break;}
        169.                                                 case 6 : {RR=0XFE;GG=0XFE;BB=0XFE; break;}
        170.                                                 case 7 : {i=0;                                                                                 break;}
        171.                                         }
        172.         }
        173.         key_press_time=0;
        174.                         }
        175.                        
        176.                         if(s2==0)
        177.                         {
        178.         if(++key_press_time2 <=0 ) --key_press_time2;//計量按鍵時間,并避免數據溢出
        179.         if(key_press_time2==3000)
        180.                                 {
        181.             //在此寫下按鍵長按3s時要做的事情
        182.                                         LED2_REV();
        183.                                                
        184.                                 }
        185. ……………………

        186. …………限于本文篇幅 余下代碼請從51黑下載附件…………
        復制代碼

        所有代碼51hei附件下載:
        ws2812b驅動.7z (24.66 KB, 下載次數: 397)


        作者: cdiyy    時間: 2021-8-16 09:35
        有原理圖嗎大師
        作者: POWER-LED    時間: 2021-11-1 13:24
        用STC哪個型號的單片機?
        作者: huping137    時間: 2021-11-4 09:27
        這個程序里是不是少了發送0和1的時序了
        作者: gaochen15159    時間: 2021-11-10 08:48
        有沒有原理圖可以借鑒一下,我也想自己做一個玩一下

        作者: 快樂眼淚    時間: 2021-11-19 21:01
        幾百個燈珠可以控制嗎?
        作者: lhxr    時間: 2021-12-1 21:42
        huping137 發表于 2021-11-4 09:27
        這個程序里是不是少了發送0和1的時序了

        時序在WS2812B.H里面
        作者: lhxr    時間: 2021-12-1 22:08
        謝謝樓主分享,難得的好資料,感謝,經過編譯,正常點亮
        作者: wufa1986    時間: 2021-12-2 13:41
        gaochen15159 發表于 2021-11-10 08:48
        有沒有原理圖可以借鑒一下,我也想自己做一個玩一下

        這東西是串行控制,燈是成品,控制隨便啦個IO就行了
        作者: a399288395    時間: 2022-1-8 16:13
        別的我沒試  ,我主要是看到按鍵掃描沒有去抖 沒有延時,就對這個按鍵掃描函數比較感興趣,我就試了按鍵掃描這個函數,發現是有問題的,根本就不工作!

        /******************按鍵掃描******************************/
        /* 功能 : 設置S6按鍵長短按識別小于20MS短按 長于3S長按 */       
        void keyScan()
                {
                        static unsigned char i;
            static unsigned int key_press_time = 0;  // ……請記得標為靜態變量
                        static unsigned int key_press_time2 = 0;  // ……請記得標為靜態變量
            if(s6==0)
                                {
                if(++key_press_time <=0 ) --key_press_time;//計量按鍵時間,并避免數據溢出
                if(key_press_time==3000)
                                        {
                    //在此寫下按鍵長按3s時要做的事情
                                                LED2_REV();
                                        Loop_Speed=        Loop_Speed-15;                       
                                        }
                                }
                                else
                                {
                if(10<=key_press_time && key_press_time < 3000)
                                        {
                    //大于20ms小于3s,視為短按,在此寫下寫短按的處理代碼
                                                LED1_REV();
                                                i++;
                                                switch(i)  //s6按鍵LED7色控制
                                                {
                                                        case 0 : {RR=0X00;GG=0X00;BB=0XFE; break;}
                                                        case 1 : {RR=0X00;GG=0XFE;BB=0X00; break;}
                                                        case 2 : {RR=0XFE;GG=0X00;BB=0X00; break;}
                                                        case 3 : {RR=0XFE;GG=0XFE;BB=0X00; break;}
                                                        case 4 : {RR=0X00;GG=0XFE;BB=0XFE; break;}
                                                        case 5 : {RR=0XFE;GG=0X00;BB=0XFE; break;}
                                                        case 6 : {RR=0XFE;GG=0XFE;BB=0XFE; break;}
                                                        case 7 : {i=0;                                                                                 break;}
                                                }
                }
                key_press_time=0;
                                }




        下面這段話大家來討論看看 這完全行不通啊,24M的單片機跑起來
        ++key_press_time; key_press_time==3000,需要3秒鐘?即使是6M的時鐘跑起來 加到3000也不要3秒鐘吧!




                if(++key_press_time <=0 ) --key_press_time;//計量按鍵時間,并避免數據溢出
                if(key_press_time==3000)
                                        {
                    //在此寫下按鍵長按3s時要做的事情
        作者: 大風吹過啊    時間: 2022-1-10 15:20
        a399288395 發表于 2022-1-8 16:13
        別的我沒試  ,我主要是看到按鍵掃描沒有去抖 沒有延時,就對這個按鍵掃描函數比較感興趣,我就試了按鍵掃 ...

        下載完整程序好好看看再說話。。。。。。就看了一段直接判斷程序不能用也是絕了。。。。。。。
        作者: forest-float    時間: 2022-3-23 13:48
        我看了下代碼,發現好多變量都沒初始化就開始累加計算了,真的無語,確定不會出錯嗎
        作者: yanyun    時間: 2022-9-15 08:28
        一上電變全彩閃爍,mode初始化為0應該是關閉的狀態,燈不亮,通過按下按鍵才亮的吧
        作者: THFW    時間: 2022-12-15 11:43
        謝謝樓主分享,難得的好資料。
        作者: THFW    時間: 2022-12-15 11:45
        有原理圖么
        作者: hai2369513    時間: 2024-3-11 17:10
        非常感謝,終于找到想要的了。
        作者: hai2369513    時間: 2024-3-11 18:32
        師傅,測試的時候沒有單色藍光,檢查下哪里出了問題?
        作者: 新鄉家電維修    時間: 2024-3-11 18:42
        THFW 發表于 2022-12-15 11:45
        有原理圖么

        服了,就一個IO端口,要啥原理圖,要啥自行車?
        作者: wuyibin2003    時間: 2024-3-14 14:17
        這個挺好的,我正想編輯這個程序驅動自己的彩燈,感謝樓主提供,我可以參考一下
        作者: zys0797    時間: 2024-5-3 16:11
        大家都說有問題?那我只好下載下來研究和驗證一下了。
        作者: 烈火    時間: 2025-3-4 21:05
        參考了一下,單色沒有實現。是什么原因?
        作者: lkc8210    時間: 2025-3-5 09:20
        烈火 發表于 2025-3-4 21:05
        參考了一下,單色沒有實現。是什么原因?

        30塊包郵的邏輯分析儀,你值得擁有




        歡迎光臨 (http://www.denmoz.com/bbs/) Powered by Discuz! X3.1