如何使用STC15W204S单片机控制WS2812幻彩灯带
最近一期视频中的大刀的Solidworks模型源文件和STC15W204S单片机的烧写代码下载地址:https://pan.baidu.com/s/1P8xO8DFufDx4yR0TkeDPXg?pwd=9932 提取码:9932
代码的LED部分沿用了上一期视频破败王剑的基础功能,以后可能会继续沿用下去

STC15W204S单片机最小系统 是我在某宝能找到的最小的“最小系统”,就是程序空间4K小了点,写不了太繁杂的代码;且功能引脚也较少,仅一块难以同时控制LED与电机两个系统;于是突发奇想使用两块单片机互联,引脚设定如下:


RGB灯带是在某宝找到的5V“幻彩灯带”,控制芯片是WS2812
关于如何使用STC15W204S单片机去生成控制WS2812能读懂的二进制信息,我参考了几个国内大神的帖子,比如以下的2篇:
https://blog.csdn.net/u013062709/article/details/85217281
https://blog.csdn.net/weixin_38476200/article/details/115519393
不过文中关于其使用的时钟频率,和我自己现实实践下来仍然存在出入,毕竟他们使用的单片机是STC15W4K32S4和STC15F104E,而不是STC15W204S;
要让WS2812芯片听话,其关键就在于发送给他的信号的信号时序一定要精确到其能接受的范围内;
首先是“0”和“1”如何约定,这一点极其关键!芯片只要读出了0和1,就能读出从0~255的二进制数字:

当然“0”和“1”所组成的一大串数字,中间得有间隔,比如给WS2812的信息就是每隔24*N个(这里N是灯珠的数量)二进制数字发一个“空格”(空格的时间是微秒级),也就是上图所示的“RESET码”,一旦WS2812收到了“RESET码”,后面传进来的信息,就会覆盖上一轮的信息,从而实验变色;
WS2812芯片安装在灯带的每一个灯珠当中,数据传输给其中一个灯珠的芯片时,这块芯片会把属于自己的24位保留下来设置自己的颜色,另外的的24*(N-1)位数字会输出给下一个灯珠中的芯片;
24位的0和1,就是三个8位的0和1,也就是3组8位二进制数,8位二进制能够表达的数字,最大是“11111111”,换成十进制就是255;0~255,刚好够实现R、G、B三者其中一个色相的256色

而事实上我们写入单片机的程序中,任何一句代码的执行基本上都会占用一定的时钟周期:

对于工作频率在11MHz~35MHz之间的STC15W204S单片机来说,一个时钟周期,就是1/35M ~1/11M 的秒钟数,大约是28~91ns


而WS2812对于时序的要求是纳秒级的:

因此,在程序中使用的用来传输信号的语句,必须严格控制代码的精简度!
参照以上大神的代码,经过自己的一番摸索,我终于实现了让WS2812听话!

并且这一段程序,仅在工作频率35MHz下才有效,否则烧写后灯带的颜色会不听话,也就是刚好及格;

以上对于STC15W204S的时序数据,也许并不可靠,我实验下来也是疑惑重重,所以,也许还有更加合理的代码,不过目前我够用啦!
非计算机专业,C51语言是大学毕业设计时期自学的,代码中应该还有不规范和不严谨之处,所以仅供参考,哈哈~