找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 10713|回復(fù): 15
打印 上一主題 下一主題
收起左側(cè)

STC8系列單片機(jī)WS2812驅(qū)動(dòng)程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
依照STC-Y6指令集編寫,編譯時(shí)Keil優(yōu)化選項(xiàng)默認(rèn),理論上STC8全系列通用。
只需配置IO口和系統(tǒng)工作時(shí)鐘即可使用,系統(tǒng)時(shí)鐘目前適配范圍為5.5296-48MHz。
STC8H8K64S4U@12.0MHz驅(qū)動(dòng)效果如下圖:
(分別點(diǎn)亮三個(gè)燈,顏色為B,G,R)


主要使用的單字節(jié)數(shù)據(jù)發(fā)送函數(shù)如下:

  1. #include "ws2812.h"

  2. void WS2812_SendByte(unsigned char dat)
  3. {
  4.     unsigned char i = 8;
  5.     dat <<= 1;
  6.     while (i)
  7.     {
  8.         WS2812_IO = 1;

  9.         //5.5296 - 6.8
  10.         #if SYS_FREQ < 55296 || SYS_FREQ > 480000
  11.         #error 頻率未適配, 不在 5.5296-48MHz
  12.         #else
  13.         _nop_();
  14.         #endif

  15.         //6.8 - 10.8
  16.         #if SYS_FREQ >= 68000
  17.         _nop_();
  18.         #endif

  19.         //10.8 – 21.4
  20.         #if SYS_FREQ >= 108000
  21.         _nop_();
  22.         _nop_();
  23.         #endif

  24.         //21.4 – 29.5
  25.         #if SYS_FREQ >= 214000
  26.         _nop_();
  27.         _nop_();
  28.         #endif

  29.         //29.5 – 35.0
  30.         #if SYS_FREQ >= 295000
  31.         _nop_();
  32.         _nop_();
  33.         #endif

  34.         //35.0 – 40.7
  35.         #if SYS_FREQ >= 350000
  36.         _nop_();
  37.         _nop_();
  38.         #endif

  39.         //40.7 – 46.8
  40.         #if SYS_FREQ >= 407000
  41.         _nop_();
  42.         _nop_();
  43.         #endif

  44.         //46.8 – 48
  45.         #if SYS_FREQ >= 468000
  46.         _nop_();
  47.         _nop_();
  48.         #endif

  49.         WS2812_IO = CY;
  50.         //5.5296 - 6.8
  51.         #if SYS_FREQ < 55296 || SYS_FREQ > 480000
  52.         #error 頻率未適配
  53.         #else
  54.         _nop_();
  55.         #endif

  56.         //6.8 - 10.8
  57.         #if SYS_FREQ >= 68000
  58.         _nop_();
  59.         #endif

  60.         //10.8 – 21.4
  61.         #if SYS_FREQ >= 108000
  62.         _nop_();
  63.         _nop_();
  64.         #endif

  65.         //21.4 – 29.5
  66.         #if SYS_FREQ >= 214000
  67.         _nop_();
  68.         _nop_();
  69.         #endif

  70.         //29.5 – 35.0
  71.         #if SYS_FREQ >= 295000
  72.         _nop_();
  73.         _nop_();
  74.         #endif

  75.         //35.0 – 40.7
  76.         #if SYS_FREQ >= 350000
  77.         _nop_();
  78.         _nop_();
  79.         #endif

  80.         //40.7 – 46.8
  81.         #if SYS_FREQ >= 407000
  82.         _nop_();
  83.         _nop_();
  84.         #endif

  85.         //46.8 – 48
  86.         #if SYS_FREQ >= 468000
  87.         _nop_();
  88.         _nop_();
  89.         #endif
  90.         WS2812_IO = 0;
  91.         dat <<= 1;
  92.         i--;
  93.     }
  94. }

  95. void Send_WS2812RGB(unsigned char r, unsigned char g, unsigned char b)
  96. {
  97.     WS2812_SendByte(g);
  98.     WS2812_SendByte(r);
  99.     WS2812_SendByte(b);
  100. }

  101. void Send_WS2812(unsigned long dat)
  102. {
  103.     WS2812_SendByte(dat >> 8 & 0xff);
  104.     WS2812_SendByte(dat >> 16 & 0xff);
  105.     WS2812_SendByte(dat & 0xff);
  106. }
復(fù)制代碼
附測(cè)試樣例:
WS2812.zip (18.51 KB, 下載次數(shù): 268)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏15 分享淘帖 頂3 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:836437 發(fā)表于 2021-1-12 12:49 | 只看該作者
方式不錯(cuò)
回復(fù)

