基于stm32单片机的ws2812b跑马灯代码
时间: 2023-10-10 13:06:32 浏览: 392
以下是基于STM32单片机的WS2812B跑马灯代码:
```c
#include "stm32f10x.h"
#include "delay.h"
#define LED_NUM 60 //WS2812B灯珠个数
#define HIGH 80 //高电平时间,单位us(根据自己的实际情况调整)
#define LOW 35 //低电平时间,单位us(根据自己的实际情况调整)
uint8_t led_data[LED_NUM*3]={0}; //存储WS2812B数据的数组
/*发送一个WS2812B数据*/
void ws2812b_send(uint8_t data)
{
for(uint8_t i=0;i<8;i++)
{
if((data<<i)&0x80)
{
GPIO_SetBits(GPIOA,GPIO_Pin_5); //输出高电平
delay_us(HIGH);
GPIO_ResetBits(GPIOA,GPIO_Pin_5); //输出低电平
delay_us(LOW);
}
else
{
GPIO_SetBits(GPIOA,GPIO_Pin_5); //输出高电平
delay_us(LOW);
GPIO_ResetBits(GPIOA,GPIO_Pin_5); //输出低电平
delay_us(HIGH);
}
}
}
/*发送一个WS2812B灯珠的数据*/
void ws2812b_send_led(uint8_t r,uint8_t g,uint8_t b)
{
ws2812b_send(g); //先发送G数据
ws2812b_send(r); //再发送R数据
ws2812b_send(b); //最后发送B数据
}
/*初始化WS2812B灯珠*/
void ws2812b_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
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);
}
int main()
{
ws2812b_init(); //初始化WS2812B灯珠
while(1)
{
/*跑马灯效果,不断循环*/
for(uint8_t i=0;i<LED_NUM;i++)
{
for(uint8_t j=0;j<LED_NUM;j++)
{
led_data[j*3]=0;
led_data[j*3+1]=0;
led_data[j*3+2]=0;
}
led_data[i*3]=255;
ws2812b_send_led(led_data[i*3],led_data[i*3+1],led_data[i*3+2]);
delay_ms(100); //延时100ms
}
}
}
```
这段代码通过STM32单片机控制WS2812B灯珠实现了跑马灯效果。首先需要定义WS2812B灯珠的个数、高电平时间和低电平时间,然后定义一个数组来存储WS2812B数据。发送一个WS2812B数据的函数中,通过移位运算和位运算来实现数据的发送。发送一个WS2812B灯珠的数据的函数中,先发送G数据,再发送R数据,最后发送B数据。初始化函数中,需要初始化GPIO口为输出模式。在主函数中,通过循环实现跑马灯效果,即不断循环发送WS2812B数据。需要注意的是,由于WS2812B灯珠的驱动电流较大,因此需要外接电源进行供电。
阅读全文