基于51单片机倒计时器秒表定时器数码管显示设计
本文介绍了一个基于STC89C52单片机的多功能定时器系统设计。系统采用4位共阳数码管显示时间,具备1-99分钟倒计时设定、精确到秒的实时显示、5秒蜂鸣报警提示、暂停/继续计时等功能。硬件电路包含单片机核心、显示、蜂鸣器、按键和电源模块,采用动态扫描显示和NPN三极管驱动蜂鸣器。软件设计采用模块化编程,包括主程序、按键处理、倒计时控制、数码管显示和蜂鸣报警等模块。系统具有操作简便、显示直观、提示及
·
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 秒进行提示,结束时持续鸣叫,防止错过提醒。
- 可扩展性强:本系统可通过修改程序扩展为正计时秒表、增加多种提示方式等。
- 稳定可靠:硬件电路简单,抗干扰能力强,适合家用、实验室、运动训练等多种场合。
通过本设计,用户可以方便地进行时间管理与提醒,大幅提升日常工作与生活的效率与安全性。
更多推荐



所有评论(0)