使用道具 舉報(bào)

板凳
ID:390416 發(fā)表于 2021-1-15 20:58 | 只看該作者
一開始就移位了,你確定這樣數(shù)據(jù)不出錯(cuò)嗎?
回復(fù)

使用道具 舉報(bào)

地板
ID:877820 發(fā)表于 2021-1-20 17:54 | 只看該作者
如何點(diǎn)亮單個(gè)燈呢
回復(fù)

使用道具 舉報(bào)

5#
ID:290373 發(fā)表于 2021-1-21 17:22 | 只看該作者
人人學(xué)會(huì)單片機(jī) 發(fā)表于 2021-1-15 20:58
一開始就移位了,你確定這樣數(shù)據(jù)不出錯(cuò)嗎?

數(shù)據(jù)是完整的,用了CY位存儲(chǔ)的位移結(jié)果,其他運(yùn)算在數(shù)據(jù)傳輸?shù)难h(huán)里也不會(huì)影響CY。
這是傳送了一字節(jié)的0x55的波形:

回復(fù)

使用道具 舉報(bào)

6#
ID:290373 發(fā)表于 2021-1-21 17:23 | 只看該作者
1436405015 發(fā)表于 2021-1-20 17:54
如何點(diǎn)亮單個(gè)燈呢

送幾個(gè)數(shù)據(jù)點(diǎn)幾個(gè)燈
回復(fù)

使用道具 舉報(bào)

7#
ID:325642 發(fā)表于 2021-1-24 21:06 | 只看該作者
這樣的LED在顏色不變時(shí),亮度怎么調(diào)呢
回復(fù)

使用道具 舉報(bào)

8#
ID:718536 發(fā)表于 2021-3-4 01:19 | 只看該作者
冬天的野狼 發(fā)表于 2021-1-24 21:06
這樣的LED在顏色不變時(shí),亮度怎么調(diào)呢

RGB顏色 0-255級(jí)別亮度。0就是不亮。0,0,0就是三個(gè)顏色都滅了。
回復(fù)

使用道具 舉報(bào)

9#
ID:973749 發(fā)表于 2021-11-1 17:19 | 只看該作者
冬天的野狼 發(fā)表于 2021-1-24 21:06
這樣的LED在顏色不變時(shí),亮度怎么調(diào)呢

按樓主程序,比如開始你是綠色最亮:
  1. Send_WS2812RGB(255,0,0);
復(fù)制代碼

調(diào)整到一半亮度就是255/2=128:
  1. Send_WS2812RGB(128,0,0);
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

10#
ID:1015077 發(fā)表于 2022-4-19 14:54 | 只看該作者
eastwife 發(fā)表于 2021-11-1 17:19
按樓主程序,比如開始你是綠色最亮:

調(diào)整到一半亮度就是255/2=128:

可是例如RGB(255,255,255)的白色調(diào)到一半(128,128,128)變成了灰色,它顏色改變了呀,請(qǐng)問可以不改變顏色只改變亮度嗎
回復(fù)

使用道具 舉報(bào)

11#
ID:99525 發(fā)表于 2022-5-31 07:30 | 只看該作者
Berri 發(fā)表于 2022-4-19 14:54
可是例如RGB(255,255,255)的白色調(diào)到一半(128,128,128)變成了灰色,它顏色改變了呀,請(qǐng)問可以不 ...

白色變暗,那不就是灰色嗎?
回復(fù)

使用道具 舉報(bào)

12#
ID:136485 發(fā)表于 2022-5-31 08:48 | 只看該作者
剛好前段時(shí)間也有弄這個(gè),下載下來參考參考
回復(fù)

使用道具 舉報(bào)

13#
ID:399179 發(fā)表于 2023-4-10 21:15 來自觸屏版 | 只看該作者
真在研究這個(gè),謝謝!
回復(fù)

使用道具 舉報(bào)

14#
ID:398094 發(fā)表于 2023-11-22 09:19 | 只看該作者
如何點(diǎn)亮單個(gè)燈呢
回復(fù)

使用道具 舉報(bào)

15#
ID:373976 發(fā)表于 2023-11-26 10:12 | 只看該作者
想法不錯(cuò),一會(huì)兒測(cè)試一下
回復(fù)

使用道具 舉報(bào)

16#
ID:1104147 發(fā)表于 2023-12-13 17:18 | 只看該作者
這是IO口點(diǎn)的?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表