5.1 GPIO输入项目:按键触发声光告警

# 5.1 GPIO输入项目:按键触发声光告警

本项目通过GPIO控制按键开关、蜂鸣器与LED的交互联动。当按键按下,PB5引脚输出方波信号,驱动无源蜂鸣器发声,同时让LED发光,实现声光告警;按键松开后,PB5引脚停止输出方波信号,蜂鸣器停止发声,LED熄灭,声光告警结束。

# 5.1.1 硬件设计

# 红色LED电路

  • 红色LED的阴极接地,阳极串联1kΩ限流电阻后接入PB0引脚
    红色LED电路

# 按键电路

  • 常开型设计:KEY1~KEY4共地连接,经10KΩ上拉电阻接入PC13/PB12/PB14/PB15,并联电容抑制抖动。
    按键开关硬件电路

# 蜂鸣器电路

  • 无源蜂鸣器驱动:PB5通过NPN三极管控制电流通路,输出方波驱动发声。
    蜂鸣器硬件电路

# 5.1.2 STM32CubeMX配置

# 1. 新建工程

创建工程"05 GPIO_INPUT",选择芯片STM32F103C8T6:
设置工程名称

# 2. 配置Debug模式

启用SWD调试功能:
Debug模式配置

# 3. 引脚配置

  • PC13设为GPIO_Input(标签KEY1)
  • PB5设为GPIO_Output(标签BEEP)
    I/O引脚配置图

# 4. 生成代码

勾选生成外设独立文件:
勾选生成单独外设文件

# 5.1.3 软件设计

# 1. 变量初始化

定义消抖时间、周期以及频率变量:

  /* USER CODE BEGIN PD */
  #define DELAY_TIME 100   // 消抖时间(ms)
  #define BEEP_FREQ 1000      // 蜂鸣器发声频率,单位Hz
  #define BEEP_PERIOD (1000 / BEEP_FREQ)     // 周期,单位ms

  /* USER CODE END PD */

1
2
3
4
5
6
7

# 2. 主循环逻辑

实现按键检测、消抖处理、LED与蜂鸣器控制:

while (1)
{
// 检测按键是否按下(低电平有效)
If (HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==GPIO_PIN_RESET) {
// 消抖处理
HAL_Delay(DELAY_TIME);
// 再次确认按键是否仍然按下
If(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==GPIO_PIN_RESET) {
HAL_GPIO_WritePin(RED_GPIO_Port,RED_Pin,GPIO_PIN_SET);
// 按键持续按下期间让蜂鸣器发声,同时红色LED长亮
while(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==GPIO_PIN_RESET){
   HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_SET);
   HAL_Delay(BEEP_PERIOD / 2);
   HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_RESET);
   HAL_Delay(BEEP_PERIOD / 2);
 }
  }
}
// 按键松开后,确保蜂鸣器停止发声,同时红色LED熄灭
HAL_GPIO_WritePin(RED_GPIO_Port,RED_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_RESET);
HAL_Delay(10);  //适当延时,降低CPU占用率
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

# 5.1.4 GPIO输入项目下载验证

  • 现象:按下KEY1按键时,蜂鸣器发出“哔—哔”告警声,同时红色LED长亮;松开按键KEY1时,蜂鸣器停止告警,红色LED熄灭。
  • 视频演示勾选生成单独外设文件