找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机驱动WS2812B灯演示程序

  [复制链接]
跳转到指定楼层
楼主
示例采用HC89S003F4单片机和7灯Ws2812灯带。HC89S003F4是1T增强型51单片机,如用其他51单片机,需调整晶振频率。示例仅进行7灯的单次驱动,可在声明和数组中改变灯珠数量和数据,主函数中修改后可实现流水灯效果。
/*
*HC89S003F4驱动WS2812彩灯演示(7只Led)
*CPU:HC89S003F4 16K bytes flash ROM, 256+256 bytes data RAM
*HC89S003F4是1T增强型51单片机,如用普通51单片机,晶振频率需增大
*/

  1. #define ALLOCATE_EXTERN
  2. #include "HC89S003F4.h"
  3. #include <intrins.h>

  4. #define WS2812_IO P2_2   //定义驱动引脚
  5. //xdata unsigned char col[21];
  6. //7只LED,共21个数据,每组GRB排列
  7. const unsigned char col[21] = {0x22,0x00,0x00,
  8.                                                            0x00,0x22,0x00,
  9.                                                            0x00,0x00,0x22,
  10.                                                            0x22,0x22,0x00,
  11.                                                            0x00,0x22,0x22,
  12.                                                            0x22,0x00,0x22,
  13.                                                            0x22,0x22,0x22,
  14.                                                            };


  15. void ws2812_rst(void)
  16. {        
  17.         u8 i;         //
  18.         WS2812_IO = 1;
  19.         i = 100; //           如果主频较高适当增加
  20.         while(i--);
  21.         WS2812_IO = 0;
  22.     i = 100; //           如果主频较高适当增加
  23.         while(i--);
  24. }

  25. void ws2812_write_byte( u8 dat)
  26. {        
  27.         u8 i = 8;
  28.         dat <<= 1;         //最高位进入CY
  29.         while(i)
  30.         {
  31.                  //高电平时间小于0.45uS为逻辑0,大于时为逻辑1
  32.                 WS2812_IO = 1;
  33.                 //如果主频较高可在此处适当增加_nop_();
  34.                 WS2812_IO = CY;
  35.                 //如果主频较高可在此处适当增加_nop_();
  36.                 _nop_();
  37.         WS2812_IO = 0;
  38.                 dat <<= 1;         //最高位进入CY
  39.                 i--;                        
  40.         }
  41. }

  42. /**************************************************************************************
  43. void main()
  44. {
  45.         unsigned char i;

  46. /************************************系统初始化****************************************/
  47.         WDTCCR = 0x00;                                                //关闭看门狗
  48.                                                 //本例程为方便测试关闭看门狗,实际使用中,建议客户打开看门狗,详见WDT复位例程
  49.         CLKSWR = 0x53;                                                //选择内部高频RC为系统时钟,内部高频RC 8分频,Fosc=4MHz
  50.         CLKDIV = 0x01;                                                //Fosc 1分频得到Fcpu,Fcpu=4MHz

  51.         P2M1 = P2M1&0xF0|0x08;                                //P22设置为推挽输出
  52.         
  53. /****以上为HC89S003F4单片机专用的SFR,普通单片机不用设置,但需提高晶振频率*****/

  54.         ws2812_rst();
  55.         for( i= 0; i< 21 ;i++)
  56.         {
  57.                 ws2812_write_byte( col[i]);
  58.         }
  59.         while(1){} ;
  60. }
复制代码

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:885138 发表于 2021-2-20 16:38 来自手机 | 只看该作者
效果图

JPEG_20210220_163457_.jpg (1.17 MB, 下载次数: 170)

JPEG_20210220_163457_.jpg

JPEG_20210220_163708_.jpg (705.44 KB, 下载次数: 170)

JPEG_20210220_163708_.jpg

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:885138 发表于 2021-2-21 18:28 来自手机 | 只看该作者
转发网友实验总结的WS2812B时序要求,供大家参考。

Screenshot_20210221-164434.jpg (257.48 KB, 下载次数: 185)

Screenshot_20210221-164434.jpg

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:390416 发表于 2021-2-22 20:05 | 只看该作者
回复

使用道具 举报

5#
ID:885879 发表于 2021-2-23 16:22 | 只看该作者
楼主你好,新手求教,灯带和单片机的接口该怎么连接呢?
回复

使用道具 举报

6#
ID:390416 发表于 2021-2-23 16:55 | 只看该作者
Levent 发表于 2021-2-23 16:22
楼主你好,新手求教,灯带和单片机的接口该怎么连接呢?

普通IO口 串联100欧电阻 连过去就行了  必须能够输出5V电平。不能3.3V
回复

使用道具 举报

7#
ID:885138 发表于 2021-2-24 00:07 来自手机 | 只看该作者
Levent 发表于 2021-2-23 16:22
楼主你好,新手求教,灯带和单片机的接口该怎么连接呢?

