要求通过单片机实现以下功能:
1.单片机有三种工作模式(定义全局变量MM表示模式,MM=1,2,3表示三种不同的模式)
- LED控制模式
- 风扇控制模式
- 蜂鸣器控制模式
2.可以在某一个模式下通过拓展板KEY1按键控制设备
按键按下一次,设备打开,按键再按下一次,设备关闭(设备管脚输出反向电平)
3.关于模式的切换可以通过以下两种方式:
-
- 通过串口通信,电脑端发送当前模式(设置串口接收中断,接收到的字符串进行比较)
- 电脑发送LED,进入LED模式
- 电脑发送FAN ,进行风扇控制模式
- 电脑发送BEE,进入蜂鸣器控制模式
- 通过底板用户自定义按键进行模式切换
- 按键按下一次进入LED模式,再按一次,进入风扇模式,再按一下,进入蜂鸣器模式
- 通过串口通信,电脑端发送当前模式(设置串口接收中断,接收到的字符串进行比较)
代码实现:
main.c
/* USER CODE BEGIN 0 */
//定义一个全局的buf用于接收串口接收寄存器数据
char buf[128];
//定义一个全局变量用于记录当前控制模式
int mode=0;
//重写printf调用的fputc函数
int fputc(int ch, FILE * stream){
HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,5);
return ch;
}
//重写GPIO中断回调
void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin){
//底板user按键中断判断,每按一次模式改变
if(GPIO_Pin==GPIO_PIN_12){
//HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
mode++;
}
//扩展版key1按键中断判断,根据模式不同开启对应器件
if(GPIO_Pin==GPIO_PIN_9){
if(mode!=0){
if(mode%3==1){//模式1控制led
printf("led enable\n\r");
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_4);
}else if(mode%3==2){//模式2控制风扇
printf("fan enable\n\r");
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_6);
}else if(mode%3==0){//模式3控制蜂鸣器
printf("bee enable\n\r");
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_15);
}
}
}
}
//通过光电模块控制led灯和火焰开关控制风扇
void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin){
if(GPIO_Pin==GPIO_PIN_2){
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_4);
}
if(GPIO_Pin==GPIO_PIN_3){
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_6);
}
}
//重写串口接收中断回调函数//由串口接收中断切换控制模式
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
printf("uart1 receive intterrupt OK:%s\n\r",buf);
if(strcmp(buf,"LED")==0){//电脑输入LED,切换至控制LED模式
mode=1;
printf("mode=%d\n\r",mode);
}else if(strcmp(buf,"FAN")==0){//电脑输入FAN,切换至控制FAN模式
mode=2;
printf("mode=%d\n\r",mode);
}else if(strcmp(buf,"BEE")==0){//电脑输入BEE,切换至控制蜂鸣器模式
mode=3;
printf("mode=%d\n\r",mode);
}
}
/* USER CODE END 0 */
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* Configure the System Power */
SystemPower_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_ICACHE_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_UART_Receive_IT(&huart1,(uint8_t *)buf,3);//产生串口接收中断,并将接收寄存器数据存储到buf中
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
}