news 2026/1/25 13:46:16

基于 AT89C51 的 LCD 时钟(带校准 + 按键设置)—— 硬件 + 源码详解(普中51开发板可以直接使用程序,后附带项目源文件)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于 AT89C51 的 LCD 时钟(带校准 + 按键设置)—— 硬件 + 源码详解(普中51开发板可以直接使用程序,后附带项目源文件)

一、项目概述

这个时钟实现了以下功能:

  • 实时显示时:分:秒,区分设置模式(SET)运行模式(RUN)
  • 按键控制:加/减调整时间、确认切换设置项 / 退出设置、重置恢复初始时间;
  • 走时校准:通过补偿值调整计时精度,解决晶振误差问题;
  • LCD1602 双行显示:第一行显示时间 + 模式,第二行显示校准值 + 设置提示。

二、硬件电路设计

电路图核心模块如下:

2.1 单片机最小系统

  • 主控:AT89C51;
  • 晶振电路:11.0592MHz 晶振(X1)+ 22pF 电容(C1、C2),保证串口 / 定时器时序稳定;
  • 复位电路:10K 电阻 + 电容(C3)实现上电复位,搭配手动复位按键。

2.2 LCD1602 显示模块

  • 数据口:LCD 的 D0~D7 接单片机 P0 口(P0.0~P0.7);
  • 控制口:RS=P2^6、RW=P2^5、EN=P2^7;
  • 对比度调节:电位器 RV1 接 LCD 的 VO 引脚,用于调整显示清晰度。

2.3 按键输入模块

所有按键采用上拉输入(接地式),对应引脚:

  • 加按键:P3^0;
  • 减按键:P3^1;
  • 确认按键:P3^2;
  • 重置按键:P3^3(最高优先级,任何时候按下都能复位时间)。

三、软件程序设计

代码基于 Keil C51 编写,采用模块化设计,核心模块解析如下:

3.1 核心模块解析

3.1.1 LCD1602 驱动模块

负责 LCD 的初始化、写指令、写数据,是显示功能的基础:

// 写LCD指令(控制显示模式、光标等) void write_com(uchar com) { P0 = com; RS=0; RW=0; EN=1; // RS=0表示写指令 delay(1); EN=0; // 拉低EN完成写入 } // 写LCD数据(显示字符) void write_dat(uchar dat) { P0 = dat; RS=1; RW=0; EN=1; // RS=1表示写数据 delay(1); EN=0; } // LCD初始化:8位数据、2行显示、5*7点阵 void lcd_init() { write_com(0x38); write_com(0x0C); // 开显示、关光标 write_com(0x06); // 写数据后光标右移 write_com(0x01); // 清屏 }
3.1.2 定时器 0 计时模块

利用定时器 0 实现1ms 基准延时,累计到 1 秒后更新时间,同时支持走时校准

