基于STM32的舞台灯控制电路代码
时间: 2024-03-31 13:33:08 浏览: 81
基于STM32的LED显示屏电路
好的,这是一个基于STM32的舞台灯控制电路的示例代码,实现功能如下: ①自行设定管脚与3个RGB LED相连(同时也是某个定时器的复用管脚);根据 RGB颜色表,查出红、绿、蓝、黄、紫、青、白七种颜色的颜色值。 ②利用定时器结合PWM,输出周期为100ms的周期信号,让RGB小灯循环显示 红、绿、蓝、黄、紫、青、白 七种颜色,间隔1S。 ③实现红、绿、蓝、黄、紫、青、白七种颜色单独闪烁,间隔1S。 ④实现红绿、绿蓝、红蓝、红绿蓝间隔闪烁,间隔1S。
```c
#include "stm32f10x.h"
// 定义LED的控制口
#define LED_RED_PIN GPIO_Pin_0
#define LED_GREEN_PIN GPIO_Pin_1
#define LED_BLUE_PIN GPIO_Pin_2
// 定义RGB颜色
#define RGB_RED 0xFF0000
#define RGB_GREEN 0x00FF00
#define RGB_BLUE 0x0000FF
#define RGB_YELLOW 0xFFFF00
#define RGB_PURPLE 0xFF00FF
#define RGB_CYAN 0x00FFFF
#define RGB_WHITE 0xFFFFFF
// 定义闪烁时间间隔
#define BLINK_INTERVAL 1000
// 定义全局变量
uint32_t rgb_colors[7] = {RGB_RED, RGB_GREEN, RGB_BLUE, RGB_YELLOW, RGB_PURPLE, RGB_CYAN, RGB_WHITE};
uint8_t color_index = 0;
// 定义函数
void GPIO_Configuration(void);
void TIM_Configuration(void);
void delay_us(uint32_t us);
void delay_ms(uint16_t ms);
int main(void) {
// 初始化GPIO和定时器
GPIO_Configuration();
TIM_Configuration();
while (1) {
// 循环显示七种颜色
for (color_index = 0; color_index < 7; color_index++) {
TIM_SetCompare1(TIM2, (rgb_colors[color_index] & 0xFF0000) >> 16); // 设置红色PWM占空比
TIM_SetCompare2(TIM2, (rgb_colors[color_index] & 0x00FF00) >> 8); // 设置绿色PWM占空比
TIM_SetCompare3(TIM2, rgb_colors[color_index] & 0x0000FF); // 设置蓝色PWM占空比
delay_ms(BLINK_INTERVAL); // 延时1秒
}
// 单独闪烁七种颜色
for (color_index = 0; color_index < 7; color_index++) {
TIM_SetCompare1(TIM2, (rgb_colors[color_index] & 0xFF0000) >> 16); // 设置红色PWM占空比
TIM_SetCompare2(TIM2, (rgb_colors[color_index] & 0x00FF00) >> 8); // 设置绿色PWM占空比
TIM_SetCompare3(TIM2, rgb_colors[color_index] & 0x0000FF); // 设置蓝色PWM占空比
delay_ms(BLINK_INTERVAL); // 延时1秒
TIM_SetCompare1(TIM2, 0); // 关闭红色PWM
TIM_SetCompare2(TIM2, 0); // 关闭绿色PWM
TIM_SetCompare3(TIM2, 0); // 关闭蓝色PWM
delay_ms(BLINK_INTERVAL); // 延时1秒
}
// 交替闪烁三种颜色
TIM_SetCompare1(TIM2, 255); // 红灯亮
TIM_SetCompare2(TIM2, 0); // 绿灯灭
TIM_SetCompare3(TIM2, 0); // 蓝灯灭
delay_ms(BLINK_INTERVAL); // 延时1秒
TIM_SetCompare1(TIM2, 0); // 红灯灭
TIM_SetCompare2(TIM2, 255); // 绿灯亮
TIM_SetCompare3(TIM2, 0); // 蓝灯灭
delay_ms(BLINK_INTERVAL); // 延时1秒
TIM_SetCompare1(TIM2, 0); // 红灯灭
TIM_SetCompare2(TIM2, 0); // 绿灯灭
TIM_SetCompare3(TIM2, 255); // 蓝灯亮
delay_ms(BLINK_INTERVAL); // 延时1秒
TIM_SetCompare1(TIM2, 255); // 红灯亮
TIM_SetCompare2(TIM2, 255); // 绿灯亮
TIM_SetCompare3(TIM2, 0); // 蓝灯灭
delay_ms(BLINK_INTERVAL); // 延时1秒
TIM_SetCompare1(TIM2, 255); // 红灯亮
TIM_SetCompare2(TIM2, 0); // 绿灯灭
TIM_SetCompare3(TIM2, 255); // 蓝灯亮
delay_ms(BLINK_INTERVAL); // 延时1秒
TIM_SetCompare1(TIM2, 0); // 红灯灭
TIM_SetCompare2(TIM2, 255); // 绿灯亮
TIM_SetCompare3(TIM2, 255); // 蓝灯亮
delay_ms(BLINK_INTERVAL); // 延时1秒
TIM_SetCompare1(TIM2, 255); // 红灯亮
TIM_SetCompare2(TIM2, 255); // 绿灯亮
TIM_SetCompare3(TIM2, 255); // 蓝灯亮
delay_ms(BLINK_INTERVAL); // 延时1秒
}
}
// 初始化GPIO
void GPIO_Configuration(void) {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 配置引脚为复用推挽输出
GPIO_InitStructure.GPIO_Pin = LED_RED_PIN | LED_GREEN_PIN | LED_BLUE_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
// 初始化定时器
void TIM_Configuration(void) {
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
// 定时器初始化
TIM_TimeBaseStructure.TIM_Period = 255; // PWM周期
TIM_TimeBaseStructure.TIM_Prescaler = 71; // 定时器分频系数
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分割
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 计数器向上计数
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
// PWM输出初始化
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // PWM模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 输出使能
TIM_OCInitStructure.TIM_Pulse = 0; // 初始占空比为0
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 输出极性为高
TIM_OC1Init(TIM2, &TIM_OCInitStructure); // 初始化TIM2_CH1
TIM_OC2Init(TIM2, &TIM_OCInitStructure); // 初始化TIM2_CH2
TIM_OC3Init(TIM2, &TIM_OCInitStructure); // 初始化TIM2_CH3
TIM_Cmd(TIM2, ENABLE); // 使能TIM2
}
// 延时函数,微秒级别
void delay_us(uint32_t us) {
us *= 8; // 根据实际情况调整系数
while (us--) {
__ASM("nop");
}
}
// 延时函数,毫秒级别
void delay_ms(uint16_t ms) {
while (ms--) {
delay_us(1000);
}
}
```
这段代码是一个简单的示例,实现了舞台灯控制电路的基本功能。需要注意的是,这段代码可能需要根据具体的电路和需求进行修改和调整,以达到最佳效果。
阅读全文