采用STC15W204S最小系統板,采用P1.0口做輸出接燈板DIN,編譯時需要加入stc15.h頭文件
制作出來的實物圖如下:
視頻演示:
單片機源碼:
- #include<stc15.h>
- #include"intrins.h"
- sbit WS2812 = P1^0;
- #define numLEDs 22 //燈的個數
- unsigned char buf_R[numLEDs] = {0};//顏色緩存
- unsigned char buf_G[numLEDs] = {0};
- unsigned char buf_B[numLEDs] = {0};
- void RGB_Set_Up(); //送0碼
- void RGB_Set_Down(); //送1碼
- void HAL_Delay(unsigned int t)
- {
- unsigned int x,y;
- for(x=114;x>0;x--)
- for(y=t;y>0;y--);
- }
- //復位延時
- void Delay50us() //@22.1184MHz
- {
- unsigned char i, j;
- _nop_();
- _nop_();
- i = 2;
- j = 15;
- do
- {
- while (--j);
- } while (--i);
- }
- //1碼,高電平850ns 低電平400ns 誤差正負150ns
- void RGB_Set_Up()
- {
- WS2812 = 1;
- //經過邏輯分析儀調試的的延時
- _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
- _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
- WS2812 = 0;
- }
- //1碼,高電平400ns 低電平850ns 誤差正負150ns
- void RGB_Set_Down()
- {
- WS2812 = 1;
- //經過邏輯分析儀調試的的延時
- _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
- WS2812 = 0;
- }
- //發送24位數據
- void Send_2812_24bits(unsigned char G8,unsigned char R8,unsigned char B8)
- {
- unsigned int n = 0;
- //發送G8位
- for(n=0;n<8;n++)
- {
- G8<<=n;
- if(G8&0x80 == 0x80)
- {
- RGB_Set_Up();
- }
- else
- {
- RGB_Set_Down();
- }
- }
- //發送R8位
- for(n=0;n<8;n++)
- {
- R8<<=n;
- if(R8&0x80 == 0x80)
- {
- RGB_Set_Up();
- }
- else
- {
- RGB_Set_Down();
- }
- }
- //發送B8位
- for(n=0;n<8;n++)
- {
- B8<<=n;
- if(B8&0x80 == 0x80)
- {
- RGB_Set_Up();
- }
- else
- {
- RGB_Set_Down();
- }
- }
- }
- //復位碼
- void RGB_Rst()
- {
- WS2812 = 0;
- Delay50us();
- }
- //把24位數據GRB碼轉RGB
- void Set_Colour(unsigned char r,unsigned char g,unsigned char b)
- {
- unsigned char i;
- for(i=0;i<numLEDs;i++)
- {
- buf_R[i] = r; //緩沖
- buf_G[i] = g;
- buf_B[i] = b;
- }
- for(i=0;i<numLEDs;i++)
- {
- Send_2812_24bits(buf_G[i],buf_R[i],buf_B[i]);//發送顯示
- }
- }
- //某一個點顯示的顏色
- void SetPointColour(unsigned int num,unsigned char r,unsigned char g,unsigned char b)
- {
- unsigned char i;
- for(i=0;i<numLEDs;i++)
- {
- buf_R[num] = r;//緩沖
- buf_G[num] = g;
- buf_B[num] = b;
- }
- for(i=0;i<numLEDs;i++)
- {
- Send_2812_24bits(buf_G[i],buf_R[i],buf_B[i]);//發送顯示
- }
- }
- //顏色交換24位不拆分發
- void SetPixelColor(unsigned char num,unsigned long c)
- {
- unsigned char i;
- for(i=0;i<numLEDs;i++)
- {
- buf_R[num] = (unsigned char)(c>>16);
- buf_G[num] = (unsigned char)(c>>8);
- buf_B[num] = (unsigned char)(c);
- }
- for(i=0;i<numLEDs;i++)
- {
- Send_2812_24bits(buf_G[i],buf_R[i],buf_B[i]);
- }
- }
- //復位
- void PixelUpdate()
- {
- RGB_Rst();
- }
- // Fill the dots one after the other with a color
- //用一種顏色填充這些圓點
- void colorWipe(unsigned long c, unsigned int wait)
- {
- unsigned int i=0;
- for( i=0; i<numLEDs; i++)
- {
- SetPixelColor(i, c);
- PixelUpdate();
- HAL_Delay(wait);
- }
- }
- void main()
- {
- while(1)
- {
-
- colorWipe(255*32*1024,1000);//紅色
- colorWipe(0,1000);
- colorWipe(255*16,1000); //綠色
- colorWipe(0,1000);
- colorWipe(255,1000);//藍色
- colorWipe(0,1000);
- colorWipe(255*32*1024+255*16,1000);//紅色+綠色
- colorWipe(0,1000);
- colorWipe(255*32*1024+255,1000);//紅色+藍色
- colorWipe(0,1000);
- colorWipe(255*16+255,1000); //綠色+藍色
- colorWipe(0,1000);
- colorWipe(255*32*1024+255*16+255,1000); //紅色+綠色+藍色
- colorWipe(0,1000);
- colorWipe(255*32*1024,100); //紅色
- HAL_Delay(10000);
- colorWipe(255*16,100); //綠色
- HAL_Delay(10000);
- colorWipe(255,100);//藍色
- HAL_Delay(10000);
- colorWipe(255*32*1024+255*16,100);//紅色+綠色
- HAL_Delay(10000);
- …………
- …………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
全部資料51hei下載地址:
ws2812三色切換.rar
(18.4 MB, 下載次數: 691)
2018-12-9 19:30 上傳
點擊文件名下載附件
22燈程序與實物視屏
|