如图中实物连有三条线,两条是电源VCC GND,另一条是数据线。
电源可与单片机共用,灯珠数量多时最好单独供电,但要与单片机共地,电压5V(USB)至3.7V(锂电池)都可以,3.3V有点闪。每个(或每两个)灯珠的电源处要并一个小电容(0.1uF)。
单片机IO上拉输出或推挽输出,与灯带数据输入(DIN)间最好加一个小电阻(100欧)防冲击,实验时不加也可以。灯带还有个输出线DOUT,可以级联下一灯带的DIN。
单总线方式,驱动较简单,两种状态:复位(较长时间的低电平)或位传送。位0或位1取决于高电平脉宽,低电平宽度要求不高,小于复位就行。(三楼有具体说明)
应用挺方便的,动手试试。需要注意的是,因位传送时高电平的脉宽均在uS级以下,单片机频率要适当提高些。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

8#
ID:885138 发表于 2021-2-25 08:31 来自手机 | 只看该作者
Levent 发表于 2021-2-23 16:22
楼主你好,新手求教,灯带和单片机的接口该怎么连接呢?

我的另一个贴子里有普通51单片机驱动ws2812b的例子,对晶振频率要求低一些。参看http://www.51hei.com/bbs/forum.php?mod=viewthread&tid=202899&extra=page%3D1&mobile=no
回复

使用道具 举报

9#
ID:611155 发表于 2021-3-30 00:40 | 只看该作者
你的CY定义在哪里? 还有ws2812_write_byte 函数中 data<1逐个发送过程中,在while(i)里面怎么区分data的0,1? 如果是0,那么时间要小于0.45us,如果是1要大于0.45,这在函数中没有体现?
回复

使用道具 举报

10#
ID:885138 发表于 2021-3-30 09:20 来自手机 | 只看该作者
johnspen 发表于 2021-3-30 00:40
你的CY定义在哪里? 还有ws2812_write_byte 函数中 data

1,CY就是进位标志C,51单片机头文件中有定义,在C语言中用CY直接调用;
2,左移data后,最高位移入CY;
3,函数中,将CY值写至引脚的作用,CY=0比CY=1提前拉低,体现为高电平的脉宽变化。
回复

使用道具 举报

11#
ID:611155 发表于 2021-3-30 14:20 | 只看该作者
xxd0708 发表于 2021-3-30 09:20
1,CY就是进位标志C,51单片机头文件中有定义,在C语言中用CY直接调用;
2,左移data后,最高位移入CY; ...

哦,这个单片机没用过
回复

使用道具 举报

12#
ID:611155 发表于 2021-3-30 14:28 | 只看该作者
xxd0708 发表于 2021-3-30 09:20
1,CY就是进位标志C,51单片机头文件中有定义,在C语言中用CY直接调用;
2,左移data后,最高位移入CY; ...

虽然这个单片机没用过,我就大概猜一下逻辑,也就是说再while(i)里面,就先直接将IO口拉高,这里有一个时间,然后把CY(也就是左移后的高位给IO口),如果是1,那么就是高位持续了2个时间,如果是0,那么高位就持续了1个时间,如果WS2812_IO = 1;这个时间是0.45us,2个时间就是*2 =0.9us, 一个时间就是0.45us。
就是CY是1的话,就是高0.9us +_nop_();+WS2812_IO = 0;就是符合了W2812的时序
回复

使用道具 举报

13#
ID:920224 发表于 2021-5-12 19:16 | 只看该作者
8M4T的片子有方法驱动吗?楼主可以提供一下思路吗谢谢。
回复

使用道具 举报

14#
ID:885138 发表于 2021-5-13 07:00 来自手机 | 只看该作者
tungkin 发表于 2021-5-12 19:16
8M4T的片子有方法驱动吗?楼主可以提供一下思路吗谢谢。

8M4T每个指令周期0.5uS,置位或清零引脚为2个指令周期即1uS,显然不能直接驱动。但可以用RC电路延时解决,参看我的另一个贴子
回复

使用道具 举报

15#
ID:885138 发表于 2021-5-13 07:01 来自手机 | 只看该作者
xxd0708 发表于 2021-5-13 07:00
8M4T每个指令周期0.5uS,置位或清零引脚为2个指令周期即1uS,显然不能直接驱动。但可以用RC电路延时解决 ...

搜索“51单片机(12MHz@12T)驱动WS2812B”
回复

使用道具 举报

16#
ID:920224 发表于 2021-5-13 09:15 | 只看该作者
xxd0708 发表于 2021-5-13 07:01
搜索“51单片机(12MHz@12T)驱动WS2812B”

好的谢谢作者!
回复

使用道具 举报

17#
ID:991413 发表于 2021-12-12 21:20 | 只看该作者
xdata那里我用的时候他总说前面少了个分号,咋回事
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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