- 打卡等级:以坛为家I
- 打卡总天数:386
- 最近打卡:2025-04-30 22:13:28
已绑定手机
金牌会员
- 积分
- 1045
|
发表于 2024-8-14 21:52:21
|
显示全部楼层
网上已经有帖子把2812的时序用通俗语言解释得较为清楚了,我也简单在他们的基础上进一步总结一下
要从芯片设计制造的角度去思考时序问题。比如为什么DS18B20和WS2812这种芯片的时序时间都有一个范围,其实是因为这些芯片内部用的是RC振荡器,所以不会太精准,因此要求外部时序无论在高温低温还是电压偏高偏低的情况下都落入一个特定的范围。
对于ws2812来说,只要来个高电平,那么就会观察这个高电平的持续时间,如果持续时间小于某个值,判为0,如果大于某个值,判为1.
如果信号变成了低电平,那么就等待下一个信号的到来,如果等了半天80us或者200uS,不同型号帧间隔不同,没有下一个信号,就判定为复位信号,本次传输结束。
因此只要控制高电平持续时间的长短,就是控制了发的到底是1还是0了。以下是我用的代码,自认为没有更简洁的办法了。
//STC8G1K08A 22.1184MHz
//STC8G1K08A 22.1184MHz
void nop(void)
{
}
void sendbyte(unsigned char byte)
{
unsigned char i;
i=8;
EA=0;
do
{
ws2812pin=1;nop();
ws2812pin=byte&0x80;nop();
ws2812pin=0;nop();
byte=(byte<<1); //左移位
}while(--i);
EA=1;
}
void SetLed(unsigned char R_,G_,B_)
{
sendbyte(G_);
sendbyte(R_);
sendbyte(B_);
}
|
|