一、WS2812介绍
引脚
工作时序
注意
当我们使用WS2812控制RGB彩灯的时候,每一个彩灯需要发送24bit数据RGB各8BIt控制,如果我们要控制两个则需要连续发送48bit数据,同理当我们要控制N个彩灯的时候,需要发送N*24bit数据。
二、WS2812级联接线
下面是我使用两个WS2812进行级联,WS2812在使用过程中只需要一根控制线就可以了,OUT连接下一块的IN,接多块WS2812同样如此进行连接
三、实验测试
RGB颜色表
代码中的颜色是根据上述的RGB颜色表来写的
1.ws2812.c
- #include "ws2812.h"
- #include "delay.h"
- #include <intrins.h>
- #include <STC15F2K60S2.H>
- #define LED_COUNT 8 //控制彩灯的个数
- sbit IN = P3^2; //WS2812输入引脚控制
- //WS2812发送的顺序是GRB,ledcount表示LED的个数,color表示LED的种类
- void RGB_LED_Controal(unsigned char led_count,unsigned char color)
- {
- unsigned char i = 0;
- for(i=0;i<led_count;i++) //控制灯的个数
- {
- switch(color)
- {
- //RGB颜色可以网上查看RGB颜色表
- case 1:Send_24bit(0xc9,0x00,0x57);break; //翠绿色
- case 2:Send_24bit(0x20,0xa0,0xF0);break; //紫色
- case 3:Send_24bit(0x70,0xda,0xd6);break; //淡紫色
- case 4:Send_24bit(0x59,0x3d,0xab);break; //钴色
- case 5:Send_24bit(0x80,0xfa,0x72);break; //橙红色
- case 6:Send_24bit(0x8a,0x80,0x87);break; //冷灰
- case 7:Send_24bit(0x80,0x80,0x69);break; //暖灰色
- case 8:Send_24bit(0xf0,0xfa,0xe6);break; //亚麻色
- case 9:Send_24bit(0x00,0xff,0x00);break; //红色
- case 10:Send_24bit(0x30,0xb0,0x60);break; //栗色
- case 11:Send_24bit(0xfc,0x7c,0x00);break; //草地绿
- case 12:Send_24bit(0xff,0x00,0xff);break; //青色
- case 13:Send_24bit(0x2e,0x08,0x54);break; //靛青
- case 14:Send_24bit(0x8f,0xbc,0xbf);break; //玫瑰红
- case 15:Send_24bit(0x19,0x19,0x70);break; //孔雀蓝
- case 16:Send_24bit(0xc7,0x00,0x8c);break; //土耳其玉色
- case 17:Send_24bit(0xe6,0xf0,0x8c);break; //黄褐色
- case 18:Send_24bit(0xff,0x00,0x7f);break; //嫩绿色
- default:Send_24bit(0x00,0x00,0x00);break;
- }
- }
- }
- //数据复位 低电平持续300us以上
- void ResetData(void)
- {
- unsigned char i = 0;
- IN = 0;
- for(i = 0;i<6;i++)
- {
- Delay50us();
- }
- }
- void Send_Byte(unsigned char temp)
- {
- unsigned char i = 0;
- for(i = 0;i<8;i++)
- {
- if(temp & 0x80) //从高位开始发送
- {
- //发送“1”码
- IN = 1;
- //高电平 持续760ns-1.6us
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- IN = 0;
- //低电平 持续时间220ns-420ns
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
-
- }else{
- //发送"0"码
- IN = 1;
- //高电平持续时间 220ns-420ns
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
-
- IN = 0;
- //低电平持续时间 750ns-1.6us
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
-
- }
- temp = (temp << 1); //次高位
- }
- // Delay10us();
- }
- //发送一帧数据RGB 各八位
- void Send_24bit(unsigned char dat1,unsigned char dat2,unsigned char dat3)
- {
- Send_Byte(dat1);
- Send_Byte(dat2);
- Send_Byte(dat3);
- }
- //-------------------------------------------------------------------------------
复制代码
2.ws2812.h
- #ifndef _WS2812_H_
- #define _WS2812_H_
- void ResetData(void);
- void SendPix(unsigned char *str);
- void SendOneFrame(unsigned char *ptr);
- void Send_Byte(unsigned char temp);
- void Send_24bit(unsigned char dat1,unsigned char dat2,unsigned char dat3);
- void RGB_LED_Controal(unsigned char led_count,unsigned char color);
- #endif
复制代码
3.main.c
- #include <STC15F2K60S2.H>
- #include "delay.h"
- #include "ws2812.h"
- void main(void)
- {
- unsigned char i = 0,j =0;
- P0M0 = 0x00;
- P0M1 = 0x00;
- P1M0 = 0x00;
- P1M1 = 0x00;
- P3M0 = 0x00;
- P3M1 = 0x00;
- P5M0 = 0x00;
- P5M1 = 0x00;
- P1 = 0xFF;
- P3 = 0xFF;
- P5 = 0xFF;
-
- while(1)
- {
- for(i = 0;i<8;i++) //外层控制LED的个数
- {
- for(j = 0;j<6;j++) //内层控制LED的颜色种类
- {
- RGB_LED_Controal(i,j);
- ResetData();
- Delay500ms();
- }
- }
- }
- }
复制代码
实验效果
下图的结果是全部一起控制的现象,大家可以根据自己的展示需求进行不同的操作。
————————————————
版权声明:@slow-walker
|