标题: WS2812源程序及相关资料(51单片机,stm32,arduino平台) [打印本页]

作者: ANmouse    时间: 2018-4-16 19:49
标题: WS2812源程序及相关资料(51单片机,stm32,arduino平台)
WS2812资料包(含51单片机,arduino平台与stm32的各种控制源码):


WS2812是一个集控制电路与发光电路于一体的智能外控LED光源。其外型与一个5050LED灯珠相同,每个元件即为一个像素点。像素点内部包含了智能数字接口数据锁存信号整形放大驱动电路,还包含有高精度的内部振荡器和12V高压可编程定电流控制部分,有效保证了像素点光的颜色高度一致。数据协议采用单线归零码的通讯方式,像素点在上电复位以后,DIN端接受从控制器传输过来的数据,首先送过来的24bit数据被第一个像素点提取后,送到像素点内部的数据锁存器,剩余的数据经过内部整形处理电路整形放大后通过DO端口开始转发输出给下一个级联的像素点,每经过一个像素点的传输,信号减少24bit。像素点采用自动整形转发技术,使得该像素点的级联个数不受信号传送的限制,仅仅受限信号传输速度要求。LED具有低电压驱动,环保节能,亮度高,散射角度大,一致性好,超低功率,超长寿命等优点。将控制电路集成于LED上面,电路变得更加简单,体积小,安装更加简便。

●控制电路与RGB芯片集成在一个5050封装的元器件中,构成一个完整的外控像素点。
●内置信号整形电路,任何一个像素点收到信号后经过波形整形再输出,保证线路波形畸变不会累加。
●内置上电复位和掉电复位电路。
●每个像素点的三基色颜色可实现256级亮度显示,完成16777216种颜色的全真色彩显示,扫描频率不低于
400Hz/s。
●串行级联接口,能通过一根信号线完成数据的接收与解码。
●任意两点传传输距离在不超过5米时无需增加任何电路。
●当刷新速率30帧/秒时,低速模式级联数不小于512点,高速模式不小于1024点。
●数据发送速度可达800Kbps。
●光的颜色高度一致,性价比高。

WS2812引脚图与数据手册(51hei附件可下载)


电路原理图如下:



源码:
RGB LED Cycle Test
RGB LED Cycle 七彩切换效果程序
RGB LED Cycle 七彩渐变效果程序
RGB LED Cycle 七彩覆盖效果程序
RGB LED Cycle 三色循环效果程序
RGB LED Cycle 三色覆盖效果程序
RGB LED Cycle 单个红色旋转效果程序
RGB LED Cycle 双色渐变彩带旋转效果程序
RGB LED Cycle 红绿蓝三色旋转效果程序
RGB LED Cycle 红绿蓝三色旋转效果程序2
WS2812B数据驱动
带单片机8位全彩流水灯程序模板V1.0
带单片机8位全彩流水灯程序模板V1.1

stm32
3步打造stm32驱动的ws2812智能灯.zip
NucleoL496智能灯数据点.zip

