from machine import Pin, PWM # 导入GPIO引脚和PWM控制模块
import time # 导入时间控制模块
# ===== 硬件初始化部分 =====
# 初始化板载LED和蜂鸣器
led_onboard = Pin('LED', Pin.OUT) # 板载LED作为状态指示器
buzzer = PWM(Pin(28)) # 蜂鸣器连接到GPIO 28
# 初始化数码管显示引脚
leds = [Pin(i, Pin.OUT) for i in range(7)] # A-G段选引脚
dig1 = Pin(7, Pin.OUT) # 第一个数码管位选引脚
dig2 = Pin(8, Pin.OUT) # 第二个数码管位选引脚
# 阳极连接方式:1表示高电平有效,0表示低电平有效
Anode = 1
# 数字映射表 - 定义0-9十个数字对应的七段数码管显示编码
# 每个数字对应A-G七个段的状态,1表示点亮,0表示熄灭
digit_map = [
#A, B, C, D, E, F, G
[1, 1, 1, 1, 1, 1, 0], # 0
[0, 1, 1, 0, 0, 0, 0], # 1
[1, 1, 0, 1, 1, 0, 1], # 2
[1, 1, 1, 1, 0, 0, 1], # 3
[0, 1, 1, 0, 0, 1, 1], # 4
[1, 0, 1, 1, 0, 1, 1], # 5
[1, 0, 1, 1, 1, 1, 1], # 6
[1, 1, 1, 0, 0, 0, 0], # 7
[1, 1, 1, 1, 1, 1, 1], # 8
[1, 1, 1, 1, 0, 1, 1] # 9
]
# ===== 基础功能函数 =====
def beep(buzzer, frequency, duration):
"""控制蜂鸣器发出指定频率的声音"""
buzzer.freq(frequency) # 设置PWM频率
buzzer.duty_u16(32767) # 设置50%占空比(最大为65535)
time.sleep(duration) # 持续指定时间
buzzer.duty_u16(0) # 关闭蜂鸣器
def show(num):
"""在数码管上显示指定数字"""
values = digit_map[num] # 获取数字对应的段码
for i in range(len(leds)): # 循环设置每个段的状态
leds[i].value(values[i])
def clear():
"""清除数码管显示"""
for led in leds:
led.value(0) # 所有段设置为关闭状态
def display(num1, num2, dis_time):
"""在两个数码管上交替显示两个数字
参数:
num1: 第一个数码管显示的数字
num2: 第二个数码管显示的数字
dis_time: 显示总时间(秒)
"""
time_slide = 0.005 # 刷新时间间隔(5毫秒)
ticks = dis_time // time_slide # 计算需要刷新的次数
while ticks > 0:
# 交替显示两个数码管
if num1 and ticks % 2 == 0:
dig1.value(0) # 选择第一个数码管
dig2.value(1)
show(num1) # 显示第一个数字
time.sleep(time_slide)
else:
dig1.value(1) # 选择第二个数码管
dig2.value(0)
show(num2) # 显示第二个数字
time.sleep(time_slide)
clear() # 清除显示,避免残影
ticks -= 1
# ===== 高级功能函数 =====
def alarm_sound():
"""蜂鸣器报警功能 - 倒计时结束时触发"""
for _ in range(30): # 循环30次,每次0.1秒,总计3秒
beep(buzzer, 800, 0.05) # 以800Hz频率发声0.05秒
time.sleep(0.05) # 暂停0.05秒,形成间断音
def countdown(seconds):
"""倒计时功能 - 按分钟和秒显示
参数:
seconds: 倒计时总秒数
"""
while seconds >= 0: # 当剩余时间大于等于0时继续循环
# 计算当前分钟和秒数
minutes = seconds // 60 # 整除得到分钟数
secs = seconds % 60 # 取余得到秒数
# 显示分钟的十位和个位
display(minutes // 10, minutes % 10, 0.5) # 刷新分钟显示0.5秒
# 显示秒的十位和个位
display(secs // 10, secs % 10, 0.5) # 刷新秒数显示0.5秒
# 闪烁板载LED,指示程序运行状态
led_onboard.toggle()
# 倒计时减1秒
seconds -= 1
# 倒计时结束,触发蜂鸣器报警
alarm_sound()
# ===== 主程序部分 =====
# 方式1:使用倒计时函数从100秒开始倒计时
# countdown(100)
# 方式2:使用for循环实现从0到99的正序计数
for i in range(100): # 循环100次,从0到99
# 计算当前数字的十位和个位
tens = i // 10 # 十位数字(整除10)
ones = i % 10 # 个位数字(取余10)
# 在两个数码管上显示当前数字,持续1秒
display(tens, ones, 1)
# 控制板载LED闪烁,指示程序运行状态
led_onboard.toggle()
# 等待1秒,控制计数速度
time.sleep(1)
# 数字显示结束,触发蜂鸣器提示
alarm_sound()