找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

WS2811應用資料與單片機代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:1108761 發(fā)表于 2024-1-10 11:35 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
一、WS2811簡介

輸出端口耐壓12V

芯片內(nèi)置穩(wěn)壓管,24V以下電源端只需串電阻IC到VDD腳,無需外加穩(wěn)壓管

灰度調(diào)節(jié)電路(256級灰度可調(diào))

內(nèi)置信號整形電路,任何一個IC收到信號后經(jīng)過波形整形后在輸出,保證線路波形畸變不會累加

內(nèi)置上電復位和掉電復位電路

PWM控制端能夠?qū)崿F(xiàn)256級調(diào)節(jié),掃描頻率不低于400HZ/S

串行接口級聯(lián),一根信號線DI完成數(shù)據(jù)的接收與解碼

任意兩點傳輸距離不超過2米無需增加任何電路

當刷新速率30幀/秒時,低速模式級聯(lián)數(shù)不小于512點,高速模式下不小于1024點

數(shù)據(jù)發(fā)送速度可達與400Kbps與800Kbps兩種模式


二、通訊協(xié)議


數(shù)據(jù)協(xié)議采用單線歸零碼的通訊方式, 像素點在上電復位以后, DIN端接受從控制器傳輸過來的數(shù)據(jù), 首先送過來的24bit數(shù)據(jù)被第一個像素點提取后, 送到像素點內(nèi)部的數(shù)據(jù)鎖存器, 剩余的數(shù)據(jù)經(jīng)過內(nèi)部整形處理電路整形放大后通過DO端口開始轉發(fā)輸出給下一個級聯(lián)的像素點, 每經(jīng)過一個像素點的傳輸, 信號減少24bit。 像素點采用自動整形轉發(fā)技術, 使得該像素點的級聯(lián)個數(shù)不受信號傳送的限制, 僅僅受限信號傳輸速度要求。

WS2811 0碼、1碼、reset碼時序、串接方法
數(shù)據(jù)傳輸
需要精確延時的,使用示波器進行查看




三、電路連接


四、開源代碼

WS2811.h

  1. #ifndef __WS2811_H

  2. #define __WS2811_H

  3. #include <stm32f10x.h>

  4. //#define   Time_D    400          //宏定義

  5. #define nWs 50 // 定義串接級聯(lián)WS2811個數(shù)  50可修改

  6. //B-R-G  定義顏色24bits

  7. #define   White        0xFFFFFF  // 白色

  8. #define   Black        0x000000  // 黑色 (不亮)

  9. #define   Blue         0xFF0000  // 藍色

  10. #define   Red          0x00FF00  // 紅色

  11. #define   Green        0x0000FF  // 綠色

  12. #define   Gray         0x22ee22

  13. extern void WS_GPIO_Init(void);//WS2811端口初始化

  14. extern unsigned long WsDat_RUN[nWs];//流水燈顯存

  15. extern unsigned long WsDat[nWs];//流水燈顯存

  16. //extern void WS_Reset(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin);    //復位

  17. //extern void WS_Set1(GPIO_TypeDef *GPIOx,uint16_t GPIO_PIN,unsigned long dat);

  18. //發(fā)送1個字節(jié)

  19. extern void WS_Set_Date(GPIO_TypeDef *GPIOx,uint16_t GPIO_PIN,unsigned char len,unsigned long dat); //發(fā)送相同數(shù)據(jù)

  20. extern void WS_SetAll(GPIO_TypeDef *GPIOx,uint16_t GPIO_PIN); //發(fā)送所有字節(jié)

  21. //燈帶控制方案

  22. extern unsigned long ColorToColor(GPIO_TypeDef *GPIOx,uint16_t GPIO_PIN,unsigned long color0, unsigned long color1,unsigned int speed) ;//顏色漸變   

  23. //初始化顯存數(shù)組

  24. extern void LED_Init(GPIO_TypeDef *GPIOx,uint16_t GPIO_PIN,unsigned long color);          extern void RUN_LED(GPIO_TypeDef *GPIOx,uint16_t GPIO_PIN,unsigned long color,unsigned int speed,unsigned char temp); //跑馬燈

  25. #endif
復制代碼


