標(biāo)題: 全彩WS2812驅(qū)動(dòng)實(shí)驗(yàn)(8腳單片機(jī))STC15F104W [打印本頁]

作者: MCKK520    時(shí)間: 2018-2-16 07:34
標(biāo)題: 全彩WS2812驅(qū)動(dòng)實(shí)驗(yàn)(8腳單片機(jī))STC15F104W
STC15F104W單片機(jī)源程序如下:
  1. ===========================
  2. #include<reg52.h>
  3. #include<intrins.h>
  4. #define uchar unsigned char
  5. #define uint  unsigned  int


  6. /*
  7. ,
  8. 全彩 LED ws2812  燈 驅(qū)動(dòng)程序,受到論壇 zhuls 的啟發(fā),
  9. 實(shí)現(xiàn)了在我的8腳芯片,STC15F104W芯片上的驅(qū)動(dòng),、
  10. 修改內(nèi)部晶振 @ 12MHZ, STC Y5內(nèi)核,一個(gè)  _nop_();  為 0.25 us時(shí)間為基準(zhǔn)來驅(qū)動(dòng)WS2812
  11. 此程序?qū)嶒?yàn)完美驅(qū)動(dòng)WS2812,無閃爍,無跳燈,

  12. 接下來想用很長一個(gè)WS2812燈帶,擺成88:88這樣一個(gè)數(shù)碼管形狀,
  13. 然后用單片機(jī)一個(gè)IO口驅(qū)動(dòng),實(shí)現(xiàn)全彩數(shù)字鐘,(多功能),比如說重要定時(shí)時(shí)間到了,狂閃+高亮紅色,RR=0xFF;;這樣
  14. 或者睡覺前,以漸色呼吸燈的方式,直到深夜,亮度自動(dòng)變暗,RR=0x01;, GG=0x01; BB=0x01;
  15. ,
  16. */

  17. sfr P3M1  = 0x80;    //  10 000000   全部設(shè)置為雙向IO口,弱上拉25K
  18. sfr P3M0  = 0x80;    //  10 000000

  19. sbit LED1   =  P3^0;         // 5  
  20. sbit LED2   =  P3^1;         // 6         
  21. sbit LED3   =  P3^2;         // 7
  22. sbit sda   =   P3^3;         // 8         
  23. sbit KEY1   =  P3^4;         // 1         
  24. sbit KEY2   =  P3^5;         // 3         


  25. uint US100;
  26. uint MS1;
  27. uint ID;

  28. bit FLAG1;
  29. bit FLAG2;
  30. bit FLAG3;

  31. bit GF;



  32. uchar i;
  33. uchar j;

  34. uchar d;

  35. uchar RR;    //  顏色變量0-255 就是FF以內(nèi)
  36. uchar GG;
  37. uchar BB;


  38. //=============================================

  39. void delayus(uint us)  //     延時(shí)n個(gè)1us    @12M晶振  STC15F104W芯片
  40. {        
  41.         uint us2;            
  42.         for(us2=us;us2>0;us2--)    {  _nop_();  _nop_();   }  
  43.         
  44. }  

  45. //==================================================延時(shí)代碼 12mHZ
  46. void delayms(uint z)      //X  MS延時(shí)==@ 12MHZ
  47. {
  48. uint x,y;  
  49. for(x=z; x>0; x--)
  50.   for(y=920; y>0; y--);
  51. }


  52. //=========================================================================


  53. void bit1()    //H=0.7us.L=0.6us  數(shù)據(jù)1的表示   芯片STC15F104W  @ 12MHZ

  54.                //1US= 4個(gè) _nop_();  進(jìn)程序要用掉2個(gè)_nop_(); 出程序用掉2個(gè)_nop_();
  55. {
  56. sda=1;
  57.   
  58.     _nop_();
  59.     _nop_();
  60.     _nop_();
  61. sda=0;
  62.     _nop_();

  63. }


  64. void bit0()//H=0.35us.L=0.8us  ==數(shù)據(jù)0的表示
  65. {
  66. sda=1;


  67.     _nop_();
  68.     _nop_();
  69. sda=0;
  70.     _nop_();
  71.     _nop_();
  72.    
  73. }



  74. //發(fā)送8位,=1顆燈的一種顏色,WS2812燈數(shù)據(jù)為24一串24位二進(jìn)制數(shù)–每種顏色8位二進(jìn)制數(shù)。先是綠色,然后是紅色,最后是藍(lán)色
  75. void send_sda(uchar dat)        

  76. {
  77.     uchar count1;               //位計(jì)數(shù)器,單字節(jié)為8位
  78.     for (count1=8;count1>0;count1--)
  79.       {   
  80.         if(dat & 0x80)         //取高位先發(fā),則dat & 0x80
  81.           bit1();
  82.           else
  83.           bit0();
  84.             dat<<=1;               //數(shù)據(jù)右移,下一個(gè)位的數(shù)據(jù),若高位先發(fā)則dat<<=1
  85.       }
  86. }




  87. //=============================================
  88. void Init (void)    //中斷初始化
  89. {
  90.     TMOD = 0x01;           //12M    100us
  91.    
  92.     TL0 = (65536-100)%256;    //設(shè)置定時(shí)初值
  93.     TH0 = (65536-100)/256;    //設(shè)置定時(shí)初值
  94.     EA=1;
  95.     ET0=1;
  96.     TR0=1;
  97. }




  98. //=============================================
  99. void timer0(void) interrupt 1 using 1  //---定時(shí)器t0-----
  100. {
  101.      TL0 = (65536-100)%256;    //設(shè)置定時(shí)初值
  102.     TH0 = (65536-100)/256;    //設(shè)置定時(shí)初值

  103.     US100++;        TF0 = 0;   

  104.    
  105.        if(US100>=10 )   { MS1++;   US100=0;    }


  106. if( MS1>=1000)          //定時(shí)器實(shí)現(xiàn)七彩色時(shí)序
  107. {
  108.               RR=0xFF;    //
  109.         GG=0x00;    //
  110.               BB=0x00;    //

  111. }

  112.   if( MS1>=2000)
  113. {
  114.               RR=0x00;    //
  115.         GG=0xFF;    //
  116.               BB=0x00;    //

  117. }

  118.   if( MS1>=3000)
  119. {
  120.               RR=0x00;    //
  121.         GG=0x00;    //
  122.               BB=0xFF;    //

  123. }

  124.   if( MS1>=4000)
  125. {
  126.               RR=0xFF;    //
  127.         GG=0xFF;    //
  128.               BB=0x00;    //

  129. }

  130.   if( MS1>=5000)
  131. {
  132.               RR=0xFF;    //
  133.         GG=0x00;    //
  134.               BB=0xFF;    //

  135. }

  136.   if( MS1>=6000)
  137. {
  138.               RR=0x00;    //
  139.         GG=0xFF;    //
  140.               BB=0xFF;    //

  141. }

  142.   if( MS1>=7000)
  143. {
  144.               RR=0x7C;    //
  145.         GG=0xFC;    //
  146.               BB=0x00;    //

  147. }

  148.   if( MS1>=8000)
  149. {
  150.               RR=0x4B;    //
  151.         GG=0x00;    //
  152.               BB=0x82;    //
  153.      
  154.      MS1=0;

  155. }



  156.    
  157. }



  158. //=========================================================================

  159. //==========================  主程序開始  ==================================

  160. void main()
  161. {
  162.        P3M1=0x80;
  163.        P3M0=0x80;         //   
  164.    
  165.               RR=0x00;    //初始化
  166.         GG=0x00;    //
  167.               BB=0x00;    //
  168.    
  169.    
  170.    
  171.     Init();


  172.     while(1) //主循環(huán)。
  173.     {



  174.                
  175.             
  176. for (i=0;i<5;i++)    //發(fā)送5顆燈
  177.    {
  178.      send_sda(GG);    //綠
  179.          send_sda(RR);    //紅
  180.      send_sda(BB);    //藍(lán)
  181.          

  182.         
  183.    }
  184.   
  185.      sda=0;
  186.     delayus(70);      // 高于50US的低電平信號(hào)=復(fù)位,
  187.      
  188.    
  189.      
  190.          
  191.          
  192.          
  193.    
  194.    

  195.     }
  196. }


  197. //=========================================================================
  198. //=========================      END     ==================================
  199. //=========================================================================
  200. ,
  201. ,

