1 系统功能介绍

本设计基于 STC89C52 单片机 实现了一个具有倒计时、暂停、恢复及蜂鸣器提示功能的多用途定时器/秒表系统。系统使用 4 位共阳数码管 进行时间显示,按键操作简洁直观,能够满足日常倒计时提醒的需求。主要功能如下:

  1. 倒计时设定:用户可通过按键设置倒计时时间,范围为 1~99 分钟,满足大部分日常计时需求。
  2. 实时显示:4 位共阳数码管实时显示剩余时间,精确到秒。
  3. 蜂鸣器提示:当倒计时剩余 5 秒时,蜂鸣器会发出间歇报警声提示用户即将结束。
  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. 时间设定键:循环设置分钟数(1~99 分钟)。
    2. 启动/暂停键:控制倒计时运行或暂停。
    3. 复位键:停止计时并回到初始设定值。
  • 电路设计:按键一端接地,另一端接单片机 I/O 口并上拉电阻,通过轮询或中断检测按键状态,软件去抖动处理。

2.5 电源模块

  • 功能:为整个系统提供稳定的直流 5V 电压。

  • 设计方案

    • 使用 220V AC 适配器输出 9V DC,经 LM7805 稳压器降压至 5V。
    • 滤波电容 C1、C2 保证输出电压稳定。

3 程序设计

系统程序分为 主程序按键处理模块倒计时控制模块数码管显示模块蜂鸣器报警模块 等部分,采用结构化编程便于维护。

3.1 主程序流程

  1. 系统初始化(I/O、定时器、显示、按键)
  2. 循环检测按键状态,更新设定时间或控制倒计时状态
  3. 定时器中断每秒更新一次剩余时间
  4. 当剩余时间 ≤ 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 系统特点与总结

  1. 操作简单:通过三个按键即可完成时间设定、启动/暂停及复位操作。
  2. 显示直观:4 位数码管清晰显示分钟与秒数,方便用户快速读取时间。
  3. 提示及时:蜂鸣器在倒计时最后 5 秒进行提示,结束时持续鸣叫,防止错过提醒。
  4. 可扩展性强:本系统可通过修改程序扩展为正计时秒表、增加多种提示方式等。
  5. 稳定可靠:硬件电路简单,抗干扰能力强,适合家用、实验室、运动训练等多种场合。

通过本设计,用户可以方便地进行时间管理与提醒,大幅提升日常工作与生活的效率与安全性。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