找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC15W204S单片机control ws2812B七彩流水灯程序(36灯)

  [复制链接]
跳转到指定楼层
楼主
1黑币
STC15W204S-SOP16郔苤炵苀啣-v1.0萇繚芞.pdf (23.23 KB, 下载次数: 228) 上次程序更新后,STC15W204s控制ws2812B七彩流水灯,发现一个问题,就是keil C编译时,灯数调整为37时,一直报错说内存超出,希望高手能指点迷津,现在将36灯程序分享给大家:

单片机源码:
  1. #include<stc15.h>
  2. #include"intrins.h"
  3. sbit WS2812 = P1^0;
  4. #define numLEDs 36  //灯的个数
  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 long 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()  [url=]//@22.1184MHz[/url]
  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位不拆分发
  97. void SetPixelColor(unsigned char num,unsigned long c)
  98. {
  99.     unsigned char i;
  100.        for(i=0;i<numLEDs;i++)
  101.     {
  102.        buf_R[num] = (unsigned char)(c>>16);
  103.      buf_G[num] = (unsigned char)(c>>8);
  104.      buf_B[num] = (unsigned char)(c);
  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 PixelUpdate()
  113. {
  114. RGB_Rst();
  115. }

  116. // Fill the dots one after the other with a color
  117. //用一种颜色填充这些圆点
  118. void colorWipe(unsigned long c, unsigned int wait)
  119. {
  120.   unsigned char i=0;
  121.   for( i=0; i<numLEDs; i++)
  122. {
  123.     SetPixelColor(i, c);
  124.     PixelUpdate();
  125.     HAL_Delay(wait*5);
  126.   }
  127. }
  128. //单灯流水
  129. void Watercolor(unsigned long c, unsigned int wait)
  130. {
  131.   unsigned char i=0;
  132.   for( i=0; i<numLEDs; i++)
  133. {
  134.     SetPixelColor(i, c);
  135.   PixelUpdate();
  136.     HAL_Delay(wait*5);
  137. SetPixelColor(i, 0);
  138.    PixelUpdate();
  139.     HAL_Delay(wait);
  140.   }
  141. }


  142. void main()
  143. {
  144.   while(1)
  145.   {   
  146.    
  147.       
  148.        colorWipe(0xff0000,1); //红色全亮
  149.       HAL_Delay(10000);
  150.        colorWipe(0xff00,1);  //绿色全亮
  151.      HAL_Delay(10000);
  152.        colorWipe(0xff,1);//蓝色全亮
  153.      HAL_Delay(10000);
  154.        colorWipe(0xffff00,1); //黄色全亮
  155.       HAL_Delay(10000);
  156.        colorWipe(0xffff,1); //青色全亮
  157.       HAL_Delay(10000);
  158.        colorWipe(0xff00ff,1); //紫色全亮
  159.       HAL_Delay(10000);
  160.        colorWipe(0xffffff,1); //白色全亮
  161.       HAL_Delay(10000);
  162.        colorWipe(0x00,1); //off
  163.       HAL_Delay(10000);
  164.         Watercolor(0xff0000, 100);//红色单灯流水
  165.       HAL_Delay(1000);
  166.      Watercolor(0xff00, 100);//绿色单灯流水
  167.       HAL_Delay(1000);
  168.      Watercolor(0xff, 100);//蓝色单灯流水
  169.       HAL_Delay(1000);
  170.      Watercolor(0xffff00, 100); //黄色单灯流水
  171.       HAL_Delay(1000);
  172.      Watercolor(0xffff, 100);//青色单灯流水
  173.       HAL_Delay(1000);
  174.      Watercolor(0xff00ff, 100); //紫色单灯流水
  175.       HAL_Delay(1000);
  176.      Watercolor(0xffffff, 100); //白色单灯流水
  177.       HAL_Delay(1000);
  178.       
  179.      colorWipe(0x00,1); //off
  180.       HAL_Delay(10000);
  181.      colorWipe(0xff0000,100); //红色逐个点亮
  182.       HAL_Delay(1000);
  183.      colorWipe(0x00,100); //0ff
  184.       HAL_Delay(1000);
  185.      colorWipe(0xff00,100);  //绿色逐个点亮
  186.       HAL_Delay(1000);
  187.      colorWipe(0x00,100); //0ff
  188.       HAL_Delay(1000);
  189.      colorWipe(0xff,100);//蓝色逐个点亮
  190.       HAL_Delay(1000);
  191.         colorWipe(0x00,100); //0ff
  192.       HAL_Delay(1000);
  193.         colorWipe(0xffff00,100); //黄色逐个点亮
  194.       HAL_Delay(1000);
  195.      colorWipe(0x00,100); //0ff
  196.       HAL_Delay(1000);
  197.      colorWipe(0xffff,100); //青色逐个点亮
  198.       HAL_Delay(1000);
  199.      colorWipe(0x00,100); //0ff
  200.       HAL_Delay(1000);
  201.      colorWipe(0xff00ff,100); //紫色逐个点亮
  202.       HAL_Delay(1000);
  203.       colorWipe(0x00,100); //0ff
  204.       HAL_Delay(1000);
  205.         colorWipe(0xffffff,100); //白色逐个点亮
  206.       HAL_Delay(1000);
  207.      colorWipe(0x00,100); //0ff
  208.        HAL_Delay(1000);


  209.       
  210.   }
  211. }
复制代码



setfrequence.jpg (247.03 KB, 下载次数: 141)

下载时STCisp设置频率

下载时STCisp设置频率

frequence.jpg (79.32 KB, 下载次数: 147)

keil设置频率

keil设置频率

fail.jpg (195.8 KB, 下载次数: 130)

设置37灯内存地址空间满

设置37灯内存地址空间满

fenweideng.rar

34.1 KB, 下载次数: 426, 下载积分: 黑币 -5

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:419125 发表于 2019-1-7 15:12 | 只看该作者
楼主 可以加个好友么  我也学STC15W204S
回复

使用道具 举报

板凳
ID:88049 发表于 2019-1-8 10:05 | 只看该作者
keil设置target options------memory Model 选择large:variables in XDATA再编译一遍试试
回复

使用道具 举报

地板
ID:439460 发表于 2019-1-10 05:23 来自手机 | 只看该作者
已经解unsigned char idata buf_R[numLEDs] = {0};//颜色缓存 unsigned char buf_G[numLEDs] = {0};//颜色缓unsigned char buf_B[numLEDs] = {0};//颜色缓存,这样修改最多可以点78颗灯,有兴趣的朋友可以试一试     
回复

使用道具 举报

5#
ID:439460 发表于 2019-1-10 05:25 来自手机 | 只看该作者
挚爱梅儿 发表于 2019-1-8 10:05
keil设置target options------memory Model 选择large:variables in XDATA再编译一遍试试

这样编译我试了,程序能编译能通过,下载单片机里一个灯都不亮,百度了一下说要加外部RAM
回复

使用道具 举报

6#
ID:439460 发表于 2019-1-10 05:26 来自手机 | 只看该作者
June1210 发表于 2019-1-7 15:12
楼主 可以加个好友么  我也学STC15W204S

可以啊,加我QQ 176492137
回复

使用道具 举报

7#
ID:238749 发表于 2019-2-20 12:51 | 只看该作者
你好,我发现这个程序只能亮ff的颜色,其余0-254的颜色无法显示哎
回复

使用道具 举报

8#
ID:375313 发表于 2019-2-21 21:33 | 只看该作者
陈小手43970 发表于 2019-2-20 12:51
你好,我发现这个程序只能亮ff的颜色,其余0-254的颜色无法显示哎

你的是不是也只亮白色
回复

使用道具 举报

9#
ID:406128 发表于 2019-3-28 11:25 | 只看该作者
老兄,你的头文件是对的,我的改了头文件就报错
回复

使用道具 举报

10#
ID:398994 发表于 2020-3-25 10:01 | 只看该作者
好东西
回复

使用道具 举报

11#
ID:311419 发表于 2020-3-25 10:57 | 只看该作者
晶振频率太低,要33M,我的可以用
回复

使用道具 举报

12#
ID:712612 发表于 2020-4-2 09:35 | 只看该作者
感谢楼主
回复

使用道具 举报

13#
ID:578423 发表于 2020-5-1 15:42 | 只看该作者
试程序要以用
回复

使用道具 举报

14#
ID:578423 发表于 2020-5-3 18:11 | 只看该作者
楼主,如果第一个灯亮后保持到第二个亮后也保持,第三个亮后也保持,这个怎写?太感谢了
回复

使用道具 举报

15#
ID:436758 发表于 2020-5-22 20:52 | 只看该作者
我都用台系类PIC的,16M 2T 一样的可以做到完美时序
回复

使用道具 举报

16#
ID:828768 发表于 2020-10-20 17:25 | 只看该作者
将idata改为xdata,可以128灯,我用STC15W4K32S4仿真可以成功

#define numLEDs 128  //灯的个数
unsigned char xdata buf_R[numLEDs] = {0};//颜色缓存
unsigned char xdata buf_G[numLEDs] = {0};
unsigned char xdata buf_B[numLEDs] = {0};

回复

使用道具 举报

17#
ID:79544 发表于 2021-3-23 09:59 | 只看该作者
yuren1984 发表于 2019-1-10 05:23
已经解unsigned char idata buf_R[numLEDs] = {0};//颜色缓存 unsigned char buf_G[numLEDs] = {0};//颜色 ...

感谢分享,学习啦。这样修改的确可以驱动60个灯珠
回复

使用道具 举报

18#
ID:79544 发表于 2021-3-23 11:35 | 只看该作者
bababibu 发表于 2020-10-20 17:25
将idata改为xdata,可以128灯,我用STC15W4K32S4仿真可以成功

#define numLEDs 128  //灯的个数
...

牛人!!!!!!!!!!!!!!!!
回复

使用道具 举报

19#
ID:468169 发表于 2021-6-16 18:54 来自手机 | 只看该作者
bababibu 发表于 2020-10-20 17:25
将idata改为xdata,可以128灯,我用STC15W4K32S4仿真可以成功

#define numLEDs 128  //灯的个数
...

如果要驱动1024个像素点呢?就时候1024个灯,市场上的可以做到,怎么修改……。
回复

使用道具 举报

20#
ID:509408 发表于 2021-7-10 14:02 | 只看该作者
nanyexin 发表于 2021-6-16 18:54
如果要驱动1024个像素点呢?就时候1024个灯,市场上的可以做到,怎么修改……。

算一下理论时间,数据手册上发送一个bit需要1.25us左右,一个RGB像素点24bit。共需要时间 1024*1.25*24 = 30720us,即光驱动这1024颗灯需要30ms以上,这个时间已经很长了。发送过程中还不能被其他任务打断。然后你的ram资源要足够 (1024*3个byte,即3kb以上,想实现复杂花样效果就要考虑算法、硬件设计,全亮这电源起码都60安的电流了) ,
回复

使用道具 举报

21#
ID:613016 发表于 2022-9-29 13:31 | 只看该作者
非常感谢,正好需要,我目前控制30灯珠
回复

使用道具 举报

22#
ID:688008 发表于 2022-10-3 14:14 | 只看该作者
mark一下,后面玩的时候再来看看
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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