第 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*