中山网站开发公司,企业邮箱注册去哪,制作网站域名需要多少钱,大连网站建设特色WS2812B是一颗集控制与发光于一体的智能LED光源#xff0c;采用24bit单线串行协议来实现RGB三色的控制#xff0c;每颗灯珠可以实现256级亮度#xff0c;16777216种全真色彩显示。看到B站网友发布的关于点亮WS2182视频后#xff0c;RGB三原色混合后能得到不同的亮度和不同的…WS2812B是一颗集控制与发光于一体的智能LED光源采用24bit单线串行协议来实现RGB三色的控制每颗灯珠可以实现256级亮度16777216种全真色彩显示。看到B站网友发布的关于点亮WS2182视频后RGB三原色混合后能得到不同的亮度和不同的颜色感觉灯珠的确很炫萌生了买一条来玩玩的想法。2022年从淘宝上买了一条8位的灯条放了两年近期一时兴起打开测试几经测试只能点亮三颗一度认为是编程上出现了问题调试了半天没有任何进展最终还是放弃决定重新淘上一块来测试验证新品到货点亮后一切正常。下面将使用C51单片机驱动灯珠的过程记录下来。
一、硬件平台
1、C51测试平台
目前手上能用的测试C51平台有两块一块是老平台STC89C52RD时钟为12M还有一块是STC15W408AS。网上说STC89C52这种12T的单片机不能驱动WS2812这里纠正一下不是不能驱动而是当前时钟为12M时不能驱动当时钟频率为12M时一个机器周期大约为1us而驱动灯珠最低需要0.35us提高时钟频率至33M以上还是能驱动的。另外一块STC15W408AS的单片机属于1T的单片机在12M的时钟频率下一个机器周期0.08us右左为了省事自然是选择了后者。
2、WS2812测试灯条 从淘宝上购买的灯条外观如下图 电路的连接方式采用串联方式如下图所示 二、硬件连接 序号 C51平台 灯条 1 5V 5V 2 GND GND 3 P12 IN
三、时序分析
1、输入码型
WS2812输入的码型总共三种分别为0码、1码、Reset码。其中0码和1码通过高低电平时长来区分每条码大约1.5us左右。而Reset码即复位码通过拉低一定时长来识别区分每条码50us左右其在时序中的用于间隔两个数据帧。 下表为传输时间表 2、单个灯珠的传输
单个WS2812灯珠的数据结构如下图每个灯珠以24bit位复位码为基础一帧数据24bit的组成8bit绿8bit红8bit蓝组成由绿红蓝三原色混合成不同的颜色其中三种单色有28种即256种颜色。 3、8个灯珠的传输
8个灯珠采用串接方式即D1的DO接D2的DID2的DO接D3的DI如下图所示 第一个复合帧的结构如下
D1(24bit) D2(24bit) D2(24bit)... D8(24bit)复位码 四、部分源码 void setWs2812(unsigned char flag,unsigned char G,unsigned char R,unsigned char B)
{unsigned char i,j,temp;unsigned char p[3];if(flag)//当flag的值为1时显示点亮灯珠{p[0]G;p[1]R;p[2]B;}else//当flag的值为0时显示关闭灯珠{p[0]p[1]p[2]0x00;}for(i0;i3;i)//发送24bit{tempp[i];for(j0;j8;j){if(temp0x80)//1码{DI1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();DI0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); }else//0码{DI1;_nop_();_nop_(); DI0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); }temp(temp1);}} }void setWs2812Frame(unsigned char id,unsigned G,unsigned char R,unsigned char B)
{unsigned char i;for(i0;iid;i){setWs2812(1,G,R,B);/****if(i(id-1)){setWs2812(1,G,R,B);}else{setWs2812(0,G,R,B);}****/}ResetLed();
}
//点亮单颗WS2812
void setWs2812(unsigned char flag,unsigned char G,unsigned char R,unsigned char B)
{unsigned char i,j,temp;unsigned char p[3];if(flag)//当flag的值为1时显示点亮灯珠{p[0]G;p[1]R;p[2]B;}else//当flag的值为0时显示关闭灯珠{p[0]p[1]p[2]0x00;}for(i0;i3;i)//发送24bit{tempp[i];for(j0;j8;j){if(temp0x80)//1码{DI1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();DI0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); }else//0码{DI1;_nop_();_nop_(); DI0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); }temp(temp1);}}
}
//复位码
void ResetLed()
{DI0;Delay60us();}
//点亮8颗
void setWs2812Frame(unsigned char id,unsigned G,unsigned char R,unsigned char B)
{unsigned char i;for(i0;iid;i){setWs2812(1,G,R,B); }ResetLed();
}五、效果展示