void timer0_init() { TMOD |= 0x01; // 定时器0工作在16位模式 TH0 = 0xDB; // 11.0592MHz下1ms初值:TH0=0xDB, TL0=0xF8 TL0 = 0xF8; ET0 = 1; // 使能定时器0中断 TR0 = 1; // 启动定时器 EA = 1; // 开总中断 } // 定时器0中断服务函数(1ms触发一次) void timer0_isr() interrupt 1 { static uint cnt = 0; uint target_cnt = 100 - calib_comp; // 校准后1秒的计数阈值(基准100次=1秒) TH0 = 0xDB; TL0 = 0xF8; // 重装初值 target_cnt = (target_cnt <80?80:(target_cnt>120?120:target_cnt)); // 限制校准范围 if(++cnt >= target_cnt) { cnt = 0; if(!set_flag) { // 仅运行模式更新时间 if(++second >=60) {second=0; if(++minute>=60){minute=0; if(++hour>=24)hour=0;}} } } }
  • 校准原理:通过calib_comp调整target_cnt(比如calib_comp=-2时,target_cnt=102,实际 1 秒≈1.02ms,抵消晶振偏慢问题)。
3.1.3 按键处理模块

采用延时消抖解决按键机械抖动问题,实现时间设置逻辑:

// 按键消抖(以加按键为例) uchar add_key_debounce() { if(KEY_ADD == 0) { delay_us(20000); // 20ms消抖延时 if(KEY_ADD == 0) { while(!KEY_ADD); // 等待按键松开 return 1; } } return 0; } // 时间设置逻辑 void time_set() { if(add_key_debounce()) { // 加按键:调整当前设置项 switch(set_step){case0:hour=(hour+1)%24;case1:minute=(minute+1)%60;case2:second=(second+1)%60;} } if(sub_key_debounce()) { // 减按键:调整当前设置项 switch(set_step){case0:hour=hour?hour-1:23;case1:minute=minute?minute-1:59;case2:second=second?second-1:59;} } if(confirm_key_debounce()) { // 确认按键:切换设置项/退出设置 if(++set_step>=3){set_step=0; set_flag=0;} } }

四、功能演示

  1. 上电启动:进入设置模式(显示[SET]),默认时间00:00:00,提示设置HOUR
  2. 时间设置:按加/减调整小时→按确认切换到分钟设置→再确认切换到秒→再确认进入运行模式(显示[RUN]);
  3. 走时校准:修改代码中calib_comp值(比如+3加快走时、-2减慢走时);
  4. 重置功能:任何时候按重置,时间恢复00:00:00并回到设置模式。

五、项目常见错误与解决方案

1.走时不准调整程序中的char calib_comp = -2;即可目前是-2,根据走时快慢调整,慢则增大数字,快则降低数字。

2.按键功能异常:按键检测需要长按按下才有效果,避免误触

问题 1:按键无响应

现象:按加 / 减 / 确认键,时间无变化、模式不切换;原因 & 解决方案

  • 原因 1:按键消抖延时过短 / 过长;→ 调整DEBOUNCE_DELAY(推荐 20000~50000,对应 20~50ms);
  • 原因 2:按键引脚定义错误(如 KEY_ADD 接 P3^1 而非 P3^0);→ 核对硬件接线与代码#sbit定义;
  • 原因 3:按键未接下拉 / 上拉(代码用 “低电平有效”,但硬件未接地);→ 确保按键一端接引脚,一端接 GND(上拉输入)。

六、资源下载

通过网盘分享的文件:LCD.zip 提取码: 5a3x

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/12 23:21:34

C++ Primer 中文版:初学者终极完整学习指南

想要快速掌握C编程语言&#xff1f;这份高清带目录的《C Primer》中文版电子书是您的理想选择&#xff01;作为最受推崇的C入门书籍&#xff0c;它以其系统性和实用性成为无数编程学习者的首选C学习资源。 【免费下载链接】CPrimer中文版-高清带目录 C Primer 中文版 - 高清带目…

作者头像 李华
网站建设 2026/1/24 6:11:01

32、深入探究openSUSE Linux系统的性能调优与问题解决

深入探究openSUSE Linux系统的性能调优与问题解决 1. 系统监控与初步操作 首先,登录运行GNOME的openSUSE Linux机器。在终端中输入 gnome-system-monitor 并按下回车键,随后花费几分钟时间查看各个选项卡,尤其关注每个进程所使用的内存量。完成后,关闭终端窗口并关闭虚…

作者头像 李华
网站建设 2026/1/23 1:14:35

Wan2.2-T2V-A14B在儿童内容安全过滤方面的机制解析

Wan2.2-T2V-A14B在儿童内容安全过滤方面的机制解析 如今&#xff0c;AI生成视频已经不再是科幻电影里的桥段。从短视频平台的自动剪辑&#xff0c;到教育类App中动态生成的教学动画&#xff0c;文本到视频&#xff08;Text-to-Video, T2V&#xff09;技术正快速渗透进我们日常生…

作者头像 李华
网站建设 2026/1/17 15:22:18

TrollInstallerX 终极安装指南:iOS 14.0-16.6.1 一键越狱神器

TrollInstallerX 是一款专为 iOS 14.0 至 16.6.1 系统设计的全能 TrollStore 安装工具&#xff0c;以其卓越的可靠性和用户友好性著称。无论您是技术新手还是资深玩家&#xff0c;都能通过本指南快速掌握这款神器的安装和使用技巧。 【免费下载链接】TrollInstallerX A TrollSt…

作者头像 李华
网站建设 2026/1/16 15:28:24

奶奶都能看懂的 C++ —— 手把手指针

引用在正式介绍指针之前&#xff0c;先来看看什么是引用。int a 10;int &ref1 a;你可能注意到了&#xff0c;上面的代码里有个 &。这就是我们的主角&#xff0c;引用。在变量名之前加上该符号&#xff0c;就可以指出它是个引用。我们常说的引用&#xff0c;就是把别人…

作者头像 李华
网站建设 2026/1/10 21:44:33

Driver.js 1.x终极迁移指南:从旧版本平滑升级的完整教程

Driver.js 1.x终极迁移指南&#xff1a;从旧版本平滑升级的完整教程 【免费下载链接】driver.js driver.js - 一个轻量级、无依赖的纯 JavaScript 库&#xff0c;用于控制用户在网页上的焦点移动&#xff0c;适用于需要实现网页交互和用户指引的前端开发者。 项目地址: https…

作者头像 李华