5.1 GPIO输入项目:按键触发声光告警
# 5.1 GPIO输入项目:按键触发声光告警
本项目通过GPIO控制按键开关、蜂鸣器与LED的交互联动。当按键按下,PB5引脚输出方波信号,驱动无源蜂鸣器发声,同时让LED发光,实现声光告警;按键松开后,PB5引脚停止输出方波信号,蜂鸣器停止发声,LED熄灭,声光告警结束。
# 5.1.1 硬件设计
# 红色LED电路
- 红色LED的阴极接地,阳极串联1kΩ限流电阻后接入PB0引脚
# 按键电路
- 常开型设计:KEY1~KEY4共地连接,经10KΩ上拉电阻接入PC13/PB12/PB14/PB15,并联电容抑制抖动。
# 蜂鸣器电路
- 无源蜂鸣器驱动:PB5通过NPN三极管控制电流通路,输出方波驱动发声。
# 5.1.2 STM32CubeMX配置
# 1. 新建工程
创建工程"05 GPIO_INPUT",选择芯片STM32F103C8T6:
# 2. 配置Debug模式
启用SWD调试功能:
# 3. 引脚配置
- PC13设为GPIO_Input(标签KEY1)
- PB5设为GPIO_Output(标签BEEP)
# 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
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
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熄灭。
- 视频演示: