找回密码
 立即注册

QQ登录

只需一步,快速开始

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

炫酷ws2812流水灯好看又简单 附单片机源码

  [复制链接]
跳转到指定楼层
楼主
ID:237567 发表于 2018-9-24 04:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STC15W204是8PIN的宽电压版,驱动WS2812的时候单片机可以用5V电压,也可以用3.3V的电源。
RGB灯条的电源应该是4-7V之间,目前驱动的是8颗粒的灯条,原则上应该可以驱动更多颗粒的,不过手头没有那么长的,没试过,有兴趣的朋友可以自己试验,看看最多可以驱动多少个。按理论来讲驱动8颗和80颗应该是一样的。
硬件环境:
单片机:STC15W204S(SOP8)
灯带:WS2812(8颗粒)
非必需品:开关,USB转接板,面包板,跳线若干。
使用片内R/C振荡器,连外部晶振都不需要,工作频率为11.0592MHz
STC15W204S可以用其他其他STC 1T的MCU。
代码也非常简单,只用到1个IO口,不需要进行任何初始化。
如果使用其他工作频率时,请相应调整DELAY_LONG和DELAY_SHORT的宏定义,适当增减_nop()_的个数,直到能正确驱动灯条为止。

单片机源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>

  3. // 使用的IO口,无需初始化
  4. sbit        DOUT = P3^3;

  5. #define        DELAY_LONG        {_nop_();_nop_();_nop_();}
  6. #define DELAY_SHORT        {_nop_();_nop_();}

  7. #define SEND_1        {DOUT=1;DELAY_LONG;DOUT=0;DELAY_SHORT;}
  8. #define SEND_0        {DOUT=1;DELAY_SHORT;DOUT=0;DELAY_LONG;}
  9. #define SEND_BIT(x) {if(x) {SEND_1;} else {SEND_0;}}

  10. // WS2812灯带颗粒数
  11. #define        PIXEL_CNT                (8)

  12. // RGB颗粒结构
  13. typedef struct {
  14.         unsigned int        next_pixel;                // 下一颗粒的index
  15.         unsigned char green;                                // 绿色值
  16.         unsigned char red;                                        // 红色值
  17.         unsigned char blue;                                        // 蓝色值
  18.         unsigned char brightness;                // 亮度值
  19. } Pixel;

  20. void send_p(Pixel _p);                                // 发送1个颗粒的值
  21. void send_pixels(Pixel *_p_list, unsigned int _start, unsigned int _cnt);                // 发送所有颗粒的值

  22. // 各颗粒值的初始值
  23. Pixel pixels[PIXEL_CNT] = {
  24. {1, 31, 255, 127, 255},
  25. {2, 31, 255, 127, 127},
  26. {3, 31, 255, 127, 31},
  27. {4, 31, 255, 127, 7},
  28. {5, 31, 255, 127, 1},
  29. {6, 31, 255, 127, 0},
  30. {7, 31, 255, 127, 0},
  31. {0, 31, 255, 127, 0},
  32. };

  33. // 通用计数器
  34. unsigned int cnt = 0;

  35. // 指定毫秒数Delay
  36. void delay_ms(unsigned int x)                //@11.0592MHz
  37. {
  38.         unsigned char i, j;

  39.         do {
  40.                 _nop_();
  41.                 _nop_();
  42.                 _nop_();
  43.                 i = 11;
  44.                 j = 190;
  45.                 do
  46.                 {
  47.                         while (--j);
  48.                 } while (--i);
  49.         } while (--x);
  50. }

  51. // 主函数
  52. void main() {
  53.         // 初始化段
  54.         
  55.         // 循环处理段
  56.         while(1) {
  57.                 // 等待50ms
  58.                 delay_ms(50);
  59.                 cnt %= 0x100;
  60.                 send_pixels(pixels, cnt % PIXEL_CNT, PIXEL_CNT);
  61.                 cnt++;
  62.         }        
  63. }

  64. void Delay50us()                //@11.0592MHz
  65. {
  66.         unsigned char i, j;

  67.         _nop_();
  68.         i = 1;
  69.         j = 134;
  70.         do
  71.         {
  72.                 while (--j);
  73.         } while (--i);
  74. }

  75. // RESET信号
  76. void reset() {
  77.         DOUT = 0;
  78.         Delay50us();
  79. }

  80. void send_p(Pixel _p) {
  81.         unsigned char p_v;
  82.         p_v = (_p.green * _p.brightness) >> 8;
  83.         SEND_BIT(p_v & 0x80);
  84.         SEND_BIT(p_v & 0x40);
  85.         SEND_BIT(p_v & 0x20);
  86.         SEND_BIT(p_v & 0x10);
  87.         SEND_BIT(p_v & 0x08);
  88.         SEND_BIT(p_v & 0x04);
  89.         SEND_BIT(p_v & 0x02);
  90.         SEND_BIT(p_v & 0x01);
  91.         p_v = (_p.red * _p.brightness) >> 8;
  92.         SEND_BIT(p_v & 0x80);
  93.         SEND_BIT(p_v & 0x40);
  94.         SEND_BIT(p_v & 0x20);
  95.         SEND_BIT(p_v & 0x10);
  96.         SEND_BIT(p_v & 0x08);
  97.         SEND_BIT(p_v & 0x04);
  98.         SEND_BIT(p_v & 0x02);
  99.         SEND_BIT(p_v & 0x01);
  100.         p_v = (_p.blue * _p.brightness) >> 8;
  101.         SEND_BIT(p_v & 0x80);
  102.         SEND_BIT(p_v & 0x40);
  103.         SEND_BIT(p_v & 0x20);
  104.         SEND_BIT(p_v & 0x10);
  105.         SEND_BIT(p_v & 0x08);
  106.         SEND_BIT(p_v & 0x04);
  107.         SEND_BIT(p_v & 0x02);
  108.         SEND_BIT(p_v & 0x01);
  109. }

  110. void send_pixels(Pixel *_p_list, unsigned int _start, unsigned int _cnt) {
  111.         Pixel *_p = &_p_list[_start % _cnt];
  112.         reset();
  113.         while(_cnt--) {
  114.                 send_p(*_p);
  115. ……………………

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

所有资料51hei提供下载:
WS2812B.zipWS2812B.zip (29.26 KB, 下载次数: 453)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:86020 发表于 2018-9-27 21:11 | 只看该作者
谢谢分享,学习学习
回复

使用道具 举报

板凳
ID:324847 发表于 2018-10-8 16:16 | 只看该作者
是不是不能用12T单片机
回复

使用道具 举报

地板
ID:399179 发表于 2018-10-8 19:34 来自手机 | 只看该作者
谢谢楼主分享!!!
回复

使用道具 举报

5#
ID:348669 发表于 2018-10-19 17:25 | 只看该作者
感谢感谢
回复

使用道具 举报

6#
ID:413997 发表于 2018-10-23 13:49 | 只看该作者
这个怎么用的
回复

使用道具 举报

7#
ID:413997 发表于 2018-10-23 13:50 | 只看该作者
感谢楼主,能详细点吗
回复

使用道具 举报

8#
ID:373838 发表于 2018-11-16 11:02 | 只看该作者
你试过这个程序没有
我试了,完全不受控制 只是亮了
回复

使用道具 举报

9#
ID:439460 发表于 2018-12-5 20:56 | 只看该作者
这个程序只能点亮8个灯,不能实现流水切换颜色的吗?
回复

使用道具 举报

10#
ID:439460 发表于 2018-12-6 14:41 来自手机 | 只看该作者
这个程序要怎么调才能切换颜色啊?
回复

使用道具 举报

11#
ID:439460 发表于 2018-12-6 14:51 来自手机 | 只看该作者
多多只能点亮17个灯,所有灯还不受控制啊
回复

使用道具 举报

12#
ID:586577 发表于 2019-7-18 20:18 | 只看该作者
新手看看
回复

使用道具 举报

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

使用道具 举报

14#
ID:444661 发表于 2019-10-31 07:38 | 只看该作者
就是看看 。。。。达到
回复

使用道具 举报

15#
ID:632514 发表于 2019-10-31 10:50 | 只看该作者

谢谢楼主分享!!!想下载新手没有币
回复

使用道具 举报

16#
ID:243748 发表于 2019-12-13 13:45 来自手机 | 只看该作者
我也说一句想整个车灯
回复

使用道具 举报

17#
ID:610004 发表于 2020-3-15 16:45 | 只看该作者
调节亮度的那个函数,怎么理解?
回复

使用道具 举报

18#
ID:150532 发表于 2020-4-30 15:01 | 只看该作者
谢谢,刚好可以用来做设计
回复

使用道具 举报

19#
ID:830745 发表于 2020-10-16 16:10 | 只看该作者
最近在用这个RGB灯,刚好找到这里,谢谢分享
回复

使用道具 举报

20#
ID:947624 发表于 2021-7-1 08:54 | 只看该作者
亮度值你是怎么增减的?
回复

使用道具 举报

21#
ID:88256 发表于 2021-9-4 00:20 | 只看该作者
下载一个捡现成的程序
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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