本文主要是介绍STM32串口控制不同亮度等级的小灯,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
利用串口的输入控制LED灯的亮度,从而达到PC机与MAU交互通信的功能
此功能由三个部分组成,分别是:串口通信、LED灯亮度等级的设定、以及按键按下LED灯熄灭。
首先串口通信过程中要配置串口重定义:
/* USER CODE BEGIN 4 */#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#define GETCHAR_PROTOTYPE int fgetc(FILE *f)
#endif
PUTCHAR_PROTOTYPE
{HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF); return ch;
}
GETCHAR_PROTOTYPE
{uint8_t ch;while (HAL_UART_GetState(&huart2) == RESET);HAL_UART_Receive(&huart2, (uint8_t *)&ch, 1, 0xffff);
// while (HAL_UART_GetState(&huart2) == RESET);
// HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF);return ch;
}/* USER CODE END 4 */
LED灯亮度等级设置:采用switch-case多分支选择结构来实现,每个case分别对应不同的亮度等级,用户在PC机上输入亮度等级后,通过串口通信,将此信息传输到MAU上,根据相应的亮度等级点亮LED灯。按键按下后LED灯熄灭,信号发送完毕。
int i,x,a;
void rank(int a); //声明函数
void delay(int i); //声明函数int main(void) //主函数
{while (1){printf("选择0-9亮度等级\r\n"); scanf("%d",&a);switch(a){case 0 : rank(0);break;case 1 : rank(1);break;case 2 : rank(2);break;case 3 : rank(3);break;case 4 : rank(4);break;case 5 : rank(5);break;case 6 : rank(6);break;case 7 : rank(7);break;case 8 : rank(8);break;case 9 : rank(9);break;default:printf("Enter data error!\r\nPlease enter again!"); }}
}
void rank(int i) //定义函数
{ i=a*1000; while(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)==1) { HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET); delay(i); HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5); delay(10000-i); } if((HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13))==0) { HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET); }
}void delay(int i)
{ while(i--);
}
串口中断方式的发动作:HAL_UART_Transmit_IT;
串口中断方式的收动作:HAL_UART_Receive_IT。
可以通过定时器、中断等方式控制LED的属性,中断方式可应用于多进程中。
这篇关于STM32串口控制不同亮度等级的小灯的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!