復(fù)制代碼



作者: jmkl128    時(shí)間: 2018-2-27 00:25
人才,我頂。。!
作者: gspt    時(shí)間: 2020-2-15 15:29
寫的真好,解決了我的疑惑
謝謝樓主大哥
作者: CNGK    時(shí)間: 2020-4-2 23:47
大哥厲害哇,解決了我的疑惑!
作者: 13534702358    時(shí)間: 2020-12-18 00:25
厲害厲害。。。
作者: dongfang08    時(shí)間: 2021-3-29 09:50
厲害。收藏備用,謝謝!
作者: 緣分五月八    時(shí)間: 2021-5-17 08:17
哪位大佬幫我寫一個(gè)stc15F104w單片機(jī)爆閃燈,p3.2和p3.3接爆閃燈,每個(gè)燈閃3次循環(huán)爆閃用按鍵可以調(diào)節(jié)爆閃頻
作者: 快樂a123    時(shí)間: 2022-1-2 15:27
發(fā)個(gè)接線圖
作者: 1111513    時(shí)間: 2022-3-24 17:29
沒效果是為什么

作者: 快樂眼淚    時(shí)間: 2023-2-28 20:12
已收藏備用,謝謝!
作者: wkman    時(shí)間: 2023-3-1 16:28
ws2812的燈珠,就是塊頭大了點(diǎn),其它都還好




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