一 本章简介
本章介绍如何使用 MicroPython 控制筑基学习板上的有源蜂鸣器。有源蜂鸣器内部自带振荡电路,只需要给一个高低电平就能发声,不需要像无源蜂鸣器那样提供特定频率的 PWM 信号,因此非常适合作为 GPIO 输出的入门实验。常见的应用场景包括按键提示音、报警提醒、状态指示等,筑基学习板为了适配更广的学习要求,同时板载了两个蜂鸣器,一个有源的,一个无源的。
IMPORTANT
筑基学习板上的有源蜂鸣器和无源蜂鸣器共用同一个引脚 PA6,通过 8 路拨码开关的 BIT4 来切换。使用有源蜂鸣器时,BIT4 必须拨到 OFF 位置(默认状态)。如果 BIT4 处于 ON 位置,PA6 的信号会被路由到无源蜂鸣器。
1.1 学习目标
| 序号 | 学习目标 | 重要程度 |
|---|---|---|
| 1 | 了解有源蜂鸣器与无源蜂鸣器的区别 | ⭐⭐⭐⭐⭐ |
| 2 | 掌握使用 GPIO 控制有源蜂鸣器发声的方法 | ⭐⭐⭐⭐⭐ |
| 3 | 理解拨码开关 BIT4 对蜂鸣器选择的作用 | ⭐⭐⭐⭐⭐ |
| 4 | 能够实现报警音、提示音、节奏音效等功能 | ⭐⭐⭐⭐ |
1.2 重点提示
- 有源蜂鸣器的控制引脚为 PA6,高电平发声,低电平静音。
- 使用前必须确认拨码开关 BIT4 处于 OFF 位置(默认状态),否则信号会被路由到无源蜂鸣器。这是初学者最容易忽略的一步,如果蜂鸣器不响,请第一时间检查拨码开关。
- 有源蜂鸣器内部自带振荡电路,发出的是固定频率的声音(通常在 2~4kHz 左右,筑基学习板板载的3KHZ的有源蜂鸣器),无法改变音调。如果需要播放不同音调的旋律,应使用无源蜂鸣器(BIT4 拨到 ON,用 PWM 驱动)。
- PA6 同时也是 TIM13_CH1 的 PWM 输出通道,本章只用到普通 GPIO 输出功能。PWM 功能将在无源蜂鸣器章节中介绍。
1.3 基础概念与术语
- 有源蜂鸣器(Active Buzzer):内部集成了振荡驱动电路,只需提供直流电压(高低电平)即可发出固定频率的声音。"有源"指的是内部有源(有振荡源),不是指需要外部电源。
- 无源蜂鸣器(Passive Buzzer):内部没有振荡电路,需要外部提供特定频率的方波(PWM)信号才能发声,频率不同则音调不同,可以用来演奏旋律。
- 拨码开关(DIP Switch):筑基学习板上的 8 路拨码开关,用于切换共用引脚的不同功能。BIT4 控制 PA6 连接到有源蜂鸣器还是无源蜂鸣器。
二 硬件说明

左边的是无源蜂鸣器,右边的是有源蜂鸣器,
2.1 有源蜂鸣器与无源蜂鸣器的区别
筑基学习板上同时板载了一个有源蜂鸣器和一个无源蜂鸣器,它们共用 PA6 引脚,通过模拟开关切换:
| 特性 | 有源蜂鸣器 | 无源蜂鸣器 |
|---|---|---|
| 内部振荡电路 | 有 | 无 |
| 驱动方式 | 高低电平(GPIO) | PWM 方波信号 |
| 音调 | 固定(不可调) | 可调(由 PWM 频率决定) |
| 适用场景 | 报警、提示音 | 播放旋律、不同音调 |
| 拨码 BIT4 | OFF(默认) | ON |
TIP
简单记忆:有源蜂鸣器 = 给电就响,无源蜂鸣器 = 给频率才响。本章只讲有源蜂鸣器,无源蜂鸣器将在后续 PWM 相关章节中介绍。
2.2 电路原理

