找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 15612|回復: 16
打印 上一主題 下一主題
收起左側

單片機驅動WS2812B燈演示程序

  [復制鏈接]
跳轉到指定樓層
樓主
ID:885138 發(fā)表于 2021-2-20 16:07 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
示例采用HC89S003F4單片機和7燈Ws2812燈帶。HC89S003F4是1T增強型51單片機,如用其他51單片機,需調整晶振頻率。示例僅進行7燈的單次驅動,可在聲明和數組中改變燈珠數量和數據,主函數中修改后可實現流水燈效果。
/*
*HC89S003F4驅動WS2812彩燈演示(7只Led)
*CPU:HC89S003F4 16K bytes flash ROM, 256+256 bytes data RAM
*HC89S003F4是1T增強型51單片機,如用普通51單片機,晶振頻率需增大
*/

  1. #define ALLOCATE_EXTERN
  2. #include "HC89S003F4.h"
  3. #include <intrins.h>

  4. #define WS2812_IO P2_2   //定義驅動引腳
  5. //xdata unsigned char col[21];
  6. //7只LED,共21個數據,每組GRB排列
  7. const unsigned char col[21] = {0x22,0x00,0x00,
  8.                                                            0x00,0x22,0x00,
  9.                                                            0x00,0x00,0x22,
  10.                                                            0x22,0x22,0x00,
  11.                                                            0x00,0x22,0x22,
  12.                                                            0x22,0x00,0x22,
  13.                                                            0x22,0x22,0x22,
  14.                                                            };


  15. void ws2812_rst(void)
  16. {        
  17.         u8 i;         //
  18.         WS2812_IO = 1;
  19.         i = 100; //           如果主頻較高適當增加
  20.         while(i--);
  21.         WS2812_IO = 0;
  22.     i = 100; //           如果主頻較高適當增加
  23.         while(i--);
  24. }

  25. void ws2812_write_byte( u8 dat)
  26. {        
  27.         u8 i = 8;
  28.         dat <<= 1;         //最高位進入CY
  29.         while(i)
  30.         {
  31.                  //高電平時間小于0.45uS為邏輯0,大于時為邏輯1
  32.                 WS2812_IO = 1;
  33.                 //如果主頻較高可在此處適當增加_nop_();
  34.                 WS2812_IO = CY;
  35.                 //如果主頻較高可在此處適當增加_nop_();
  36.                 _nop_();
  37.         WS2812_IO = 0;
  38.                 dat <<= 1;         //最高位進入CY
  39.                 i--;                        
  40.         }
  41. }

  42. /**************************************************************************************
  43. void main()
  44. {
  45.         unsigned char i;

  46. /************************************系統(tǒng)初始化****************************************/
  47.         WDTCCR = 0x00;                                                //關閉看門狗
  48.                                                 //本例程為方便測試關閉看門狗,實際使用中,建議客戶打開看門狗,詳見WDT復位例程
  49.         CLKSWR = 0x53;                                                //選擇內部高頻RC為系統(tǒng)時鐘,內部高頻RC 8分頻,Fosc=4MHz
  50.         CLKDIV = 0x01;                                                //Fosc 1分頻得到Fcpu,Fcpu=4MHz

  51.         P2M1 = P2M1&0xF0|0x08;                                //P22設置為推挽輸出
  52.         
  53. /****以上為HC89S003F4單片機專用的SFR,普通單片機不用設置,但需提高晶振頻率*****/

  54.         ws2812_rst();
  55.         for( i= 0; i< 21 ;i++)
  56.         {
  57.                 ws2812_write_byte( col[i]);
  58.         }
  59.         while(1){} ;
  60. }
復制代碼

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏8 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:885138 發(fā)表于 2021-2-20 16:38 來自觸屏版 | 只看該作者
效果圖

JPEG_20210220_163457_.jpg (1.17 MB, 下載次數: 170)

JPEG_20210220_163457_.jpg

JPEG_20210220_163708_.jpg (705.44 KB, 下載次數: 170)

JPEG_20210220_163708_.jpg

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

板凳
ID:885138 發(fā)表于 2021-2-21 18:28 來自觸屏版 | 只看該作者
轉發(fā)網友實驗總結的WS2812B時序要求,供大家參考。

Screenshot_20210221-164434.jpg (257.48 KB, 下載次數: 186)

Screenshot_20210221-164434.jpg

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

地板
ID:390416 發(fā)表于 2021-2-22 20:05 | 只看該作者
回復

使用道具 舉報

5#
ID:885879 發(fā)表于 2021-2-23 16:22 | 只看該作者
樓主你好,新手求教,燈帶和單片機的接口該怎么連接呢?
回復

使用道具 舉報

6#
ID:390416 發(fā)表于 2021-2-23 16:55 | 只看該作者
Levent 發(fā)表于 2021-2-23 16:22
樓主你好,新手求教,燈帶和單片機的接口該怎么連接呢?

普通IO口 串聯100歐電阻 連過去就行了  必須能夠輸出5V電平。不能3.3V
回復

使用道具 舉報

7#
ID:885138 發(fā)表于 2021-2-24 00:07 來自觸屏版 | 只看該作者
Levent 發(fā)表于 2021-2-23 16:22
樓主你好,新手求教,燈帶和單片機的接口該怎么連接呢?

