按键控制灯 STM32单片机外接扩展板D2、D3接开关S2和S3,D9、D10、D11接RGB三色LED灯,要求每次按下S2开关一次,三色灯按红、绿、蓝颜色变化,每次按下S3开关一次,三色灯按蓝、绿、红颜色变化,每次颜色变化时,通过串行口向计算机发送“按下按钮:SX,当前颜色是:X色!”
时间: 2023-06-24 15:08:58 浏览: 86
好的,这个任务可以通过STM32单片机的GPIO口控制外接扩展板上的LED灯和开关。下面是大致的代码实现思路:
1. 首先需要在代码中配置好D2、D3、D9、D10、D11这几个GPIO口的输入输出模式和上下拉电阻。
2. 然后需要定义一个变量来记录当前的颜色,初始值可以设置为红色。
3. 在主循环中,不断检测S2和S3开关是否被按下,如果S2被按下,则将当前颜色循环变化为红、绿、蓝三种颜色,同时通过串口发送按下S2开关的信息和当前颜色。
4. 如果S3被按下,则将当前颜色循环变化为蓝、绿、红三种颜色,同样发送按下S3开关的信息和当前颜色。
5. 定义一个函数来控制LED灯的颜色,根据当前颜色变量的值来设置D9、D10、D11这三个GPIO口的输出电平,实现三色灯的控制。
下面是一个简单的代码实现示例,仅供参考:
```
#include "stm32f10x.h"
#include "stdio.h"
#define S2 GPIO_Pin_0
#define S3 GPIO_Pin_1
#define D2 GPIO_Pin_2
#define D3 GPIO_Pin_3
#define D9 GPIO_Pin_4
#define D10 GPIO_Pin_5
#define D11 GPIO_Pin_6
#define RED 0
#define GREEN 1
#define BLUE 2
int current_color = RED;
void LED_color(int color) {
switch (color) {
case RED:
GPIO_SetBits(GPIOB, D9);
GPIO_ResetBits(GPIOB, D10|D11);
break;
case GREEN:
GPIO_SetBits(GPIOB, D10);
GPIO_ResetBits(GPIOB, D9|D11);
break;
case BLUE:
GPIO_SetBits(GPIOB, D11);
GPIO_ResetBits(GPIOB, D9|D10);
break;
default:
break;
}
}
void USART1_Config(void) {
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
}
void USART1_SendChar(uint8_t ch) {
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
USART_SendData(USART1, ch);
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
}
void USART1_SendString(char* str) {
while (*str) {
USART1_SendChar(*str++);
}
}
int main(void) {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = D2|D3|D9|D10|D11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = S2|S3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
USART1_Config();
while (1) {
if (GPIO_ReadInputDataBit(GPIOB, S2) == RESET) {
current_color = (current_color + 1) % 3;
LED_color(current_color);
char msg[50];
sprintf(msg, "按下按钮:S2,当前颜色是:%s色!\r\n", current_color==RED?"红":current_color==GREEN?"绿":"蓝");
USART1_SendString(msg);
while (GPIO_ReadInputDataBit(GPIOB, S2) == RESET); // 等待按键释放
}
if (GPIO_ReadInputDataBit(GPIOB, S3) == RESET) {
current_color = (current_color + 2) % 3;
LED_color(current_color);
char msg[50];
sprintf(msg, "按下按钮:S3,当前颜色是:%s色!\r\n", current_color==RED?"红":current_color==GREEN?"绿":"蓝");
USART1_SendString(msg);
while (GPIO_ReadInputDataBit(GPIOB, S3) == RESET); // 等待按键释放
}
}
}
```
阅读全文