切换到宽版
  • 107370阅读
  • 30回复

[C51]STC15W204S驱动RGB灯带,实现流水灯效果(开源) [复制链接]

上一主题 下一主题
离线jjbboox
 

发帖
808
M币
4210
专家
13
粉丝
49
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2018-04-07
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()_的个数,直到能正确驱动灯条为止。
先通过视频看看实际运行的效果。重新做了个视频,欢迎点击观看。
flash: http://player.youku.com/player.php/sid/XMzUyMzg3MjQ4NA==/v.swf


以下是开源的代码,全部工程只有一个.c文件,新建工程后将该文件添加到工程中即可。
编译后也就在1.3K左右,剩余的ROM空间还可以扩展做一些动态效果什么的。
  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.         _p = &_p_list[_p->next_pixel];
  116.     }
  117.     reset();
  118. }









直接上硬货,ws2812驱动深度分析:http://bbs.mydigit.cn/read.php?tid=2622343
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共1条打赏 ,M币+8
jmkl128 M币 +8 優秀文章 2018-04-08
离线elecfunwb

发帖
1539
M币
4506
专家
8
粉丝
16
只看该作者 1楼 发表于: 2018-04-07
请登录后查看
离线毁灭者e5

发帖
1040
M币
9
专家
3
粉丝
38
只看该作者 2楼 发表于: 2018-04-07
请登录后查看
离线jjbboox

发帖
808
M币
4210
专家
13
粉丝
49
只看该作者 3楼 发表于: 2018-04-07
回 elecfunwb 的帖子
请登录后查看
离线jjbboox

发帖
808
M币
4210
专家
13
粉丝
49
只看该作者 4楼 发表于: 2018-04-07
回 毁灭者e5 的帖子
请登录后查看
离线毁灭者e5

发帖
1040
M币
9
专家
3
粉丝
38
只看该作者 5楼 发表于: 2018-04-07
回 jjbboox 的帖子
请登录后查看
离线jjbboox

发帖
808
M币
4210
专家
13
粉丝
49
只看该作者 6楼 发表于: 2018-04-07
回 毁灭者e5 的帖子
请登录后查看
离线szryg

发帖
64
M币
45
专家
1
粉丝
6
只看该作者 7楼 发表于: 2018-04-07
回 jjbboox 的帖子
请登录后查看
离线jjbboox

发帖
808
M币
4210
专家
13
粉丝
49
只看该作者 8楼 发表于: 2018-04-08
回 szryg 的帖子
请登录后查看
离线qvchat

发帖
8
M币
296
专家
0
粉丝
2
只看该作者 9楼 发表于: 2018-04-08
请登录后查看
快速回复
限80 字节
温馨提示:欢迎交流讨论,请勿发布纯表情、纯引用等灌水帖子;以免被删除
 
上一个 下一个