基于stm32单片机的ws2812b跑马灯代码
时间: 2023-07-27 16:06:04 浏览: 55
基于STM32的跑马灯
以下是基于STM32单片机的WS2812B跑马灯代码:
```
#include "stm32f10x.h"
#define LED_NUM 60 // 定义LED数量
#define LED_DATA_SIZE (LED_NUM * 24) // 定义数据位数
#define LED_HIGH 60 // 定义高电平时间
#define LED_LOW 20 // 定义低电平时间
// 定义RGB颜色结构体
typedef struct {
uint8_t r;
uint8_t g;
uint8_t b;
} RGB;
// 定义颜色数组,每个LED有一个颜色
RGB ledColors[LED_NUM];
// 定义函数,用于发送一个字节的数据到WS2812B
void sendByte(uint8_t data) {
for (int i = 0; i < 8; i++) {
if ((data & 0x80) == 0x80) {
GPIO_WriteBit(GPIOB, GPIO_Pin_13, Bit_SET);
for (int j = 0; j < LED_HIGH; j++);
GPIO_WriteBit(GPIOB, GPIO_Pin_13, Bit_RESET);
for (int j = 0; j < LED_LOW; j++);
} else {
GPIO_WriteBit(GPIOB, GPIO_Pin_13, Bit_SET);
for (int j = 0; j < LED_LOW; j++);
GPIO_WriteBit(GPIOB, GPIO_Pin_13, Bit_RESET);
for (int j = 0; j < LED_HIGH; j++);
}
data <<= 1;
}
}
// 定义函数,用于发送一个RGB颜色的数据到WS2812B
void sendColor(RGB color) {
sendByte(color.g);
sendByte(color.r);
sendByte(color.b);
}
// 定义函数,用于发送所有LED的颜色数据到WS2812B
void sendColors() {
for (int i = 0; i < LED_NUM; i++) {
sendColor(ledColors[i]);
}
}
int main(void) {
// 初始化GPIO
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 初始化颜色数组
for (int i = 0; i < LED_NUM; i++) {
ledColors[i].r = 0;
ledColors[i].g = 0;
ledColors[i].b = 0;
}
// 循环发送颜色数据到WS2812B
while (1) {
sendColors();
for (int i = 0; i < 10000; i++);
}
}
```
代码中使用了STM32的GPIO控制WS2812B,每个LED需要发送24位数据,每个位发送高电平60us或低电平20us。定义了RGB颜色结构体和颜色数组,颜色数组中存储了每个LED的颜色数据。在主函数中初始化GPIO和颜色数组,然后循环发送颜色数据到WS2812B。
阅读全文