久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10535|回復: 15
收起左側

STC8系列單片機WS2812驅動程序

  [復制鏈接]
ID:290373 發表于 2021-1-11 23:02 | 顯示全部樓層 |閱讀模式
依照STC-Y6指令集編寫,編譯時Keil優化選項默認,理論上STC8全系列通用。
只需配置IO口和系統工作時鐘即可使用,系統時鐘目前適配范圍為5.5296-48MHz。
STC8H8K64S4U@12.0MHz驅動效果如下圖:
(分別點亮三個燈,顏色為B,G,R)
51hei圖片20210111230033.jpg

主要使用的單字節數據發送函數如下:

  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. }
復制代碼
附測試樣例:
WS2812.zip (18.51 KB, 下載次數: 268)

評分

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

查看全部評分

回復

使用道具 舉報

ID:836437 發表于 2021-1-12 12:49 | 顯示全部樓層
方式不錯
回復

使用道具 舉報

ID:390416 發表于 2021-1-15 20:58 | 顯示全部樓層
一開始就移位了,你確定這樣數據不出錯嗎?
回復

使用道具 舉報

ID:877820 發表于 2021-1-20 17:54 | 顯示全部樓層
如何點亮單個燈呢
回復

使用道具 舉報

ID:290373 發表于 2021-1-21 17:22 | 顯示全部樓層
人人學會單片機 發表于 2021-1-15 20:58
一開始就移位了,你確定這樣數據不出錯嗎?

數據是完整的,用了CY位存儲的位移結果,其他運算在數據傳輸的循環里也不會影響CY。
這是傳送了一字節的0x55的波形:
未標題-1.png
回復

使用道具 舉報

ID:290373 發表于 2021-1-21 17:23 | 顯示全部樓層
1436405015 發表于 2021-1-20 17:54
如何點亮單個燈呢

送幾個數據點幾個燈
回復

使用道具 舉報

ID:325642 發表于 2021-1-24 21:06 | 顯示全部樓層
這樣的LED在顏色不變時,亮度怎么調呢
回復

使用道具 舉報

ID:718536 發表于 2021-3-4 01:19 | 顯示全部樓層
冬天的野狼 發表于 2021-1-24 21:06
這樣的LED在顏色不變時,亮度怎么調呢

RGB顏色 0-255級別亮度。0就是不亮。0,0,0就是三個顏色都滅了。
回復

使用道具 舉報

ID:973749 發表于 2021-11-1 17:19 | 顯示全部樓層
冬天的野狼 發表于 2021-1-24 21:06
這樣的LED在顏色不變時,亮度怎么調呢

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

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

使用道具 舉報

ID:1015077 發表于 2022-4-19 14:54 | 顯示全部樓層
eastwife 發表于 2021-11-1 17:19
按樓主程序,比如開始你是綠色最亮:

調整到一半亮度就是255/2=128:

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

使用道具 舉報

ID:99525 發表于 2022-5-31 07:30 | 顯示全部樓層
Berri 發表于 2022-4-19 14:54
可是例如RGB(255,255,255)的白色調到一半(128,128,128)變成了灰色,它顏色改變了呀,請問可以不 ...

白色變暗,那不就是灰色嗎?
回復

使用道具 舉報

ID:136485 發表于 2022-5-31 08:48 | 顯示全部樓層
剛好前段時間也有弄這個,下載下來參考參考
回復

使用道具 舉報

ID:399179 發表于 2023-4-10 21:15 來自手機 | 顯示全部樓層
真在研究這個,謝謝!
回復

使用道具 舉報

ID:398094 發表于 2023-11-22 09:19 | 顯示全部樓層
如何點亮單個燈呢
回復

使用道具 舉報

ID:373976 發表于 2023-11-26 10:12 | 顯示全部樓層
想法不錯,一會兒測試一下
回復

使用道具 舉報

ID:1104147 發表于 2023-12-13 17:18 | 顯示全部樓層
這是IO口點的?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 九九热视频这里只有精品 | 国产成人一区二 | 男人天堂手机在线视频 | 2021狠狠干 | 日本不卡一区二区三区在线观看 | 日韩一区二区三区av | 伊色综合久久之综合久久 | 国产探花 | 精品欧美乱码久久久久久1区2区 | 欧美一区二区免费视频 | 看羞羞视频 | 日韩播放 | 91网站视频在线观看 | 精品日韩在线观看 | 日本不卡一区二区三区在线观看 | 国产一区二区三区四区hd | 久久国产精品视频 | 男人的天堂avav | 波多野结衣一区二区 | 国产一区高清 | 国产精品人人做人人爽 | 视频1区2区 | 色免费视频 | 日韩三级在线观看 | 国产精品美女久久久久aⅴ国产馆 | 久久天天 | 全免费a级毛片免费看视频免费下 | www.久久 | 欧美视频一区二区三区 | 成人黄色在线观看 | 毛片一级片 | 久草资源在线视频 | 三级免费网 | 精品久久久久一区 | 免费av手机在线观看 | 成人欧美一区二区三区在线播放 | 国产精品美女一区二区 | 九九热免费看 | 欧美国产日韩在线观看 | 成人在线观看免费视频 | 日韩欧美二区 |