时生762 2023-11-17 14:55 采纳率: 41.7%
浏览 11
已结题

数字时钟系统实现计时,闹钟开关,定时

51单片机(普中)八位数码管实现计时,闹钟开关,定时,代码和原理图,如果闹钟时间到了且闹钟打开蜂鸣器响,可以通过按键更改时间

  • 写回答

2条回答 默认 最新

  • 噼里啪啦啦 2023-11-17 15:59
    关注

    代码:

    #include <reg51.h>
    
    // 定义按键和LED引脚
    sbit start_stop = P2^0; // 开始/停止按键
    sbit reset = P2^1; // 复位按键
    sbit alarm = P2^2; // 闹钟开关
    sbit led = P2^3; // LED指示灯
    
    // 闹钟参数,以BCD格式存储
    unsigned char alarm_hour = 0x12; // 闹钟小时
    unsigned char alarm_minute = 0x30; // 闹钟分钟
    
    // 定时参数
    unsigned char timer_hour = 0x00; // 定时小时
    unsigned char timer_minute = 0x05; // 定时分钟
    unsigned char timer_second = 0x00; // 定时秒钟
    
    // 定义全局变量
    unsigned char hour = 0x00; // 当前小时
    unsigned char minute = 0x00; // 当前分钟
    unsigned char second = 0x00; // 当前秒钟
    bit is_running = 0; // 计时器是否在运行
    
    // 1ms延时函数
    void delay_ms(unsigned int ms) {
        unsigned int i, j;
        for(i = 0; i < ms; i++) {
            for(j = 0; j < 110; j++);
        }
    }
    
    // 显示时间函数
    void display_time() {
        // 显示小时
        P1 = (hour / 10) << 4 | (hour % 10); 
        P0 = 0xFE; // 第一位数码管亮
        delay_ms(1);
        
        // 显示分钟
        P1 = (minute / 10) << 4 | (minute % 10);
        P0 = 0xFD; // 第二位数码管亮
        delay_ms(1);
        
        // 显示秒钟
        P1 = (second / 10) << 4 | (second % 10);
        P0 = 0xFB; // 第三位数码管亮
        delay_ms(1);
    }
    
    // 更新时间函数
    void update_time() {
        second++;
        if(second >= 60) {
            second = 0;
            minute++;
            if(minute >= 60) {
                minute = 0;
                hour++;
                if(hour >= 24) {
                    hour = 0;
                }
            }
        }
    }
    
    // 闹钟检测函数
    void check_alarm() {
        if(alarm_hour == hour && alarm_minute == minute && alarm == 1) {
            led = 1; // 如果闹钟时间到了且闹钟开关打开,LED亮
        } else {
            led = 0; // 其他情况下LED灭
        }
    }
    
    // 定时器中断处理函数
    void timer_interrupt() interrupt 1 {
        if(is_running) {
            TH0 = 0xFC; // 定时器初值
            TL0 = 0x67;
            update_time();
            display_time();
            check_alarm();
        }
    }
    
    void main() {
        // 初始化定时器
        TMOD = 0x01; // 定时器0,工作方式1
        TH0 = 0xFC; // 初始值
        TL0 = 0x67;
        TR0 = 1; // 启动定时器
        ET0 = 1; // 允许定时器中断
        EA = 1; // 打开总中断
        
        // 主循环
        while(1) {
            // 开始/停止按键
            if(start_stop == 0) {
                is_running = ~is_running; // 切换计时器运行状态
                delay_ms(50); // 延时去抖动
            }
            
            // 复位按键
            if(reset == 0) {
                hour = 0x00;
                minute = 0x00;
                second = 0x00;
                is_running = 0;
                led = 0;
                delay_ms(50); // 延时去抖动
            }
        }
    }
    

    原理图:

                +----[P2.0]---- 开始/停止按键
                |
                +----[P2.1]---- 复位按键
                |
                +----[P2.2]---- 闹钟开关
                |
                +----[P2.3]---- LED指示灯
                |
           +----|----+
           |         |
       +---|--------[P0]--------+
       |   |         |         |
     [P1.0]  [P1.1]  [P1.2]  [P1.3]
      十位  个位  十位  个位 
      数字  数字  数字  数字
      显示  显示  显示  显示
      0~9  0~9  0~9  0~9
    
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月4日
  • 修改了问题 11月17日
  • 修改了问题 11月17日
  • 修改了问题 11月17日
  • 展开全部

悬赏问题

  • ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧,别用大模型回答,大模型的答案没啥用
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error