基于51单片机倒计时器秒表定时器数码管显示设计
1 系统功能介绍
本设计基于 STC89C52 单片机 实现了一个具有倒计时、暂停、恢复及蜂鸣器提示功能的多用途定时器/秒表系统。系统使用 4 位共阳数码管 进行时间显示,按键操作简洁直观,能够满足日常倒计时提醒的需求。主要功能如下:
- 倒计时设定:用户可通过按键设置倒计时时间,范围为 1~99 分钟,满足大部分日常计时需求。
- 实时显示:4 位共阳数码管实时显示剩余时间,精确到秒。
- 蜂鸣器提示:当倒计时剩余 5 秒时,蜂鸣器会发出间歇报警声提示用户即将结束。
- 暂停与继续:倒计时过程中可随时暂停,暂停后可继续计时,不会丢失当前时间。
- 低功耗设计:在暂停状态下,系统进入低功耗模式,仅保留按键检测与数码管显示。
2 系统电路设计
系统采用模块化电路结构,分为单片机核心电路、显示模块、蜂鸣器模块、按键输入模块以及电源模块。
2.1 单片机核心电路
- 核心器件:STC89C52 单片机,兼容 MCS-51 指令系统,内置 8KB Flash,I/O 口资源充足,能够同时管理按键输入、数码管显示及蜂鸣器控制。
- 晶振电路:采用 11.0592 MHz 晶振及两个 30pF 电容构成振荡电路,为系统提供稳定的时钟源。
- 复位电路:上电自动复位电路及手动复位按键,确保系统在意外状态下可快速恢复。
2.2 显示模块——4 位共阳数码管
- 功能:用于显示当前倒计时剩余时间,显示格式为
MM:SS
。 - 连接方式:数码管的公共阳极端接至 VCC,每位的阴极端通过限流电阻连接至单片机的段选 I/O 口,位选端由单片机控制。
- 显示原理:采用动态扫描方式,每次点亮一位并快速切换,通过人眼视觉暂留实现稳定显示。
2.3 蜂鸣器模块
- 功能:在倒计时最后 5 秒内发出间歇声音提示用户注意。
- 驱动方式:采用 NPN 三极管驱动有源蜂鸣器,单片机 I/O 口输出控制信号,经三极管放大后驱动蜂鸣器工作。
- 报警模式:蜂鸣器以 500ms 周期进行响-停交替,直至倒计时结束。
2.4 按键输入模块
-
功能:用于设置时间、启动/暂停倒计时。
-
按键功能:
- 时间设定键:循环设置分钟数(1~99 分钟)。
- 启动/暂停键:控制倒计时运行或暂停。
- 复位键:停止计时并回到初始设定值。
-
电路设计:按键一端接地,另一端接单片机 I/O 口并上拉电阻,通过轮询或中断检测按键状态,软件去抖动处理。
2.5 电源模块
-
功能:为整个系统提供稳定的直流 5V 电压。
-
设计方案:
- 使用 220V AC 适配器输出 9V DC,经 LM7805 稳压器降压至 5V。
- 滤波电容 C1、C2 保证输出电压稳定。
3 程序设计
系统程序分为 主程序、按键处理模块、倒计时控制模块、数码管显示模块、蜂鸣器报警模块 等部分,采用结构化编程便于维护。
3.1 主程序流程
- 系统初始化(I/O、定时器、显示、按键)
- 循环检测按键状态,更新设定时间或控制倒计时状态
- 定时器中断每秒更新一次剩余时间
- 当剩余时间 ≤ 5 秒时,启动蜂鸣器报警
3.2 按键处理模块
3.2.1 功能
- 检测用户按键输入,执行时间设定、启动、暂停、复位等操作。
- 按键去抖动保证输入准确。
3.2.2 样例代码
void key_scan(void) {if(KEY_SET == 0) { // 时间设定键delay_ms(20);if(KEY_SET == 0) {minutes++;if(minutes > 99) minutes = 1;}while(KEY_SET == 0);}if(KEY_START_PAUSE == 0) { // 启动/暂停键delay_ms(20);if(KEY_START_PAUSE == 0) {running = !running; // 切换运行状态}while(KEY_START_PAUSE == 0);}if(KEY_RESET == 0) { // 复位键delay_ms(20);if(KEY_RESET == 0) {minutes = set_minutes;seconds = 0;running = 0;}while(KEY_RESET == 0);}
}
3.3 倒计时控制模块
3.3.1 功能
- 每秒减少 1 秒时间,当秒数为 0 时减少分钟数。
- 当剩余时间 ≤ 5 秒时触发蜂鸣器报警。
3.3.2 样例代码
void timer_interrupt(void) interrupt 1 {TH0 = (65536 - 46080) / 256;TL0 = (65536 - 46080) % 256;if(running) {tick++;if(tick >= 20) { // 50ms*20 = 1秒tick = 0;if(seconds > 0) {seconds--;} else {if(minutes > 0) {minutes--;seconds = 59;} else {running = 0;buzzer_on();}}if(minutes == 0 && seconds <= 5 && seconds > 0) {buzzer_toggle();}}}
}
3.4 数码管显示模块
3.4.1 功能
- 采用动态扫描方式显示
MMSS
格式时间。 - 在暂停状态下保持显示不变。
3.4.2 样例代码
void display_time(void) {unsigned char code seg_code[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};unsigned char digits[4];digits[0] = minutes / 10;digits[1] = minutes % 10;digits[2] = seconds / 10;digits[3] = seconds % 10;for(unsigned char i=0;i<4;i++) {P0 = seg_code[digits[i]];P2 = 1 << i;delay_ms(2);P2 = 0x00;}
}
3.5 蜂鸣器报警模块
3.5.1 功能
- 控制蜂鸣器在倒计时最后 5 秒间歇发声。
- 倒计时结束时持续鸣叫 3 秒。
3.5.2 样例代码
void buzzer_on(void) {BUZZER = 0;
}void buzzer_off(void) {BUZZER = 1;
}void buzzer_toggle(void) {BUZZER = !BUZZER;
}
4 系统特点与总结
- 操作简单:通过三个按键即可完成时间设定、启动/暂停及复位操作。
- 显示直观:4 位数码管清晰显示分钟与秒数,方便用户快速读取时间。
- 提示及时:蜂鸣器在倒计时最后 5 秒进行提示,结束时持续鸣叫,防止错过提醒。
- 可扩展性强:本系统可通过修改程序扩展为正计时秒表、增加多种提示方式等。
- 稳定可靠:硬件电路简单,抗干扰能力强,适合家用、实验室、运动训练等多种场合。
通过本设计,用户可以方便地进行时间管理与提醒,大幅提升日常工作与生活的效率与安全性。