WS2812B全彩发光LED灯的学习

本文介绍了如何使用单根数据线控制RGB灯,包括LED引脚定义、串行数据发送方法、初始化过程以及实现LED颜色渐变的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

led引脚定义

想做一个氛围灯,于是参考了一些资料进行学习。

数据传输

由于这个rgb灯只有一根数据线,所以只能通过串行的方式进行数据发送,发送规则为高位先发,RGB三种颜色一共占用3个字节。如果需要连接多个灯珠,需要进行多次发送由级联电路自动转发。

LED初始化
void LED_Init(void)
{
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	 

    GPIO_InitTypeDef  GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    LED2 = 0;

}
 
LED颜色渐变
//延迟
void delay_ns(u32 ns)
{       
	while(ns--);
}
//写入每一位的数据 data=1写1,data=0写0
void RGBWrite_Bit(u8 data)
{
	if(data)
	{
		LED2=1;delay_ns(7);
		LED2=0;delay_ns(1);
	}
	else
	{
		LED2=1;delay_ns(1);
		LED2=0;delay_ns(7);
	}
}
//写一个字节数据
void RGBWrite_Byte(u8 byte)
{
	u8 i=0;
	for(i=0;i<8;i++)
	{
	  RGBWrite_Bit(byte&0x80);
	  byte<<=1;
	}
}
//定义灯珠的颜色
void Write_Color(u8 G, u8 R, u8 B)
{
	RGBWrite_Byte(G);
	RGBWrite_Byte(R);
	RGBWrite_Byte(B);
}

u8 a,b=0xff,c;
 int main(void)
 {	

	LED_Init();		  	//初始化与LED连接的硬件接口
	while(1)
	{
		for(u8 i=0;i<255;i++)//数值渐变
		{
			Write_Color(a,b,c);delay_ms(10);
			a++;b--;
		}
		for(u8 i;i>0;i--)//数值渐变
		{
			Write_Color(a,b,c);delay_ms(10);
			a--;b++;
		}
		   delay_ms(20);
		   c=rand()%255;  //获取随机值作为rgb颜色主导
	}
	 
 }

第一次发学习笔记....

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值