标题: 单片机+WS2812B简单三色切换流水程序+视频分享 [打印本页]

作者: yuren1984    时间: 2018-12-9 19:31
标题: 单片机+WS2812B简单三色切换流水程序+视频分享
采用STC15W204S最小系统板,采用P1.0口做输出接灯板DIN,编译时需要加入stc15.h头文件
制作出来的实物图如下:


视频演示:


单片机源码:
  1. #include<stc15.h>
  2. #include"intrins.h"

  3. sbit WS2812 = P1^0;
  4. #define numLEDs 22   //灯的个数
  5. unsigned char buf_R[numLEDs] = {0};//颜色缓存
  6. unsigned char buf_G[numLEDs] = {0};
  7. unsigned char buf_B[numLEDs] = {0};

  8. void RGB_Set_Up();  //送0码
  9. void RGB_Set_Down(); //送1码

  10. void HAL_Delay(unsigned int t)
  11. {
  12.                   unsigned int x,y;
  13.                   for(x=114;x>0;x--)
  14.           for(y=t;y>0;y--);
  15. }

  16.    //复位延时
  17. void Delay50us()                //@22.1184MHz
  18. {
  19.         unsigned char i, j;

  20.         _nop_();
  21.         _nop_();
  22.         i = 2;
  23.         j = 15;
  24.         do
  25.         {
  26.                 while (--j);
  27.         } while (--i);
  28. }
  29. //1码,高电平850ns 低电平400ns 误差正负150ns
  30. void RGB_Set_Up()
  31. {
  32.                 WS2812 = 1;
  33.           //经过逻辑分析仪调试的的延时
  34.                 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
  35.           _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
  36.                 WS2812 = 0;
  37. }
  38. //1码,高电平400ns 低电平850ns 误差正负150ns
  39. void RGB_Set_Down()
  40. {
  41.    WS2812 = 1;
  42.           //经过逻辑分析仪调试的的延时
  43.                 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();  
  44.                 WS2812 = 0;
  45. }

  46. //发送24位数据
  47. void Send_2812_24bits(unsigned char G8,unsigned char R8,unsigned char B8)
  48. {
  49.                    unsigned int n = 0;
  50.                    //发送G8位
  51.                   for(n=0;n<8;n++)
  52.                   {
  53.                       G8<<=n;
  54.                           if(G8&0x80 == 0x80)
  55.                           {
  56.                              RGB_Set_Up();
  57.                           }
  58.                           else
  59.                           {
  60.                             RGB_Set_Down();
  61.                           }
  62.                   }
  63.                   //发送R8位
  64.                   for(n=0;n<8;n++)
  65.                   {
  66.                       R8<<=n;
  67.                           if(R8&0x80 == 0x80)
  68.                           {
  69.                              RGB_Set_Up();
  70.                           }
  71.                           else
  72.                           {
  73.                             RGB_Set_Down();
  74.                           }
  75.                   }
  76.                         //发送B8位
  77.                     for(n=0;n<8;n++)
  78.                   {
  79.                       B8<<=n;
  80.                           if(B8&0x80 == 0x80)
  81.                           {
  82.                              RGB_Set_Up();
  83.                           }
  84.                           else
  85.                           {
  86.                             RGB_Set_Down();
  87.                            }
  88.                   }
  89. }                 
  90. //复位码
  91. void RGB_Rst()
  92. {
  93.             WS2812 = 0;
  94.           Delay50us();
  95. }
  96. //把24位数据GRB码转RGB
  97. void Set_Colour(unsigned char r,unsigned char g,unsigned char b)
  98. {
  99.             unsigned char i;
  100.           for(i=0;i<numLEDs;i++)
  101.           {
  102.              buf_R[i] = r; //缓冲
  103.                  buf_G[i] = g;
  104.                  buf_B[i] = b;
  105.           }
  106.            for(i=0;i<numLEDs;i++)
  107.            {
  108.               Send_2812_24bits(buf_G[i],buf_R[i],buf_B[i]);//发送显示
  109.            }
  110. }
  111. //某一个点显示的颜色
  112. void SetPointColour(unsigned int num,unsigned char r,unsigned char g,unsigned char b)
  113. {
  114.             unsigned char i;
  115.            for(i=0;i<numLEDs;i++)
  116.            {
  117.               buf_R[num] = r;//缓冲
  118.                    buf_G[num] = g;
  119.                    buf_B[num] = b;
  120.            }
  121.        for(i=0;i<numLEDs;i++)
  122.            {
  123.               Send_2812_24bits(buf_G[i],buf_R[i],buf_B[i]);//发送显示

  124.            }
  125. }

  126. //颜色交换24位不拆分发

  127. void SetPixelColor(unsigned char num,unsigned long c)
  128. {
  129.            unsigned char i;
  130.        for(i=0;i<numLEDs;i++)
  131.            {
  132.               buf_R[num] = (unsigned char)(c>>16);
  133.                           buf_G[num] = (unsigned char)(c>>8);
  134.                           buf_B[num] = (unsigned char)(c);
  135.            }

  136.                  for(i=0;i<numLEDs;i++)
  137.                 {
  138.                         Send_2812_24bits(buf_G[i],buf_R[i],buf_B[i]);
  139.                 }

  140. }

  141. //复位
  142. void PixelUpdate()
  143. {
  144.         RGB_Rst();
  145. }


  146. // Fill the dots one after the other with a color
  147. //用一种颜色填充这些圆点
  148. void colorWipe(unsigned long c, unsigned int wait)
  149. {
  150.   unsigned int i=0;
  151.   for( i=0; i<numLEDs; i++)
  152.         {
  153.     SetPixelColor(i, c);
  154.     PixelUpdate();
  155.     HAL_Delay(wait);
  156.   }

  157. }

  158. void main()
  159. {
  160.                 while(1)
  161.                 {         
  162.                         
  163.                               colorWipe(255*32*1024,1000);//红色
  164.                                    colorWipe(0,1000);
  165.                                   colorWipe(255*16,1000);         //绿色
  166.                                         colorWipe(0,1000);
  167.                                   colorWipe(255,1000);//蓝色
  168.                                    colorWipe(0,1000);
  169.                                    colorWipe(255*32*1024+255*16,1000);//红色+绿色
  170.                                    colorWipe(0,1000);
  171.                                    colorWipe(255*32*1024+255,1000);//红色+蓝色
  172.                                    colorWipe(0,1000);
  173.                                    colorWipe(255*16+255,1000);        //绿色+蓝色
  174.                                         colorWipe(0,1000);
  175.                                         colorWipe(255*32*1024+255*16+255,1000);        //红色+绿色+蓝色
  176.                                         colorWipe(0,1000);
  177.                                         colorWipe(255*32*1024,100);        //红色
  178.                                          HAL_Delay(10000);
  179.                                         colorWipe(255*16,100);         //绿色
  180.                                         HAL_Delay(10000);
  181.                                         colorWipe(255,100);//蓝色
  182.                                         HAL_Delay(10000);
  183.                                    colorWipe(255*32*1024+255*16,100);//红色+绿色
  184.                                    HAL_Delay(10000);
  185. …………
  186. …………
  187. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

全部资料51hei下载地址:
ws2812三色切换.rar (18.4 MB, 下载次数: 691)



作者: dhii1234    时间: 2018-12-24 22:03
谢谢分享
作者: dhii1234    时间: 2018-12-24 22:04
谢谢分享
作者: LitteR0517    时间: 2018-12-25 17:13
学习下,感谢分享
作者: aking991    时间: 2019-1-28 11:16
我没点亮,不知道是什么原因,我用的单片机是15W4K56S4,晶振22.1184M,不知道错在哪
作者: 索隆333    时间: 2019-4-1 08:53
刚试了,代码没问题,注意灯的信号方向
作者: 525215455    时间: 2019-4-28 15:09
学习下,感谢分享
作者: wuxishun    时间: 2019-4-29 05:02
准备做一个玩下
作者: ytyt100    时间: 2019-5-15 16:05
谢谢分享,拿来学习一下
作者: lukeyou    时间: 2019-7-13 09:45
学习一下,谢谢
作者: quest_smt    时间: 2019-7-13 11:25
谢谢分享,学习学习
作者: pxh316    时间: 2019-9-17 18:01
学习下,感谢分享
作者: shenyuqiu    时间: 2019-9-28 10:25
有个地方没搞明白,绿色255*16 =4080 ,转换二进制就是111111110000,右移8位就是1111了,不因该是1111111100000000才对吗?
作者: widkzdwitm    时间: 2019-11-17 23:28
记号,过几天研究一下
作者: luojie111    时间: 2020-1-1 15:52
正好想用WS2812B,学习一下。
作者: pkwong    时间: 2020-1-23 14:21
谢谢分享
作者: 张明211    时间: 2020-2-16 21:45
谢谢分享!!!
作者: xuelilin    时间: 2020-5-27 20:35
不错啊
作者: q15577909642    时间: 2020-11-1 13:45
学习了 感谢大佬出的教程
作者: King23    时间: 2020-11-9 10:39
楼主资料非常好,值得收藏,谢谢!
作者: aigo13428149596    时间: 2020-11-20 09:54

非常实用值得学习,非常感谢
作者: 中山-灯带-曹    时间: 2020-11-22 20:35
资料编译错误几处
作者: 中山-灯带-曹    时间: 2020-11-22 20:36
aigo13428149596 发表于 2020-11-20 09:54
非常实用值得学习,非常感谢

我复制源代码编译有错误


作者: wkman    时间: 2020-12-14 21:18
能不能把 视频 和 c51工程分开啊,18MB附件,下载了几次到15M左右就0kb下不了了
作者: dpj888888    时间: 2021-2-25 09:52
很奇怪,蓝色+绿色,红+绿+蓝=白色为什么显示不出?
作者: 紫色的云    时间: 2021-2-26 15:42

楼主资料非常好,正在学习,谢谢!
作者: a8619300    时间: 2021-5-30 11:23
有没有颜色表?
作者: a8619300    时间: 2021-6-1 16:28
aking991 发表于 2019-1-28 11:16
我没点亮,不知道是什么原因,我用的单片机是15W4K56S4,晶振22.1184M,不知道错在哪

信号脚有没有对上

作者: 3486635230    时间: 2021-6-29 20:32
某一个宝上花了0.150元买了一个灯,搞一下
作者: 3486635230    时间: 2021-6-30 13:57
楼主,要具体的第几个灯亮什么颜色怎么操作?
作者: 快乐眼泪    时间: 2021-12-14 21:59
3486635230 发表于 2021-6-30 13:57
楼主,要具体的第几个灯亮什么颜色怎么操作?

同问!我也在研究这个问题,怎奈全是自学的,研究不透啊!
作者: sd3114336    时间: 2022-1-14 10:57
谢楼主分享了,拿下参考参考!
作者: 川人在柳    时间: 2022-6-27 21:52
为什么colorWipe(255*32*1024,1000)是红色呢
作者: FREEDOG    时间: 2022-8-26 11:08
33M晶振可以使用吗
作者: dianzifashaoyou    时间: 2025-1-8 11:31
不错我用这个成功 22.1184




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