一、WS2812B简介
WS2812B,是一款内置IC的RGB三色LED. 简单说,就是给它供电和数据,它就能按要求显示. 多顆燈珠還能通手牽手的方式连起来,只通过1个I/O口,控制多颗灯珠.
WS2812B共4个引脚: VCC,GND,VI,VO.
- VCC和GND为电源的正负极(5V直流电供电).
- VI为数据输入引脚(用于接受单片机的数据);
- VO为数据输出引脚(多个WS2812B时使用);
二、模块原理图与实物
这里我使用的8颗灯的条形模块


原理图只画出3颗LED,实际原理都是相同的; 每颗LED的DI接上一颗的DO,如此重复.
三、模块接线
| STC8开发板 | WS2812B |
|---|---|
| VCC | VCC |
| GND | GND |
| P3.3 | IN |

四、关键代码
- main.c
#include "stc8.h"
#include "WS28.h"
void DelayMs(int t); //@24MHz
void main()
{
unsigned char bright= 0xFF;//定义亮度值
WS28_Init(); //引脚初始化
while (1)
{
WS28_Reset();
WS28_SetRGB(bright,0,0); //点亮第1颗灯 红色
WS28_SetRGB(0,bright,0); //
WS28_SetRGB(0,0,bright);
WS28_Reset();
DelayMs(100); //延时100ms
}
}
- WS2812.h
#include <intrins.h>
#define WS28_PIN P33//引脚定义
//初始化引脚
void WS28_Init()
{
//引脚P33初始化为输出
P3M0 |= 0x08;
P3M1 &= 0xF7;
}
//模块复位
void WS28_Reset()
{
unsigned char i=200;
//引脚拉低,然后延时一段时间
WS28_PIN = 0;
do
{
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
}while(i--);
}
//模块写入一组数据
void WS28_SetRGB(unsigned char r_data,//红色
unsigned char g_data,//绿色
unsigned char b_data)//蓝色
{
unsigned char temp[3];
unsigned char n,j;
unsigned char dat;
//注意顺序,按照数据手册为grb顺序排列
temp[0]= g_data;
temp[1]= r_data;
temp[2]= b_data;
for(n=0;n<3;n++)//循环3次(发送一组 rgb 颜色数据)
{
dat = temp[n];
for(j=0;j<8;j++)//循环8次(发送1byte数据)
{
if(dat &0x80) //写入数据1
{
WS28_PIN = 1;
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
WS28_PIN = 0;
_nop_();_nop_();_nop_();_nop_();_nop_();
dat = dat<<1;
}
else//写入数据0
{
WS28_PIN = 1;
_nop_();
_nop_();
WS28_PIN = 0;
_nop_();
_nop_();
dat = dat<<1;
}
}
}
}
完整的工程请在 文末下载
五、注意事项
5.1 Keil工程的設置
-
Keil需要选择对应的单片机型号


-
关闭优化功能为Level0(避免编译器过度优化,导致时序不正确)

5.2 代码编程
- 需要**#include “stc8.h”**
- 使用_nop_()函数前,需要**#include “intrins.h”**
- 根据主时钟频率,调整延时函数的数量
– STC8G1K08A最高支持35MHz
– 这里使用24MHz - 使用下载时,注意选择型号并配置时钟频率 (如下图)

5.2 程序调试
使用逻辑分析仪(也可以用示波器),检查VI引脚的输出信号.
- 因为只有高低电平,这里就使用逻辑分析仪;
- 使用游标功能,能测量出高低电平的长度是否符合要求;
- 添加协议解析后,方便解析出数据并检查比较.


5.3 实验结果
总结与拓展
- 实现了多个WS2812B的串联控制
- 实际测试中,发现有电平时间不太正确;知道怎样解决的老大麻烦留言指导一下
- 以后可以将多个WS2812B按阵列的方式排布,作为点阵使用
242





