找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1817|回复: 1
收起左侧

WS2811应用资料与单片机代码

[复制链接]
ID:1108761 发表于 2024-1-10 11:35 | 显示全部楼层 |阅读模式
一、WS2811简介

输出端口耐压12V

芯片内置稳压管,24V以下电源端只需串电阻IC到VDD脚,无需外加稳压管

灰度调节电路(256级灰度可调)

内置信号整形电路,任何一个IC收到信号后经过波形整形后在输出,保证线路波形畸变不会累加

内置上电复位和掉电复位电路

PWM控制端能够实现256级调节,扫描频率不低于400HZ/S

串行接口级联,一根信号线DI完成数据的接收与解码

任意两点传输距离不超过2米无需增加任何电路

当刷新速率30帧/秒时,低速模式级联数不小于512点,高速模式下不小于1024点

数据发送速度可达与400Kbps与800Kbps两种模式


二、通讯协议


数据协议采用单线归零码的通讯方式, 像素点在上电复位以后, DIN端接受从控制器传输过来的数据, 首先送过来的24bit数据被第一个像素点提取后, 送到像素点内部的数据锁存器, 剩余的数据经过内部整形处理电路整形放大后通过DO端口开始转发输出给下一个级联的像素点, 每经过一个像素点的传输, 信号减少24bit。 像素点采用自动整形转发技术, 使得该像素点的级联个数不受信号传送的限制, 仅仅受限信号传输速度要求。

WS2811 0码、1码、reset码时序、串接方法
数据传输
需要精确延时的,使用示波器进行查看




三、电路连接


四、开源代码

WS2811.h

  1. #ifndef __WS2811_H

  2. #define __WS2811_H

  3. #include <stm32f10x.h>

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

  5. #define nWs 50 // 定义串接级联WS2811个数  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. //发送1个字节

  19. extern void WS_Set_Date(GPIO_TypeDef *GPIOx,uint16_t GPIO_PIN,unsigned char len,unsigned long dat); //发送相同数据

  20. extern void WS_SetAll(GPIO_TypeDef *GPIOx,uint16_t GPIO_PIN); //发送所有字节

  21. //灯带控制方案

  22. extern unsigned long ColorToColor(GPIO_TypeDef *GPIOx,uint16_t GPIO_PIN,unsigned long color0, unsigned long color1,unsigned int speed) ;//颜色渐变   

  23. //初始化显存数组

  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); // 端口配置,根据设定参数初始化





  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); // 端口配置,根据设定参数初始化



  20. }



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

  22. * 内部延时

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



  24. void WS_delay_us(__IO u32 nCount) //简单的延时函数

  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. * 发送一比特

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

  48. void TX0(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin)    // 发送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)   // 发送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. * 发送数据

  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) // 全部发送同样的数据

  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)   //发送所有字节

  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. /**************************颜色渐变函数***************************/

  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); //发送颜色,所有灯带同色

  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) //初始化显存数组

  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. //入口参数     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口初始化函数

  200. }
复制代码


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:301191 发表于 2024-1-13 01:55 | 显示全部楼层
顶一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表