基于stc8h实现ws2812b的点灯
先说结论:由于精度限制,51单片机大多达不到ns级别的延时操作,因此可以考虑手动增加耗时操作进行软件延时
前言
在使用stc8h8k64u时,通过矩阵键盘的学习,突发奇想,查看是否可以通过stc8实现客制化小数字键盘,考虑到这款芯片最多支持8通道的同时控制,远远不够去做一个可以实现10路以上的呼吸灯,经过一番查找,发现可以使用ws2812b这款可编程RGB发光二极管
ws2812b
这款灯珠是单线传输的三通道 LED 驱动控制芯片,采用单极性归零码协议,因此对电平的要求较高,需要将近ns级别的延时操作
时序图
电平格式
通过对上述图中信息的分析,翻译成人话就是用过引脚快速修改高低电平,实现不同数据的输出
输出格式
首先拉低引脚电平(80us以上),然后开始正常传输数据,顺序是每8bit可以代表一种颜色的深度(高位拉高更亮),如图每次满24bit才点亮1盏灯
存在的问题
最初想法是直接通过delay函数相关的方法来进行拉高拉低等待,但是发现这里的主频24MHz,通过逻辑分析仪发现,在ns单位下的计时并不够精准,因此无法实现.
解决办法
既然无法通过正规的延时实现,那只能使用一些’‘非常规方法’'了,首先我发现在直接进行引脚电平修改而不使用任何延时操作时,时间大概在22ns左右,
那么我们就可以利用这一点,增加一些无意义的耗时操作,让其刚好处于200-350ns那么就很nice,经过将近一个上午的调试最终试出了一个比较完美的持续时间,刚好使高电平持续时间为333ns
'1’码高电平
'0’码高电平
于是,就有了以下的代码(计算操作都是在凑延时):
完美实现高低电平的控制,剩下的就是自己对不同数据的处理了,如果没有跑起LED,可以根据这个思路自己对自定义的耗时操作进行修改,然后通过逻辑分析仪查看是否符合要求
展示图: