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

实验效果

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

在这里插入图片描述

  • 11
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
要使用STC8H控制WS2812B,你需要了解WS2812B是一个数字RGB LED,它可以通过单个数据线进行控制。下面是一个基本的控制WS2812B的步骤: 1. 确定WS2812B的电源和地线,可以是5V电源和GND引脚。 2. 连接STC8H的I/O引脚到WS2812B的数据输入引脚。请注意,WS2812B的数据输入引脚应该是一个支持PWM输出的I/O引脚。 3. 使用STC8H的PWM输出模块来生成WS2812B所需的数据信号。 4. 发送数据信号到WS2812B,以控制其显示颜色和亮度。 下面是一些示例代码,可以帮助你开始编写控制WS2812B的程序: ```c #include "reg_stc8.h" // 定义数据线引脚 sbit LED_PIN = P1^0; // 定义颜色数据,颜色数据格式为GRB unsigned char color_data[3] = {0x00, 0xFF, 0x00}; void delay_us(unsigned int us) { unsigned int i; while(us--) { for(i=0;i<12;i++); } } void send_bit(unsigned char bit) { if(bit) { LED_PIN = 0; delay_us(0.8); // 发送位0的时间为0.8us LED_PIN = 1; delay_us(0.45); // 发送位1的时间为0.45us } else { LED_PIN = 0; delay_us(0.4); // 发送位0的时间为0.4us LED_PIN = 1; delay_us(0.85); // 发送位1的时间为0.85us } } void send_byte(unsigned char byte) { unsigned char i; for(i=0;i<8;i++) { send_bit(byte & 0x80); byte <<= 1; } } void send_data(unsigned char* data, unsigned int len) { unsigned int i; for(i=0;i<len;i++) { send_byte(data[i]); } } void main() { // 初始化数据线引脚为输出 LED_PIN = 1; // 发送颜色数据到WS2812B while(1) { send_data(color_data, sizeof(color_data)); } } ``` 该代码示例中,使用了STC8H的GPIO模块控制I/O引脚,并通过手动编写的函数来发送控制信号。在实际使用中,你可以使用STC8H的PWM输出模块来更方便地生成控制信号,并且可以使用更高级的算法来生成更复杂的颜色效果。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小殷学长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值