STM32串口控制不同亮度等级的小灯

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/tsundere_ning/article/details/81021564

利用串口的输入控制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的属性,中断方式可应用于多进程中。






展开阅读全文

没有更多推荐了,返回首页