51单片机源程序如下:
  1. /*----------------------------------------------------------------------------   
  2. * 项目名称:

  3.      RGB LED驱动程序

  4. * 功能描述:

  5.      1、将整个数组的数据发送得到LED进行显示
  6.          2、从指定像素开始将整个数组的数据发送到LED显示
  7.          3、发送复位信号

  8. * 版权信息:

  9.      (c) 飞翼电子, 2014.

  10. * 历史版本:
  11.      2014-03-15:
  12.        - 初始版本 V1.0.0;

  13. * 配置说明:
  14.      MCU:             STC15W204S
  15.      晶振:                内部晶振:33MHz
  16.      扩展模块:            -
  17.      软件:            Keil.C51.V9.01

  18. * 备注:

  19. ------------------------------------------------------------------------------*/   

  20. #include "STC15W.h"
  21. #include <intrins.h>
  22. #include "ws2812.h"

  23. //-------------------------------------------------------------------------------
  24. //子程序名称:IO_Init(void)
  25. //功能:端口初始化
  26. //-------------------------------------------------------------------------------
  27. void IO_Init(void)
  28. {
  29.         ;
  30. }

  31. //-------------------------------------------------------------------------------
  32. //子程序名称:ResetDateFlow(void)
  33. //功能:复位,为下一次发送做准备,
  34. //说明:将DI置位为0后,延时约65us
  35. //-------------------------------------------------------------------------------
  36. void ResetDataFlow(void)
  37. {
  38.         unsigned char i,j;
  39.         DI=0;                                        //DI置为0后,延时50us以上,实现帧复位
  40.         for(i=0;i<15;i++)                //此处33Mhz时延时65us
  41.         {
  42.                 for(j=0;j<20;j++)
  43.                 {
  44.                         ;
  45.                 }
  46.         }
  47. }
  48. //-------------------------------------------------------------------------------
  49. //子程序名称:SendOnePix(unsigned char *ptr)
  50. //功能:发送一个像素点的24bit数据
  51. //参数:接收的参数是一个指针,此函数会将此指针指向的地址的连续的三个Byte的数据发送
  52. //说明:在主函数中直接调用此函数时,在整个帧发送开始前需要先执行 ResetDataFlow()
  53. //                数据是按归零码的方式发送,速率为800KBPS
  54. //-------------------------------------------------------------------------------
  55. void SendOnePix(unsigned char *ptr)
  56. {
  57.         unsigned char i,j;
  58.         unsigned char temp;

  59.         for(j=0;j<3;j++)
  60.         {
  61.                 temp=ptr[j];
  62.                 for(i=0;i<8;i++)
  63.                 {
  64.                         if(temp&0x80)                 //从高位开始发送
  65.                         {
  66.                                 DI=1;                         //发送“1”码
  67.                                 _nop_();                 //不可省略的nop(),延时指定时间作用,晶振频率33MHz
  68.                                 _nop_();
  69.                                 _nop_();
  70.                                 _nop_();
  71.                                 _nop_();
  72.                                 _nop_();
  73.                                 _nop_();
  74.                                 _nop_();
  75.                                 _nop_();
  76.                                 _nop_();
  77.                                 _nop_();
  78.                                 _nop_();
  79.                                 _nop_();
  80.                                 _nop_();
  81.                                 _nop_();
  82.                                 _nop_();
  83.                                 _nop_();
  84.                                 _nop_();
  85.                                 _nop_();
  86.                                 _nop_();

  87.                                 DI=0;
  88.                                 _nop_();
  89.                                 _nop_();
  90.                                 _nop_();
  91.                                 _nop_();
  92.                                 _nop_();
  93.                                 _nop_();
  94.                                 _nop_();
  95.                                 _nop_();
  96.                                 _nop_();
  97.                                 _nop_();
  98.                                 _nop_();
  99.                                 _nop_();
  100.                                 _nop_();
  101.                                 _nop_();
  102.                                 _nop_();
  103.                         }
  104.                         else                                //发送“0”码
  105.                         {
  106.                                 DI=1;
  107.                                 _nop_();
  108.                                 _nop_();
  109.                                 _nop_();
  110.                                 _nop_();
  111.                                 _nop_();
  112.                                 _nop_();
  113.                                 _nop_();

  114.                                 DI=0;
  115.                                 _nop_();
  116.                                 _nop_();
  117.                                 _nop_();
  118.                                 _nop_();
  119.                                 _nop_();
  120.                                 _nop_();
  121.                                 _nop_();
  122.                                 _nop_();
  123.                                 _nop_();
  124.                                 _nop_();
  125.                                 _nop_();
  126.                                 _nop_();
  127.                                 _nop_();
  128.                                 _nop_();
  129.                                 _nop_();
  130.                                 _nop_();
  131.                                 _nop_();
  132.                                 _nop_();
  133.                                 _nop_();
  134.                         }
  135.                         temp=(temp<<1);                 //左移位
  136.                 }
  137.         }
  138. }
  139. //-------------------------------------------------------------------------------
  140. //子程序名称:SendOneFrame(unsigned char *ptr)
  141. //功能:发送一帧数据(即发送整个数组的数据)
  142. //参数:接收的参数是一个指针,此函数会将此指针指向的地址的整个数组的数据发送
  143. //-------------------------------------------------------------------------------
  144. void SendOneFrame(unsigned char *ptr)
  145. {
  146.         unsigned char k;

  147.         ResetDataFlow();                                 //发送帧复位信号

  148.         for(k=0;k<SNUM;k++)                                 //发送一帧数据,SNUM是板子LED的个数
  149.         {
  150.                 SendOnePix(&ptr[(3*k)]);
  151.         }

  152.         ResetDataFlow();                                 //发送帧复位信号
  153. }

  154. //-------------------------------------------------------------------------------
  155. //子程序名称:SendSameColor(unsigned char *ptr,unsigned char cnt)
  156. //功能:相同颜色的点发送cnt次
  157. //参数:接收的参数是一个指针,指向像素点颜色数组,cnt传递发送个数
  158. //-------------------------------------------------------------------------------
  159. void SendSameColor(unsigned char *ptr,unsigned char cnt)
  160. {
  161.         unsigned char k;

  162.         ResetDataFlow();                                 //发送帧复位信号

  163.         for(k=0;k<cnt;k++)                                 //发送一帧数据,SNUM是板子LED的个数
  164.         {
  165.                 SendOnePix(&ptr[0]);
  166.         }

  167.         ResetDataFlow();                                 //发送帧复位信号
  168. }
  169. //-------------------------------------------------------------------------------
  170. //子程序名称:SendOneFrameFrom(unsigned char i,unsigned char *ptr)
  171. //功能:从指定的像素点开始发送一帧数据(即发送整个数组的数据)
  172. //参数:接收的参数是一个指针,此函数会将此指针指向的地址的整帧数据发送
  173. //                i:把数组的第0个像素数据发送到第i个像素点(第0个像素是板上标号为01的像素)
  174. //说明:即原本对应第一个像素的数据会发送到第i个像素点(LED)上
  175. //-------------------------------------------------------------------------------
  176. void SendOneFrameFrom(unsigned char i,unsigned char *ptr)
  177. {
  178.         unsigned char k;

  179.         ResetDataFlow();                                 //发送帧复位信号

  180.            for(k=(SNUM-i);k<SNUM;k++)                 //发送一帧数据
  181.         {
  182.                 SendOnePix(&ptr[(3*k)]);
  183.         }
  184.         for(k=0;k<(SNUM-i);k++)
  185.         {
  186.                 SendOnePix(&ptr[(3*k)]);
  187.         }

  188.         ResetDataFlow();                                 //发送帧复位信号
  189. }

  190. //-------------------------------------------------------------------------------
  191. //子程序名称:SendOneFrameSince(unsigned char i,unsigned char *ptr)
  192. //功能:从第i个像素点的数据开始发送一帧数据(即发送整个数组的数据)
  193. //参数:接收的参数是一个指针,此函数会将此指针指向的地址的整帧数据发送
  194. //                i:把数组的第i个像素数据发送到第1个像素点
  195. //说明:即原本对应第i像素的数据会发送到第1个像素点(LED)上,第i+1个像素点的数据
  196. //                发送到第2个像素上
  197. //-------------------------------------------------------------------------------
  198. void SendOneFrameSince(unsigned char i,unsigned char *ptr)
  199. {
  200.         unsigned char k;

  201.         ResetDataFlow();                                 //发送帧复位信号

  202.         for(k=i;k<SNUM;k++)                                 //发送一帧数据
  203.         {
  204.                 SendOnePix(&ptr[(3*k)]);
  205.         }
  206.         for(k=0;k<i;k++)
  207.         {
  208.                 SendOnePix(&ptr[(3*k)]);
  209.         }
  210.         ResetDataFlow();                                 //发送帧复位信号
  211. }
  212. ……………………

  213. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:

