51驱动WS2812B

51驱动WS2812B三色流水灯

WS2812简介

模组选型

关于WS2812的时序解析

发送数据格式解析

部分代码

功能现象

总结

WS2812简介

WS2812B-2020是一个集控制电路与发光电路于一体的智能外控LED光源;其外型采用最新的molding封装工艺,将IC与发光芯片封装在一个2020的封装尺寸中,每个元件即为一个像素点;像素点内部包含了智能数字接口数据锁存信号整形放大驱动电路,还包含有高精度的内部振荡器和可编程定电流控制部分,有效保证了像素点光的颜色高度一致。下图为我所采用的25位的WS2812B RGB LED开发板。



模组选型

主控方面选择STC15系列的STC15W204S,这是一款只有8个引脚的高性能单片机,相对于传统的8051他的时钟速度更快,外围电路不需要太多内部集成了ICR晶振可供选择,在下载时勾选上就好,在驱动WS2812的过程中普通的12T单片机不是很好做到精准控制时序,所以选择次单片机IO口虽然小但是功能够用就好。具体图片如下图所示:



关于WS2812的时序解析



由此可以看的出来WS2812对时序还是要求比较严格的,需要到ns级别,我们也可以看到发0码的时序和发1码的时序是刚好相反的。

发送数据格式解析



上图中我们可以知道在发送数据时是按照GRB的顺序高位先发的。

部分代码

发送 0,1码时序,此时序由逻辑分析仪拉波形得出,时间上准确无误。

void WS2812_bit(bit data_bit)
{

if(data_bit)

{

LED=1;

_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();_nop_();

LED=0;

}

else

{

LED=1;

_nop_();_nop_();_nop_();_nop_();

LED=0;

_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();

}

}


发送24位数据分开解析,封装此函数,能更容易移植改变灯的颜色直接根据RGB值设置就好

void WS2812_rand_color(unsigned char R,unsigned char G,unsigned char B)

{

WS2812_bit(G&0X80);WS2812_bit(G&0X40);WS2812_bit(G&0X20);WS2812_bit(G&0X10);

WS2812_bit(G&0X08);WS2812_bit(G&0X04);WS2812_bit(G&0X02);WS2812_bit(G&0X01);



WS2812_bit(R&0X80);WS2812_bit(R&0X40);WS2812_bit(R&0X20);WS2812_bit(R&0X10);

WS2812_bit(R&0X08);WS2812_bit(R&0X04);WS2812_bit(R&0X02);WS2812_bit(R&0X01);



WS2812_bit(B&0X80);WS2812_bit(B&0X40);WS2812_bit(B&0X20);WS2812_bit(B&0X10);

WS2812_bit(B&0X08);WS2812_bit(B&0X04);WS2812_bit(B&0X02);WS2812_bit(B&0X01);

}

功能现象

可以参考下图亮灯效果:



总结

长期发布此类文章,谢谢大家的关注与喜欢,代码有需求的留言再评论区邮箱获取哦。

原文链接:,转发请注明来源!