找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 22790|回复: 53
收起左侧

WS2812源程序及相关资料(51单片机,stm32,arduino平台)

  [复制链接]
ID:309524 发表于 2018-4-16 19:49 | 显示全部楼层 |阅读模式
WS2812资料包(含51单片机,arduino平台与stm32的各种控制源码):
0.png 0.png

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

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

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

电路原理图如下:

0.jpg

源码:
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, 下载次数: 1142)

评分

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

查看全部评分

回复

使用道具 举报

ID:304386 发表于 2018-4-18 14:27 | 显示全部楼层
ws2812能调亮度么?
回复

使用道具 举报

ID:262988 发表于 2018-5-31 19:06 | 显示全部楼层
下来看看。
回复

使用道具 举报

ID:221003 发表于 2018-6-14 15:34 | 显示全部楼层
好想下载啊  就是没钱。。。。。。
回复

使用道具 举报

ID:376603 发表于 2018-7-21 14:27 | 显示全部楼层
这个灯可以引用在键盘上么
回复

使用道具 举报

ID:376603 发表于 2018-7-21 14:28 | 显示全部楼层
这个灯可以应用在键盘上么
回复

使用道具 举报

ID:394704 发表于 2018-9-6 19:45 | 显示全部楼层
好想下载下来,找半天了
回复

使用道具 举报

ID:397295 发表于 2018-9-13 09:29 | 显示全部楼层
可当做初学的基础示例
回复

使用道具 举报

ID:31770 发表于 2018-9-17 18:29 | 显示全部楼层

可当做初学的基础示例
回复

使用道具 举报

ID:383749 发表于 2018-9-19 17:37 | 显示全部楼层
这个好像没有实现全彩飘动的效果吧?
回复

使用道具 举报

ID:399627 发表于 2018-9-20 15:58 | 显示全部楼层
我下载下来看看
回复

使用道具 举报

ID:86020 发表于 2018-9-27 21:07 | 显示全部楼层
谢谢分享                                                               
回复

使用道具 举报

ID:279755 发表于 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?ж?
}
回复

使用道具 举报

ID:279755 发表于 2018-10-7 00:10 | 显示全部楼层
搞了半天,还是不行
回复

使用道具 举报

ID:279755 发表于 2018-10-7 00:30 | 显示全部楼层
ZF0604 发表于 2018-10-7 00:09
void System_Init(void)
{
        BTN1=1;

INT0什么意思,各位大神
回复

使用道具 举报

ID:111490 发表于 2018-10-7 16:37 | 显示全部楼层
努力学习,谢谢!!!
回复

使用道具 举报

ID:324847 发表于 2018-10-8 16:15 | 显示全部楼层
我看资料都是0.35us 0.7us 的传输速度 是不是12T 单片机控制不了
回复

使用道具 举报

ID:406615 发表于 2018-10-8 16:56 | 显示全部楼层
太谢谢了 收藏了
回复

使用道具 举报

ID:279755 发表于 2018-10-9 20:32 | 显示全部楼层
ZF0604 发表于 2018-10-7 00:09
void System_Init(void)
{
        BTN1=1;

INT0应该改为IE0;INT1改为IE1
回复

使用道具 举报

ID:127421 发表于 2018-10-27 08:38 | 显示全部楼层
冒似还不错,容易看懂。
回复

使用道具 举报

ID:389667 发表于 2018-10-27 15:18 | 显示全部楼层
无法下载
回复

使用道具 举报

ID:246741 发表于 2018-11-4 12:53 | 显示全部楼层
ZF0604 发表于 2018-10-7 00:30
INT0什么意思,各位大神

单片机外部中断
回复

使用道具 举报

ID:413742 发表于 2018-11-16 10:52 | 显示全部楼层
printy123 发表于 2018-10-8 16:15
我看资料都是0.35us 0.7us 的传输速度 是不是12T 单片机控制不了

12T可以的,我用赛元单片机,就是12T,能不能用,具体看单片机的IO速度
回复

使用道具 举报

ID:460919 发表于 2019-1-3 14:05 | 显示全部楼层
这个支持一下~~~~
回复

使用道具 举报

ID:91669 发表于 2019-1-8 19:47 | 显示全部楼层
好好学习 天天向上
回复

使用道具 举报

ID:469932 发表于 2019-1-18 23:42 | 显示全部楼层
学习学习!顶一下!
回复

使用道具 举报

ID:121806 发表于 2019-3-2 13:48 | 显示全部楼层
下載下來好好研究
回复

使用道具 举报

ID:385912 发表于 2019-3-30 10:05 | 显示全部楼层
感谢大神分享下载来学习一下,谢谢
回复

使用道具 举报

ID:499661 发表于 2019-5-12 09:46 | 显示全部楼层
资料好好
回复

使用道具 举报

ID:46475 发表于 2019-5-24 13:09 | 显示全部楼层
好东西感谢分享
回复

使用道具 举报

ID:561518 发表于 2019-6-14 16:01 | 显示全部楼层
折腾了好久还是没实现功能
回复

使用道具 举报

ID:561518 发表于 2019-6-17 09:18 | 显示全部楼层
下载后怎么不能解压缩? 郁闷
回复

使用道具 举报

ID:572907 发表于 2019-6-26 20:38 | 显示全部楼层
正在调试2812,非常希望能参考一下。谢谢
回复

使用道具 举报

ID:578082 发表于 2019-7-4 19:28 | 显示全部楼层
共享资料的黑币奖励!
回复

使用道具 举报

ID:136900 发表于 2019-7-20 12:28 | 显示全部楼层

谢谢楼主!!!
回复

使用道具 举报

ID:8708 发表于 2019-7-20 18:11 | 显示全部楼层
可以免费下载吗
回复

使用道具 举报

ID:103981 发表于 2019-8-8 22:39 | 显示全部楼层
感谢分享,努力学习!
回复

使用道具 举报

ID:612720 发表于 2019-9-17 19:27 | 显示全部楼层
怎么下载
回复

使用道具 举报

ID:90970 发表于 2019-10-14 11:37 | 显示全部楼层
看看这个怎么用
回复

使用道具 举报

ID:636442 发表于 2019-11-6 09:10 | 显示全部楼层
好的。我也想看看。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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