1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 【STC15控制WS2812 RGB彩灯级联】

【STC15控制WS2812 RGB彩灯级联】

时间:2020-09-06 02:02:32

相关推荐

【STC15控制WS2812 RGB彩灯级联】

STC15控制WS2812 RGB彩灯级联

下面是基于STC15F2K60S2的WS2812RGB彩灯级联测试。

一、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();}}}}

实验效果

下图的结果是全部一起控制的现象,大家可以根据自己的展示需求进行不同的操作。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。