WS2811.C





  1. #include "WS2811.h"



  2. unsigned long WsDat[nWs];   //顯存

  3. unsigned long WsDat_RUN[nWs];   //流水燈顯存





  4. /**************************************************

  5. * IO初始化(移植時請修改)

  6. ***************************************************/

  7. void WS_GPIO_Init()

  8. {

  9. GPIO_InitTypeDef  GPIO_InitStructure;



  10. RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE );   //端口時鐘,使能

  11. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9; // PIN

  12. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽輸出

  13. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度為50MHz

  14. GPIO_Init(GPIOC, &GPIO_InitStructure); // 端口配置,根據(jù)設定參數(shù)初始化





  15. RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );   //端口時鐘

  16. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13 | GPIO_Pin_12; // PIN

  17. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽輸出

  18. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度為50MHz

  19. GPIO_Init(GPIOB, &GPIO_InitStructure); // 端口配置,根據(jù)設定參數(shù)初始化



  20. }



  21. /**************************

  22. * 內(nèi)部延時

  23. ***************************/



  24. void WS_delay_us(__IO u32 nCount) //簡單的延時函數(shù)

  25. {

  26. for(; nCount != 0; nCount--);

  27. }



  28. void WS_delay2us()

  29. {

  30. unsigned char i;

  31. for(i=0; i<11; i++);

  32. }



  33. void WS_delay05us()

  34. {

  35. // unsigned char i;

  36. // for(i=0; i<1; i++);

  37. }



  38. void WS_delay_ms(uint32_t nms)

  39. {

  40. while(nms--)

  41. {

  42.   WS_delay_us(1670); //普通方式延時

  43. }

  44. }





  45. /***************************

  46. * 發(fā)送一比特

  47. ****************************/

  48. void TX0(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin)    // 發(fā)送0

  49. {

  50. GPIO_SetBits(GPIOx, GPIO_Pin);

  51.     WS_delay05us();

  52. GPIO_ResetBits(GPIOx, GPIO_Pin);

  53. WS_delay2us();

  54. }

  55. void TX1(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin)   // 發(fā)送1

  56. {

  57. GPIO_SetBits(GPIOx, GPIO_Pin);

  58. WS_delay2us();

  59. GPIO_ResetBits(GPIOx, GPIO_Pin);

  60. WS_delay05us();

  61. }

  62. void WS_Reset(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin)   //復位

  63. {

  64. GPIO_ResetBits(GPIOx, GPIO_Pin);

  65. WS_delay_us(50);

  66. GPIO_SetBits(GPIOx, GPIO_Pin);

  67. GPIO_ResetBits(GPIOx, GPIO_Pin);

  68. }



  69. /************************************************

  70. * 發(fā)送數(shù)據(jù)

  71. *************************************************/

  72. void WS_Set1(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin,unsigned long dat)

  73. {

  74. unsigned char i;

  75. for(i=0; i<24; i++)

  76. {

  77. if(0x800000 == (dat & 0x800000) )

  78. TX1(GPIOx,GPIO_Pin);

  79. else

  80. TX0(GPIOx,GPIO_Pin);

  81. dat<<=1;        //左移一位

  82. }

  83. }





  84. void WS_Set_Date(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin,unsigned char len,unsigned long dat) // 全部發(fā)送同樣的數(shù)據(jù)

  85. {

  86.    unsigned char i;

  87.    for(i = 0; i <len; i++)

  88.    {

  89. WS_Set1(GPIOx,GPIO_Pin,dat);

  90.    }

  91. WS_Reset(GPIOx,GPIO_Pin);

  92. }





  93. void WS_SetAll(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin)   //發(fā)送所有字節(jié)

  94. {

  95. unsigned char i;



  96. for(i=0;i<nWs;i++)

  97. {

  98. WS_Set1(GPIOx,GPIO_Pin,WsDat_RUN[i]);  

  99. }

  100. WS_Reset(GPIOx,GPIO_Pin);

  101. WS_delay_ms(500);

  102. }







  103. /**************************顏色漸變函數(shù)***************************/

  104. /*

  105. 從起始顏色---最終顏色

  106. */

  107. unsigned char abs0(int num)//求絕對值

  108. {

  109. if(num>0) return num;



  110. num = -num;

  111. return (unsigned char) num;

  112. }



  113. unsigned long ColorToColor(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin,unsigned long color0, unsigned long color1,unsigned int speed)  

  114. {

  115. unsigned char Red0, Green0, Blue0;  // 起始三原色

  116. unsigned char Red1, Green1, Blue1;  // 結果三原色

  117. int   RedMinus, GreenMinus, BlueMinus; // 顏色差(color1 - color0)

  118. unsigned char NStep; // 需要幾步

  119. float   RedStep, GreenStep, BlueStep; // 各色步進值

  120. unsigned long color; // 結果色

  121. unsigned char i;



  122. // 綠 紅 藍 三原色分解

  123. Red0   = color0>>8;

  124. Green0 = color0>>16;

  125. Blue0  = color0;



  126. Red1   = color1>>8;

  127. Green1 = color1>>16;

  128. Blue1  = color1;



  129. // 綠 紅 藍 三原色分解  若輸入的顏色非上述三種

  130. Red0   =( color0&0x00FF00)>>8;

  131. Green0 = (color0&0xFF0000)>>16;

  132. Blue0  = color0;



  133. Red1   = (color1&0x00FF00)>>8;

  134. Green1 = (color1&0xFF0000)>>16;

  135. Blue1  = color1;



  136. // 計算需要多少步(取差值的最大值)

  137. RedMinus   = Red1 - Red0;

  138. GreenMinus = Green1 - Green0;

  139. BlueMinus  = Blue1 - Blue0;



  140. //判斷兩個絕對值大小。。a>b為真,則=a;否則=b

  141. NStep = ( abs0(RedMinus) > abs0(GreenMinus) ) ? abs0(RedMinus):abs0(GreenMinus);

  142. NStep = ( NStep > abs0(BlueMinus) ) ? NStep:abs0(BlueMinus);



  143. // 計算出各色步進值

  144. RedStep   = (float)RedMinus   / NStep;

  145. GreenStep = (float)GreenMinus / NStep;

  146. BlueStep  = (float)BlueMinus  / NStep;



  147. // 漸變開始

  148. for(i=0; i<NStep; i++)

  149. {

  150. Red1   = Red0   + (int)(RedStep   * i);

  151. Green1 = Green0 + (int)(GreenStep * i);

  152. Blue1  = Blue0  + (int)(BlueStep  * i);



  153. color  = Green1<<16 | Red1<<8 | Blue1; // 合成  綠紅藍



  154. WS_Set_Date(GPIOx,GPIO_Pin,nWs,color); //發(fā)送顏色,所有燈帶同色

  155. WS_delay_ms(speed);

  156. }

  157. return color;

  158. }



  159. /*************跑馬燈****************

  160. 000000000000000000000000

  161. 111100000000000000000000

  162. 000011110000000000000000

  163. 000000001111000000000000

  164. 111100000000111100000000

  165. 000011110000000011110000

  166. ***********************************/

  167. void LED_Init(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin,unsigned long color) //初始化顯存數(shù)組

  168. {

  169. unsigned char i;

  170. for(i=0;i<50;i++)

  171. WsDat_RUN[i]=color;

  172. WS_SetAll(GPIOx,GPIO_Pin);

  173. }



  174. //入口參數(shù)     color----speed----temp

  175. //            顯示顏色--流水速度--間隔距離

  176. void RUN_LED(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin,unsigned long color,unsigned int speed,unsigned char temp)//跑馬燈

  177. {

  178. unsigned char i,j;

  179. for(j=0;j<(nWs-1);j++)

  180. {

  181. for(i=nWs;i>0;i--)

  182. WsDat_RUN[i] = WsDat_RUN[i-1];



  183. if(j%temp == 0)

  184. WsDat_RUN[0] = color;

  185. else

  186. WsDat_RUN[0] = Black;



  187. //WS_Set_Date(GPIO_PIN,nWs,WsDat_RUN[i]);

  188. WS_SetAll(GPIOx,GPIO_Pin);

  189. WS_delay_ms(speed);

  190. }

  191. }

  192. main.c

  193. #include "stm32f10x.h"

  194. #include "WS2811.h"

  195. int main()

  196. {

  197. WS_GPIO_Init();//GPIOC和GPIOB初始化

  198. ColorToColor(GPIOB,GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13 | GPIO_Pin_12,Red,Green,10);//顏色漸變端口GPIOB12\13\14\15輸出

  199. //如果需要其他端口輸出先去WS2811.c修改GPIO口初始化函數(shù)

  200. }
復制代碼


評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:301191 發(fā)表于 2024-1-13 01:55 | 只看該作者
頂一下
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

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