筑基学习板上,PA6 的信号经过一个单刀双掷模拟开关后,分别连接到有源蜂鸣器和无源蜂鸣器:
2.3 蜂鸣器资源汇总
| 参数 | 说明 |
|---|---|
| 控制引脚 | PA6 |
| 发声电平 | 高电平(1) |
| 静音电平 | 低电平(0) |
| 拨码开关 | BIT4 = OFF(默认状态) |
| 蜂鸣器类型 | 有源(内置振荡电路) |
| 供电 | 5V(由底板供电) |
2.4 拨码开关 BIT4 设置
CAUTION
使用有源蜂鸣器前,请务必确认 8 路拨码开关的 BIT4 处于 OFF 位置(向下拨)。这是出厂默认状态,如果之前做过无源蜂鸣器实验,可能已经被拨到了 ON 位置。
拨码开关位于筑基学习板的右侧区域,BIT4 的两种状态:
| BIT4 状态 | 效果 |
|---|---|
| OFF(默认,向下) | PA6 连接到有源蜂鸣器 |
| ON(向上) | PA6 连接到无源蜂鸣器 |
如果你不确定当前拨码开关的状态,可以直接目视检查,或者在 REPL 中运行一段简单的测试代码(见下文),听是否有声音来判断。
三 软件设计
3.1 基础部分
3.1.1 让蜂鸣器响一声
最简单的操作——让蜂鸣器响一下:
# 有源蜂鸣器基本控制
from pyb import Pin, delay
# PA4 推挽输出,高电平发声
buzzer = Pin('PA6', Pin.OUT_PP)
# 默认静音
buzzer.low()
# 响一声(200ms)
buzzer.high()
delay(200)
buzzer.low()
print("滴!")2
3
4
5
6
7
8
9
10
11
12
13
14
15
TIP
如果运行代码后没有听到声音,请检查:
- 拨码开关 BIT4 是否在 OFF 位置
- 筑基学习板是否已正确供电
3.1.2 封装蜂鸣器控制函数
# 有源蜂鸣器控制封装
from pyb import Pin, delay
buzzer_pin = Pin('PA6', Pin.OUT_PP)
buzzer_pin.low() # 初始静音
def beep(duration_ms=100):
"""发出一声提示音"""
buzzer_pin.high()
delay(duration_ms)
buzzer_pin.low()
def beep_n(times=3, on_ms=100, off_ms=100):
"""连续发出 n 声提示音"""
for i in range(times):
buzzer_pin.high()
delay(on_ms)
buzzer_pin.low()
if i < times - 1:
delay(off_ms)
# 短促提示音
beep(100)
delay(500)
# 三声短促提示
beep_n(3, 80, 80)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
3.1.3 滴滴滴报警音
# 滴滴滴报警音
from pyb import Pin, delay
buzzer = Pin('PA6', Pin.OUT_PP)
buzzer.low()
print("报警模式启动,Ctrl+C 停止")
try:
while True:
# 急促的短音
for _ in range(5):
buzzer.high()
delay(100)
buzzer.low()
delay(100)
# 间隔
delay(500)
except KeyboardInterrupt:
buzzer.low()
print("已停止")2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
3.2 进阶部分
3.2.1 按键控制蜂鸣器
按下 PA0 按键时蜂鸣器响,松开时停止:
# 按键控制蜂鸣器
from pyb import Pin, delay
btn = Pin('PA0', Pin.IN, Pin.PULL_DOWN)
buzzer = Pin('PA6', Pin.OUT_PP)
buzzer.low()
print("按住 PA0 按键,蜂鸣器发声")
while True:
if btn.value() == 1:
buzzer.high()
else:
buzzer.low()
delay(10)2
3
4
5
6
7
8
9
10
11
12
13
14
15
3.2.2 不同节奏的提示音模式
在实际产品项目中,不同的提示音节奏代表不同的含义。下面实现几种常见的提示音模式:
# 多种提示音模式
from pyb import Pin, delay
buzzer = Pin('PA6', Pin.OUT_PP)
buzzer.low()
def play_pattern(pattern):
"""
播放提示音模式
pattern: 列表,每个元素为 (响/静, 时长ms)
True=响, False=静
"""
for state, duration in pattern:
if state:
buzzer.high()
else:
buzzer.low()
delay(duration)
buzzer.low()
# 模式1:开机提示音(短-短-长)
boot_sound = [
(True, 80), (False, 80),
(True, 80), (False, 80),
(True, 300), (False, 100),
]
# 模式2:错误提示音(长-长-长)
error_sound = [
(True, 300), (False, 200),
(True, 300), (False, 200),
(True, 300), (False, 100),
]
# 模式3:成功提示音(短-短)
success_sound = [
(True, 50), (False, 50),
(True, 50), (False, 100),
]
# 模式4:警告提示音(急促连续短音)
warning_sound = []
for _ in range(10):
warning_sound.append((True, 50))
warning_sound.append((False, 50))
print("播放开机提示音")
play_pattern(boot_sound)
delay(1000)
print("播放成功提示音")
play_pattern(success_sound)
delay(1000)
print("播放错误提示音")
play_pattern(error_sound)
delay(1000)
print("播放警告提示音")
play_pattern(warning_sound)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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
3.2.3 蜂鸣器类封装(工程实践)
# 有源蜂鸣器驱动类
from pyb import Pin, delay
class ActiveBuzzer:
"""
有源蜂鸣器驱动类
active_high: True 表示高电平发声(默认),False 表示低电平发声
"""
def __init__(self, pin_name, active_high=True):
self.pin = Pin(pin_name, Pin.OUT_PP)
self.active_high = active_high
self.off()
def on(self):
"""开始发声"""
if self.active_high:
self.pin.high()
else:
self.pin.low()
def off(self):
"""停止发声"""
if self.active_high:
self.pin.low()
else:
self.pin.high()
def beep(self, duration_ms=100):
"""发出一声提示音"""
self.on()
delay(duration_ms)
self.off()
def beep_n(self, times=3, on_ms=100, off_ms=100):
"""连续发出 n 声提示音"""
for i in range(times):
self.on()
delay(on_ms)
self.off()
if i < times - 1:
delay(off_ms)
# 使用示例
buzzer = ActiveBuzzer('PA6', active_high=True)
buzzer.beep(200) # 响 200ms
delay(500)
buzzer.beep_n(3, 80, 80) # 三声短促提示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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
3.2.4 按键 + 继电器 + 蜂鸣器联动
结合前面学过的按键和继电器,实现一个简单的联动效果——按下按键时,继电器吸合并发出提示音:
# 按键 + 继电器 + 蜂鸣器联动
from pyb import Pin, LED
import pyb
btn = Pin('PA0', Pin.IN, Pin.PULL_DOWN)
relay = Pin('PA4', Pin.OUT_PP)
buzzer = Pin('PA6', Pin.OUT_PP)
led = LED(1)
# 初始状态
relay.high() # 继电器释放
buzzer.low() # 蜂鸣器静音
led.off()
is_on = False
last_press = 0
print("按 PA0 切换继电器,蜂鸣器提示")
while True:
if btn.value() == 1:
now = pyb.millis()
if now - last_press > 300:
last_press = now
is_on = not is_on
if is_on:
relay.low() # 继电器吸合
led.on()
# 短促提示音:接通
buzzer.high()
pyb.delay(50)
buzzer.low()
pyb.delay(50)
buzzer.high()
pyb.delay(50)
buzzer.low()
print("ON")
else:
relay.high() # 继电器释放
led.off()
# 长提示音:断开
buzzer.high()
pyb.delay(200)
buzzer.low()
print("OFF")
pyb.delay(10)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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
四 常见问题
Q: 代码运行了,但蜂鸣器没有声音?
这是最常见的问题,按以下顺序排查:
- 检查拨码开关 BIT4:必须在 OFF 位置(向下)。这是第一优先级检查项。
- 检查供电:筑基学习板需要正常供电,蜂鸣器使用 5V 电源驱动。仅靠 TYPE-C 供电通常来说是可以的,但如果同时驱动了其他大功率外设,可能供电不足。
- 检查引脚:确认代码中使用的是
PA6,不要和继电器的PA4搞混。
Q: 有源蜂鸣器能发出不同音调吗?
不能。有源蜂鸣器内部有固定频率的振荡电路,发出的音调是固定的。如果需要不同音调,请使用无源蜂鸣器(BIT4 拨到 ON,用 PWM 驱动),将在后续章节介绍。
Q: 可以通过软件切换有源/无源蜂鸣器吗?
可以。拨码开关连接到了 PCA9555PW IO 扩展芯片的 IO0 端口,可以通过 I2C 软件控制来切换,且软件控制的优先级高于硬件拨码。但在学习阶段,建议直接手动拨动拨码开关,更直观。