【51单片机】万年历功能的数字时钟+倒计时 Proteus仿真 普中板子可用

// 硬件:DS1302、按键、LCD1602、无源蜂鸣器
// 1、具有万年历功能的数字时钟 (本世纪100年通用),能够正确的显示年、月、日、时、分、秒
// 2、按键设置时间(校时)
// 3、24小时内至少可设置3个闹钟,并具有不同的闹钟铃声。每个闹钟可以选择启用或者不启用。
// 4、具有秒表功能(计时精度0.1秒)
// 5、其它与数字时钟相关的功能扩展(整点报时、闹钟时间掉电保存功能AT24C02、)
//按键1 可以设置时间切换,秒表下是开始
//按键2 可以设置时间切换,秒表下是暂停
//按键3 可以设置闹钟切换,秒表下是复位
//按键4 可以设置闹钟切换
//按键5 +
//按键6 -
//按键7 直接回到主页面
//按键8 进入秒表

主页面:
在这里插入图片描述
闹钟0设置:
在这里插入图片描述
闹钟1设置:
在这里插入图片描述
闹钟2设置:
在这里插入图片描述
秒表:
在这里插入图片描述

部分源码:


void main() {

    char miaoa = 0;
    char ifg = 0;
    unsigned char keyvl = 0;

    LCD_init();
    x24c02_init();
    ds1302_init();

    // LCD_write_str(1, 1, "2223123");

    get_time(&rtctime); /* 调用取时间函数 */

    ifg = 0;
    if (rtctime.nian > 99)
        ifg = 1;
    if (rtctime.yue > 12)
        ifg = 1;
    if (rtctime.ri > 31)
        ifg = 1;
    if (rtctime.zhou > 7)
        ifg = 1;
    if (rtctime.shi > 23)
        ifg = 1;
    if (rtctime.fen > 59)
        ifg = 1;
    if (rtctime.miao > 59)
        ifg = 1;

    if (ifg == 1) /* 如果时间有问题 就初始化时间 */
    {
        rtctime.nian = 20;
        rtctime.yue = 10;
        rtctime.ri = 10;
        rtctime.zhou = getWeekdayByYearday(rtctime.nian + 2000, rtctime.yue, rtctime.ri);
        rtctime.shi = 7;
        rtctime.fen = 59;
        rtctime.miao = 58;
        set_time(&rtctime);
    }

    read_alarm();
    ifg = 0;
    if ((ALARMtime.shi > 23) || (ALARMtime.shi < 0))
        ifg = 1;
    if ((ALARMtime.fen > 59) || (ALARMtime.fen < 0))
        ifg = 1;
    if ((ALARMtime.miao > 59) || (ALARMtime.miao < 0))
        ifg = 1;
    if ((ALARMtime1.shi > 23) || (ALARMtime1.shi < 0))
        ifg = 1;
    if ((ALARMtime1.fen > 59) || (ALARMtime1.fen < 0))
        ifg = 1;
    if ((ALARMtime1.miao > 59) || (ALARMtime1.miao < 0))
        ifg = 1;
    if ((ALARMtime2.shi > 23) || (ALARMtime2.shi < 0))
        ifg = 1;
    if ((ALARMtime2.fen > 59) || (ALARMtime2.fen < 0))
        ifg = 1;
    if ((ALARMtime2.miao > 59) || (ALARMtime2.miao < 0))
        ifg = 1;
    if (ifg == 1) /* 如果时间有问题 就初始化  闹钟 */
    {

        ALARMtime.shi = 10;
        ALARMtime.fen = 0;
        ALARMtime.miao = 0;
        ALARMtime1.shi = 10;
        ALARMtime1.fen = 5;
        ALARMtime1.miao = 0;
        ALARMtime2.shi = 10;
        ALARMtime2.fen = 10;
        ALARMtime2.miao = 0;
        write_alarm();
    }

    init_timer0();
    init_timer1();

    while (1) {
        delay_ms(10);
        keyvl = getkey();
        if (keyvl) {
            user_pro_key(keyvl);
            while (getkey())
                ;
        }
        if (set == 0) {
            get_time(&rtctime); /* 调用取时间函数 */
            if (miaoa != rtctime.miao) {
                miaoa = rtctime.miao;
                user_lcd_display(); /* 刷新显示 */
                user_zheng_con();   /* 整点报时控制 */
                user_alarm_con();   /* 闹钟控制 */
            }
        }
        if (naozhong_music) {
            music_beep(naozhong_music);
        }

        if (set == 19) {
            if (TR0 == 1) {
                /* 秒表 unsigned char num=0,ms100=0,second100=0,minute100=0; */
                memset(xianshi, 0, sizeof(xianshi));                                            /* 清空 */
                sprintf(xianshi, "%02d:%02d:%01d", (int)minute100, (int)second100, (int)ms100); /* 装填 */
                LCD_write_str(0, 1, xianshi);
            }
        }
    }
}

void T0_time0(void) interrupt 1 {
    TH0 = (65536 - 50000) / 256;
    TL0 = (65536 - 50000) % 256;
    num2++;
    if (num2 == 2) /* 1秒 */
    {
        num2 = 0;
        ms100++;
        if (ms100 == 10) {
            ms100 = 0;
            second100++;
            if (second100 == 60) {
                second100 = 0;
                minute100++;
            }
        }
    }
}



全部代码见:dt4.8tupian.net/2/28880a11b7000.pg3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值