51单片机从零到实战(15)——数字时钟温度计

第 15 篇:综合项目------数字时钟 + 温度计

这是本专栏的"毕业设计"------把定时器、LCD、DS18B20、按键、EEPROM 全部整合到一个项目里。


1. 项目功能

复制代码
LCD1602 第一行:HH:MM:SS (实时时钟)
LCD1602 第二行:Temp: XX.X°C (每秒刷新)

按键 K1:进入/退出时间设置模式
按键 K2:在设置模式下,小时+1
按键 K3:在设置模式下,分钟+1

断电再上电:时间从 EEPROM 恢复(精度依赖于晶振)

2. 软件架构

c 复制代码
// ═══ 中断服务 ═══
// 定时器 0:50ms → 时钟基准 + 数码管扫描(如果用了数码管)
// 在本项目中,50ms 仅做时间基准

unsigned char sec, min, hour;
unsigned int tick_50ms = 0;

void timer0_isr(void) interrupt 1 {
    TH0 = 0x4C; TL0 = 0x00;
    tick_50ms++;
}

// ═══ 主循环 ═══
void main() {
    lcd_init();
    timer0_init();

    // 从 EEPROM 恢复时间
    hour = eeprom_read(0x00);
    min  = eeprom_read(0x01);
    sec  = eeprom_read(0x02);

    while (1) {
        // === 时钟更新 ===
        if (tick_50ms >= 20) {  // 1 秒
            tick_50ms = 0;
            sec++;
            if (sec >= 60) { sec=0; min++; }
            if (min >= 60) { min=0; hour++; }
            if (hour >= 24) { hour=0; }

            // 每小时存一次时间到 EEPROM
            if (min==0 && sec==0) {
                eeprom_write(0x00, hour);
                eeprom_write(0x01, min);
            }
        }

        // === 按键处理 ===
        if (KEY1 == 0) {
            delay(20); if (KEY1 == 0) {
                setting_mode = !setting_mode;
                while (KEY1 == 0);
            }
        }
        if (setting_mode) {
            if (KEY2 == 0) { delay(20); if (KEY2==0) { hour=(hour+1)%24; while(KEY2==0); } }
            if (KEY3 == 0) { delay(20); if (KEY3==0) { min=(min+1)%60;  while(KEY3==0); } }
        }

        // === LCD 显示 ===
        lcd_set_cursor(0, 0);
        printf_lcd("%02d:%02d:%02d", hour, min, sec);

        lcd_set_cursor(1, 0);
        printf_lcd("Temp: %.1f", ds18b20_read_temp());
        lcd_write_data(0xDF);
        lcd_print("C");
    }
}

剩下代码放在资源中了,免费获取。

https://download.csdn.net/download/Lumos6fly/93126071?spm=1001.2014.3001.5503

复制代码
---

*下一篇:进阶指南------从这里走向 ARM*
相关推荐
Lzh编程小栈4 小时前
【嵌入式底层】SPI超透彻详解:通信原理、四线结构、四种模式、寄存器底层 + 面试全集
c语言·stm32·单片机·面试·职场和发展
Rocktech_ruixun4 小时前
机器人数据采集能力取决于什么?瑞迅科技RK3588/3576核心板方案深度解析
人工智能·嵌入式硬件·机器人
水果里面有苹果4 小时前
28-DRV8825PWPR步进电机驱动器
单片机
恒锐丰科技韩生5 小时前
率能 SS6625E|3.0~20V 单通道 H 桥直流电机驱动 SOP8 电子锁玩具机器人分享
嵌入式硬件·硬件工程
zlinear数据采集卡5 小时前
D223 ADC数据处理流水线:从原始采样值到工程单位的完整转换链
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
Dr.kangder6 小时前
嵌入式面试总结(十八)——JTAG调试
嵌入式硬件·面试·职场和发展·架构·嵌入式
恒锐丰科技韩生7 小时前
率能 SS6226|2.4~7.2V 低压双通道双 H 桥电机驱动 SOP16 玩具小家电专用芯片
嵌入式硬件·硬件工程
Dr.kangder9 小时前
嵌入式面试总结(十九)——内存泄露
单片机·算法·面试·职场和发展·架构·硬件架构
萌新小白YXY10 小时前
SAE J1587/SAE J1708 协议笔记
笔记·单片机·嵌入式硬件
恒锐丰科技韩生11 小时前
率能 SS6635E|3.0~30V 直流双向 H 桥电机驱动 SOP8 玩具电子锁机器人分享
嵌入式硬件·硬件工程