ws2812B模块资料.rar (12.02 MB, 下载次数: 1180)



作者: lerymanore    时间: 2018-4-18 14:27
ws2812能调亮度么?

作者: sinolover    时间: 2018-5-31 19:06
下来看看。
作者: yht0816zdl    时间: 2018-6-14 15:34
好想下载啊  就是没钱。。。。。。
作者: ljaxff1314    时间: 2018-7-21 14:27
这个灯可以引用在键盘上么
作者: ljaxff1314    时间: 2018-7-21 14:28
这个灯可以应用在键盘上么
作者: 清枫    时间: 2018-9-6 19:45
好想下载下来,找半天了
作者: 无垠唔会    时间: 2018-9-13 09:29
可当做初学的基础示例
作者: ninghuchong    时间: 2018-9-17 18:29

可当做初学的基础示例
作者: JACK2008    时间: 2018-9-19 17:37
这个好像没有实现全彩飘动的效果吧?
作者: a15963254    时间: 2018-9-20 15:58
我下载下来看看
作者: dhii1234    时间: 2018-9-27 21:07
谢谢分享                                                               
作者: ZF0604    时间: 2018-10-7 00:09
void System_Init(void)
{
        BTN1=1;
        BTN2=1;

        //???INT0?ж?
        INT0 = 1;
    IT0 = 1;                  
    EX0 = 1;                          
INT1 = 1;
    IT1 = 1;                  
    EX1 = 1;                    //???INT1?ж?
}
作者: ZF0604    时间: 2018-10-7 00:10
搞了半天,还是不行
作者: ZF0604    时间: 2018-10-7 00:30
ZF0604 发表于 2018-10-7 00:09
void System_Init(void)
{
        BTN1=1;

INT0什么意思,各位大神
作者: rongshengju    时间: 2018-10-7 16:37
努力学习,谢谢!!!
作者: printy123    时间: 2018-10-8 16:15
我看资料都是0.35us 0.7us 的传输速度 是不是12T 单片机控制不了

作者: zhejiha    时间: 2018-10-8 16:56
太谢谢了 收藏了
作者: ZF0604    时间: 2018-10-9 20:32
ZF0604 发表于 2018-10-7 00:09
void System_Init(void)
{
        BTN1=1;

INT0应该改为IE0;INT1改为IE1
作者: chjx0131    时间: 2018-10-27 08:38
冒似还不错,容易看懂。
作者: fuxing27    时间: 2018-10-27 15:18
无法下载
作者: cns371    时间: 2018-11-4 12:53
ZF0604 发表于 2018-10-7 00:30
INT0什么意思,各位大神

单片机外部中断
作者: 小叶001    时间: 2018-11-16 10:52
printy123 发表于 2018-10-8 16:15
我看资料都是0.35us 0.7us 的传输速度 是不是12T 单片机控制不了

12T可以的,我用赛元单片机,就是12T,能不能用,具体看单片机的IO速度
作者: gwsdtc    时间: 2019-1-3 14:05
这个支持一下~~~~
作者: 8361acb    时间: 2019-1-8 19:47
好好学习 天天向上
作者: Sawardeakar    时间: 2019-1-18 23:42
学习学习!顶一下!
作者: user5448    时间: 2019-3-2 13:48
下載下來好好研究
作者: honour    时间: 2019-3-30 10:05
感谢大神分享下载来学习一下,谢谢
作者: lincolnplus    时间: 2019-5-12 09:46
资料好好
作者: pmsjzj    时间: 2019-5-24 13:09
好东西感谢分享
作者: chh543    时间: 2019-6-14 16:01
折腾了好久还是没实现功能
作者: chh543    时间: 2019-6-17 09:18
下载后怎么不能解压缩? 郁闷
作者: mychestnut    时间: 2019-6-26 20:38
正在调试2812,非常希望能参考一下。谢谢
作者: chenbin166    时间: 2019-7-4 19:28
共享资料的黑币奖励!
作者: z1234zz    时间: 2019-7-20 12:28

谢谢楼主!!!
作者: qq362151972    时间: 2019-7-20 18:11
可以免费下载吗
作者: runjiu    时间: 2019-8-8 22:39
感谢分享,努力学习!
作者: wasdqe    时间: 2019-9-17 19:27
怎么下载

作者: stone528    时间: 2019-10-14 11:37
看看这个怎么用
作者: witqyz    时间: 2019-11-6 09:10
好的。我也想看看。
作者: pxh316    时间: 2019-12-6 10:39
谢谢分享!
作者: zxn51love    时间: 2019-12-13 11:50
主要还是51单片机的,stm32没什么东西
作者: dake677    时间: 2020-5-10 07:45
牛逼,学习了
作者: 18896591119    时间: 2020-6-5 22:06
小白一枚,学习学习
作者: spark_z    时间: 2021-12-3 11:58
写的很好,感谢分享,找了好久这个资料。
作者: yygdzjs    时间: 2022-1-19 20:10
下载看了一下,还很全面,还不错.  谢谢分享!
作者: dragon19790000    时间: 2022-11-21 13:47
报错

*** ERROR: COMMAND-FILE 'RGB' NOT FOUND
作者: taxue    时间: 2022-11-22 21:50
刚买一个12位的WS2812灯环不知道怎么玩,正好下载学习谢谢楼主分享1
作者: hjwanan1    时间: 2023-7-31 15:28
主要是看不懂
作者: m182892    时间: 2023-8-28 18:31
Main.c(81): warning C182: pointer to different objects
作者: 小彤彤爱吃腰子    时间: 2023-8-30 19:57
ws2812还有其它驱动吗
作者: actftg    时间: 2023-8-31 21:59
好多警告怎么消除Main.c(56):
warning C182: pointer to different objects
作者: actftg    时间: 2023-9-4 20:14
好多警告怎么消除
作者: zg-chen    时间: 2023-11-16 09:53
您好,能做成音乐频谱仪?




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1