跟着学习其他大佬搭建环境后,在Mu编辑器上写程序。
目标是实现蜂鸣器驱动,并播放音乐,我选择的是《欢乐颂》。

内容比较简单,直接上代码:
# 设置蜂鸣器连接的引脚(D13)
pwm = pwmio.PWMOut(board.D4, duty_cycle=0, frequency=440, variable_frequency=True)
button2 = digitalio.DigitalInOut(board.D2)
# 8 音阶频率(C4,D4,E4,F4,G4,A4,B4,C5)
# 欢乐颂简谱和时值数组(4/4拍,单位为秒,1为四分音符,2为二分音符,0.5为八分音符)
# 简谱音名与频率映射
note_freq = {
" ": 1,
"do": 131, # 低音do
"re": 147, # 低音re
"mi": 165, # 低音mi
"fa": 175, # 低音mi
"so": 180, # 低音mi
"la": 220, # 低音mi
"1": 262, # do
"2": 294, # re
"3": 330, # mi
"4": 349, # fa
"5": 360, # so
"6": 440, # la
"7": 494, # xi
"1'": 523, # 高音do
"2'": 587, # 高音re
"3'": 659, # 高音mi
"4'": 698, # 高音fa
"5'": 784, # 高音so
}
# 欢乐颂主旋律(简谱和时值,单位秒)
music_notes = [
("3", 0.4), ("3", 0.4), ("4", 0.4), ("5", 0.4), ("5", 0.4), ("4", 0.4), ("3", 0.4), ("2", 0.4),
("1", 0.4), ("1", 0.4), ("2", 0.4), ("3", 0.4), ("3", 0.5), ("2", 0.2), ("2", 0.8),
("3", 0.4), ("3", 0.4), ("4", 0.4), ("5", 0.4), ("5", 0.4), ("4", 0.4), ("3", 0.4), ("2", 0.4),
("1", 0.4), ("1", 0.4), ("2", 0.4), ("3", 0.4), ("2", 0.6), ("1", 0.2), ("1", 0.8),
("2", 0.4), ("2", 0.4), ("3'", 0.4), ("1", 0.4),
("2", 0.4), ("3", 0.2), ("4", 0.2), ("3", 0.4), ("1", 0.4),
("2", 0.4), ("3", 0.2), ("4", 0.2), ("3", 0.4),
("1", 0.4), ("2", 0.4), ("so", 0.2),(" ", 0.2),
("3", 0.4), ("3", 0.4), ("4", 0.4), ("5", 0.4), ("5", 0.4),("4", 0.4), ("3", 0.4),
("4", 0.2), ("2", 0.2),
("1", 0.4), ("1", 0.4), ("2", 0.4), ("3", 0.4), ("2", 0.6), ("1", 0.2), ("1", 1.5)
]
# 按键防抖延迟
DEBOUNCE_TIME = 0.2 # 防抖延时(秒)
# 音符播放时长(秒)
NOTE_DURATION = 0.5 # 每个音符的最大播放时长(秒)
def play_note(note, duration):
frequency = note_freq.get(note, 440)
pwm.frequency = frequency
if note.strip() == " ":
# 空音名,不发声,休止
time.sleep(duration)
else:
pwm.duty_cycle = 2 ** 15 # = 32768 # 50% 占空比
time.sleep(duration*2)
pwm.duty_cycle = 0
time.sleep(0.05)
def play_music():
for note, dur in music_notes:
play_note(note, dur)
time.sleep(1)
# 停止播放音符
def stop_playing():
pwm.duty_cycle = 0
note_index = 0 # 当前音符的索引
last_button_state = False # 上一次的按键状态(上拉状态下,未按下为False)
note_start_time = time.monotonic() # 记录音符播放开始的时间
# 示例调用
while True:
play_music()
我要赚赏金
