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*
相关推荐
gwf2161 小时前
磨损均衡算法(Wear Leveling)——SSD如何让每块闪存“公平退休“?
运维·数据库·人工智能·python·嵌入式硬件·算法·智能硬件
zlinear数据采集卡3 小时前
从“脏信号”到“纳伏级纯净”:硬核拆解DABL7606的多级抗混叠滤波与24位过采样算法
arm开发·科技·嵌入式硬件·fpga开发·开源
碎光拾影5 小时前
I2C总线通信全解析:从原理到实战
单片机·嵌入式硬件
愈心凌6 小时前
SSI 绝对值编码器通信 - 单片机TM32Cubemax配置教程
单片机·嵌入式硬件
科芯创展6 小时前
1.5A,5.5VIN,单灯,XZ4059A/D,4.2V/4.34V
单片机
江哥工作室6 小时前
几分钱的 LM358 采集心电
单片机·lm358·心电·小信号
迷茫不知归路6 小时前
简单认识一种外设硬件:温度传感器ds18b20
嵌入式硬件
z20348315206 小时前
CLion开发STM32——文件管理
stm32·单片机·嵌入式硬件·clion
weixin_452077647 小时前
STM32 烧录程序后上电不工作问题集合
stm32·单片机·嵌入式硬件