之前网上找的WS2812驱动很少并且代码很混乱。国庆闲来无事,自己写了一下WS2812的驱动程序,不多说什么,反正好用;我这总共驱动的是两条一米60灯再加1个环形8灯共128灯完全没毛病,速度还是非常快的,下图为证。单片机是STC15的,试了很多型号都没毛病,1T的单片机似乎都可以,其实个人认为WS2812的时序并没有手册上说的那么严格,实际使用时也很轻松就实现了!分享给有需要的朋友,只是简单的驱动测试,喜欢什么花样还请自由发挥,哈哈!
制作出来的实物图如下:
/***WS2812驱动程序***/
/*作者:YUAN HUA FEI*/
#include<STC15.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define num 128//灯泡个数
sbit DO=P3^2;//数据输出口口
void delay1us()
{
unsigned char a;
for(a=3;a>0;a--);
}
void delays(uint m)
{
uchar i,j;
while(--m)
{
for(i=6;i>0;i--)
for(j=250;j>0;j--);
}
}
/**目前测试STC15系列9~30MHz整得成**/
/**适当调整_NOP_(),最低8MHz也整得成***/
/*调整Re、Gr、Bl的比例可搭配出各种颜色*/
/********0~255,共256级亮度 *********/
/*****调整数字大小可调整色调及亮度*****/
//括号内分别代表(红、绿、蓝)数据
void WS2812WR(uchar Re,uchar Gr,uchar Bl)
{
uchar color=3,dat,i=8;
DO=0;
//依次输出24bit GRB数据
while(color--)
{
if(color==2)dat=Gr;
if(color==1)dat=Re;
if(color==0)dat=Bl;
while(i--)
{
if(dat & 0X80)//写1
{
DO=1;delay1us();
DO=0;_nop_();
}
else //写0
{
DO=1;_nop_();
DO=0;delay1us();
}
dat <<= 1;
}
i=8;
}
}
余下可下载附件查看。。。
全部资料51hei下载地址:
WS2812.zip
(32.67 KB, 下载次数: 1118)
|