如何使用STC15W204S單片機控制WS2812幻彩燈帶
????最近一期視頻中的大刀的Solidworks模型源文件和STC15W204S單片機的燒寫代碼下載地址:https://pan.baidu.com/s/1P8xO8DFufDx4yR0TkeDPXg?pwd=9932 提取碼:9932?
????代碼的LED部分沿用了上一期視頻破敗王劍的基礎功能,以后可能會繼續(xù)沿用下去

????STC15W204S單片機最小系統(tǒng) 是我在某寶能找到的最小的“最小系統(tǒng)”,就是程序空間4K小了點,寫不了太繁雜的代碼;且功能引腳也較少,僅一塊難以同時控制LED與電機兩個系統(tǒng);于是突發(fā)奇想使用兩塊單片機互聯(lián),引腳設定如下:


??
????RGB燈帶是在某寶找到的5V“幻彩燈帶”,控制芯片是WS2812
????關于如何使用STC15W204S單片機去生成控制WS2812能讀懂的二進制信息,我參考了幾個國內(nèi)大神的帖子,比如以下的2篇:
https://blog.csdn.net/u013062709/article/details/85217281
https://blog.csdn.net/weixin_38476200/article/details/115519393
????不過文中關于其使用的時鐘頻率,和我自己現(xiàn)實實踐下來仍然存在出入,畢竟他們使用的單片機是STC15W4K32S4和STC15F104E,而不是STC15W204S;
????要讓WS2812芯片聽話,其關鍵就在于發(fā)送給他的信號的信號時序一定要精確到其能接受的范圍內(nèi);
????首先是“0”和“1”如何約定,這一點極其關鍵!芯片只要讀出了0和1,就能讀出從0~255的二進制數(shù)字:

????當然“0”和“1”所組成的一大串數(shù)字,中間得有間隔,比如給WS2812的信息就是每隔24*N個(這里N是燈珠的數(shù)量)二進制數(shù)字發(fā)一個“空格”(空格的時間是微秒級),也就是上圖所示的“RESET碼”,一旦WS2812收到了“RESET碼”,后面?zhèn)鬟M來的信息,就會覆蓋上一輪的信息,從而實驗變色;
? ??WS2812芯片安裝在燈帶的每一個燈珠當中,數(shù)據(jù)傳輸給其中一個燈珠的芯片時,這塊芯片會把屬于自己的24位保留下來設置自己的顏色,另外的的24*(N-1)位數(shù)字會輸出給下一個燈珠中的芯片;
????24位的0和1,就是三個8位的0和1,也就是3組8位二進制數(shù),8位二進制能夠表達的數(shù)字,最大是“11111111”,換成十進制就是255;0~255,剛好夠?qū)崿F(xiàn)R、G、B三者其中一個色相的256色

? ? 而事實上我們寫入單片機的程序中,任何一句代碼的執(zhí)行基本上都會占用一定的時鐘周期:

????對于工作頻率在11MHz~35MHz之間的STC15W204S單片機來說,一個時鐘周期,就是1/35M ~1/11M 的秒鐘數(shù),大約是28~91ns


????而WS2812對于時序的要求是納秒級的:

????因此,在程序中使用的用來傳輸信號的語句,必須嚴格控制代碼的精簡度!
????參照以上大神的代碼,經(jīng)過自己的一番摸索,我終于實現(xiàn)了讓WS2812聽話!

????并且這一段程序,僅在工作頻率35MHz下才有效,否則燒寫后燈帶的顏色會不聽話,也就是剛好及格;

????以上對于STC15W204S的時序數(shù)據(jù),也許并不可靠,我實驗下來也是疑惑重重,所以,也許還有更加合理的代碼,不過目前我夠用啦!
????非計算機專業(yè),C51語言是大學畢業(yè)設計時期自學的,代碼中應該還有不規(guī)范和不嚴謹之處,所以僅供參考,哈哈~