如圖中實物連有三條線,兩條是電源VCC GND,另一條是數據線。
電源可與單片機共用,燈珠數量多時最好單獨供電,但要與單片機共地,電壓5V(USB)至3.7V(鋰電池)都可以,3.3V有點閃。每個(或每兩個)燈珠的電源處要并一個小電容(0.1uF)。
單片機IO上拉輸出或推挽輸出,與燈帶數據輸入(DIN)間最好加一個小電阻(100歐)防沖擊,實驗時不加也可以。燈帶還有個輸出線DOUT,可以級聯下一燈帶的DIN。
單總線方式,驅動較簡單,兩種狀態(tài):復位(較長時間的低電平)或位傳送。位0或位1取決于高電平脈寬,低電平寬度要求不高,小于復位就行。(三樓有具體說明)
應用挺方便的,動手試試。需要注意的是,因位傳送時高電平的脈寬均在uS級以下,單片機頻率要適當提高些。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

8#
ID:885138 發(fā)表于 2021-2-25 08:31 來自觸屏版 | 只看該作者
Levent 發(fā)表于 2021-2-23 16:22
樓主你好,新手求教,燈帶和單片機的接口該怎么連接呢?

我的另一個貼子里有普通51單片機驅動ws2812b的例子,對晶振頻率要求低一些。參看http://www.torrancerestoration.com/bbs/forum.php?mod=viewthread&tid=202899&extra=page%3D1&mobile=no
回復

使用道具 舉報

9#
ID:611155 發(fā)表于 2021-3-30 00:40 | 只看該作者
你的CY定義在哪里? 還有ws2812_write_byte 函數中 data<1逐個發(fā)送過程中,在while(i)里面怎么區(qū)分data的0,1? 如果是0,那么時間要小于0.45us,如果是1要大于0.45,這在函數中沒有體現?
回復

使用道具 舉報

10#
ID:885138 發(fā)表于 2021-3-30 09:20 來自觸屏版 | 只看該作者
johnspen 發(fā)表于 2021-3-30 00:40
你的CY定義在哪里? 還有ws2812_write_byte 函數中 data

1,CY就是進位標志C,51單片機頭文件中有定義,在C語言中用CY直接調用;
2,左移data后,最高位移入CY;
3,函數中,將CY值寫至引腳的作用,CY=0比CY=1提前拉低,體現為高電平的脈寬變化。
回復

使用道具 舉報

11#
ID:611155 發(fā)表于 2021-3-30 14:20 | 只看該作者
xxd0708 發(fā)表于 2021-3-30 09:20
1,CY就是進位標志C,51單片機頭文件中有定義,在C語言中用CY直接調用;
2,左移data后,最高位移入CY; ...

哦,這個單片機沒用過
回復

使用道具 舉報

12#
ID:611155 發(fā)表于 2021-3-30 14:28 | 只看該作者
xxd0708 發(fā)表于 2021-3-30 09:20
1,CY就是進位標志C,51單片機頭文件中有定義,在C語言中用CY直接調用;
2,左移data后,最高位移入CY; ...

雖然這個單片機沒用過,我就大概猜一下邏輯,也就是說再while(i)里面,就先直接將IO口拉高,這里有一個時間,然后把CY(也就是左移后的高位給IO口),如果是1,那么就是高位持續(xù)了2個時間,如果是0,那么高位就持續(xù)了1個時間,如果WS2812_IO = 1;這個時間是0.45us,2個時間就是*2 =0.9us, 一個時間就是0.45us。
就是CY是1的話,就是高0.9us +_nop_();+WS2812_IO = 0;就是符合了W2812的時序
回復

使用道具 舉報

13#
ID:920224 發(fā)表于 2021-5-12 19:16 | 只看該作者
8M4T的片子有方法驅動嗎?樓主可以提供一下思路嗎謝謝。
回復

使用道具 舉報

14#
ID:885138 發(fā)表于 2021-5-13 07:00 來自觸屏版 | 只看該作者
tungkin 發(fā)表于 2021-5-12 19:16
8M4T的片子有方法驅動嗎?樓主可以提供一下思路嗎謝謝。

8M4T每個指令周期0.5uS,置位或清零引腳為2個指令周期即1uS,顯然不能直接驅動。但可以用RC電路延時解決,參看我的另一個貼子
回復

使用道具 舉報

15#
ID:885138 發(fā)表于 2021-5-13 07:01 來自觸屏版 | 只看該作者
xxd0708 發(fā)表于 2021-5-13 07:00
8M4T每個指令周期0.5uS,置位或清零引腳為2個指令周期即1uS,顯然不能直接驅動。但可以用RC電路延時解決 ...

搜索“51單片機(12MHz@12T)驅動WS2812B”
回復

使用道具 舉報

16#
ID:920224 發(fā)表于 2021-5-13 09:15 | 只看該作者
xxd0708 發(fā)表于 2021-5-13 07:01
搜索“51單片機(12MHz@12T)驅動WS2812B”

好的謝謝作者!
回復

使用道具 舉報

17#
ID:991413 發(fā)表于 2021-12-12 21:20 | 只看該作者
xdata那里我用的時候他總說前面少了個分號,咋回事
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表