找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 24472|回复: 33
打印 上一主题 下一主题
收起左侧

单片机+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, 下载次数: 672)


评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏27 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:86020 发表于 2018-12-24 22:03 | 只看该作者
谢谢分享
回复

使用道具 举报

板凳
ID:86020 发表于 2018-12-24 22:04 | 只看该作者
谢谢分享
回复

使用道具 举报

地板
ID:454600 发表于 2018-12-25 17:13 | 只看该作者
学习下,感谢分享
回复

使用道具 举报

5#
ID:65956 发表于 2019-1-28 11:16 | 只看该作者
我没点亮,不知道是什么原因,我用的单片机是15W4K56S4,晶振22.1184M,不知道错在哪
回复

使用道具 举报

6#
ID:253945 发表于 2019-4-1 08:53 | 只看该作者
刚试了,代码没问题,注意灯的信号方向
回复

使用道具 举报

7#
ID:432307 发表于 2019-4-28 15:09 | 只看该作者
学习下,感谢分享
回复

使用道具 举报

8#
ID:243748 发表于 2019-4-29 05:02 来自手机 | 只看该作者
准备做一个玩下
回复

使用道具 举报

9#
ID:538984 发表于 2019-5-15 16:05 | 只看该作者
谢谢分享,拿来学习一下
回复

使用道具 举报

10#
ID:157166 发表于 2019-7-13 09:45 | 只看该作者
学习一下,谢谢
回复

使用道具 举报

11#
ID:196720 发表于 2019-7-13 11:25 | 只看该作者
谢谢分享,学习学习
回复

使用道具 举报

12#
ID:299054 发表于 2019-9-17 18:01 | 只看该作者
学习下,感谢分享
回复

使用道具 举报

13#
ID:385637 发表于 2019-9-28 10:25 | 只看该作者
有个地方没搞明白,绿色255*16 =4080 ,转换二进制就是111111110000,右移8位就是1111了,不因该是1111111100000000才对吗?
回复

使用道具 举报

14#
ID:170835 发表于 2019-11-17 23:28 | 只看该作者
记号,过几天研究一下
回复

使用道具 举报

15#
ID:652686 发表于 2020-1-1 15:52 | 只看该作者
正好想用WS2812B,学习一下。
回复

使用道具 举报

16#
ID:97300 发表于 2020-1-23 14:21 | 只看该作者
谢谢分享
回复

使用道具 举报

17#
ID:281113 发表于 2020-2-16 21:45 | 只看该作者
谢谢分享!!!
回复

使用道具 举报

18#
ID:214947 发表于 2020-5-27 20:35 | 只看该作者
不错啊
回复

使用道具 举报

19#
ID:809905 发表于 2020-11-1 13:45 | 只看该作者
学习了 感谢大佬出的教程
回复

使用道具 举报

20#
ID:791100 发表于 2020-11-9 10:39 | 只看该作者
楼主资料非常好,值得收藏,谢谢!
回复

使用道具 举报

21#
ID:103436 发表于 2020-11-20 09:54 | 只看该作者

非常实用值得学习,非常感谢
回复

使用道具 举报

22#
ID:735961 发表于 2020-11-22 20:35 | 只看该作者
资料编译错误几处
回复

使用道具 举报

23#
ID:735961 发表于 2020-11-22 20:36 | 只看该作者
aigo13428149596 发表于 2020-11-20 09:54
非常实用值得学习,非常感谢

我复制源代码编译有错误

回复

使用道具 举报

24#
ID:433219 发表于 2020-12-14 21:18 | 只看该作者
能不能把 视频 和 c51工程分开啊,18MB附件,下载了几次到15M左右就0kb下不了了
回复

使用道具 举报

25#
ID:823677 发表于 2021-2-25 09:52 | 只看该作者
很奇怪,蓝色+绿色,红+绿+蓝=白色为什么显示不出?
回复

使用道具 举报

26#
ID:156220 发表于 2021-2-26 15:42 | 只看该作者

楼主资料非常好,正在学习,谢谢!
回复

使用道具 举报

27#
ID:190075 发表于 2021-5-30 11:23 | 只看该作者
有没有颜色表?
回复

使用道具 举报

28#
ID:190075 发表于 2021-6-1 16:28 | 只看该作者
aking991 发表于 2019-1-28 11:16
我没点亮,不知道是什么原因,我用的单片机是15W4K56S4,晶振22.1184M,不知道错在哪

信号脚有没有对上
回复

使用道具 举报

29#
ID:856401 发表于 2021-6-29 20:32 来自手机 | 只看该作者
某一个宝上花了0.150元买了一个灯,搞一下
回复

使用道具 举报

30#
ID:856401 发表于 2021-6-30 13:57 来自手机 | 只看该作者
楼主,要具体的第几个灯亮什么颜色怎么操作?
回复

使用道具 举报

31#
ID:399179 发表于 2021-12-14 21:59 来自手机 | 只看该作者
3486635230 发表于 2021-6-30 13:57
楼主,要具体的第几个灯亮什么颜色怎么操作?

同问!我也在研究这个问题,怎奈全是自学的,研究不透啊!
回复

使用道具 举报

32#
ID:962202 发表于 2022-1-14 10:57 | 只看该作者
谢楼主分享了,拿下参考参考!
回复

使用道具 举报

33#
ID:284050 发表于 2022-6-27 21:52 | 只看该作者
为什么colorWipe(255*32*1024,1000)是红色呢
回复

使用道具 举报

34#
ID:504289 发表于 2022-8-26 11:08 | 只看该作者
33M晶振可以使用吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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