STC15W204是8PIN的寬電壓版,驅動WS2812的時候單片機可以用5V電壓,也可以用3.3V的電源。
RGB燈條的電源應該是4-7V之間,目前驅動的是8顆粒的燈條,原則上應該可以驅動更多顆粒的,不過手頭沒有那么長的,沒試過,有興趣的朋友可以自己試驗,看看最多可以驅動多少個。按理論來講驅動8顆和80顆應該是一樣的。
硬件環境:
單片機:STC15W204S(SOP8)
燈帶:WS2812(8顆粒)
非必需品:開關,USB轉接板,面包板,跳線若干。
使用片內R/C振蕩器,連外部晶振都不需要,工作頻率為11.0592MHz
STC15W204S可以用其他其他STC 1T的MCU。
代碼也非常簡單,只用到1個IO口,不需要進行任何初始化。
如果使用其他工作頻率時,請相應調整DELAY_LONG和DELAY_SHORT的宏定義,適當增減_nop()_的個數,直到能正確驅動燈條為止。
單片機源程序如下:
- #include <reg51.h>
- #include <intrins.h>
- // 使用的IO口,無需初始化
- sbit DOUT = P3^3;
- #define DELAY_LONG {_nop_();_nop_();_nop_();}
- #define DELAY_SHORT {_nop_();_nop_();}
- #define SEND_1 {DOUT=1;DELAY_LONG;DOUT=0;DELAY_SHORT;}
- #define SEND_0 {DOUT=1;DELAY_SHORT;DOUT=0;DELAY_LONG;}
- #define SEND_BIT(x) {if(x) {SEND_1;} else {SEND_0;}}
- // WS2812燈帶顆粒數
- #define PIXEL_CNT (8)
- // RGB顆粒結構
- typedef struct {
- unsigned int next_pixel; // 下一顆粒的index
- unsigned char green; // 綠色值
- unsigned char red; // 紅色值
- unsigned char blue; // 藍色值
- unsigned char brightness; // 亮度值
- } Pixel;
- void send_p(Pixel _p); // 發送1個顆粒的值
- void send_pixels(Pixel *_p_list, unsigned int _start, unsigned int _cnt); // 發送所有顆粒的值
- // 各顆粒值的初始值
- Pixel pixels[PIXEL_CNT] = {
- {1, 31, 255, 127, 255},
- {2, 31, 255, 127, 127},
- {3, 31, 255, 127, 31},
- {4, 31, 255, 127, 7},
- {5, 31, 255, 127, 1},
- {6, 31, 255, 127, 0},
- {7, 31, 255, 127, 0},
- {0, 31, 255, 127, 0},
- };
- // 通用計數器
- unsigned int cnt = 0;
- // 指定毫秒數Delay
- void delay_ms(unsigned int x) //@11.0592MHz
- {
- unsigned char i, j;
- do {
- _nop_();
- _nop_();
- _nop_();
- i = 11;
- j = 190;
- do
- {
- while (--j);
- } while (--i);
- } while (--x);
- }
- // 主函數
- void main() {
- // 初始化段
-
- // 循環處理段
- while(1) {
- // 等待50ms
- delay_ms(50);
- cnt %= 0x100;
- send_pixels(pixels, cnt % PIXEL_CNT, PIXEL_CNT);
- cnt++;
- }
- }
- void Delay50us() //@11.0592MHz
- {
- unsigned char i, j;
- _nop_();
- i = 1;
- j = 134;
- do
- {
- while (--j);
- } while (--i);
- }
- // RESET信號
- void reset() {
- DOUT = 0;
- Delay50us();
- }
- void send_p(Pixel _p) {
- unsigned char p_v;
- p_v = (_p.green * _p.brightness) >> 8;
- SEND_BIT(p_v & 0x80);
- SEND_BIT(p_v & 0x40);
- SEND_BIT(p_v & 0x20);
- SEND_BIT(p_v & 0x10);
- SEND_BIT(p_v & 0x08);
- SEND_BIT(p_v & 0x04);
- SEND_BIT(p_v & 0x02);
- SEND_BIT(p_v & 0x01);
- p_v = (_p.red * _p.brightness) >> 8;
- SEND_BIT(p_v & 0x80);
- SEND_BIT(p_v & 0x40);
- SEND_BIT(p_v & 0x20);
- SEND_BIT(p_v & 0x10);
- SEND_BIT(p_v & 0x08);
- SEND_BIT(p_v & 0x04);
- SEND_BIT(p_v & 0x02);
- SEND_BIT(p_v & 0x01);
- p_v = (_p.blue * _p.brightness) >> 8;
- SEND_BIT(p_v & 0x80);
- SEND_BIT(p_v & 0x40);
- SEND_BIT(p_v & 0x20);
- SEND_BIT(p_v & 0x10);
- SEND_BIT(p_v & 0x08);
- SEND_BIT(p_v & 0x04);
- SEND_BIT(p_v & 0x02);
- SEND_BIT(p_v & 0x01);
- }
- void send_pixels(Pixel *_p_list, unsigned int _start, unsigned int _cnt) {
- Pixel *_p = &_p_list[_start % _cnt];
- reset();
- while(_cnt--) {
- send_p(*_p);
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
WS2812B.zipWS2812B.zip
(29.26 KB, 下載次數: 493)
2018-9-24 04:31 上傳
點擊文件名下載附件
|