基于51单片机与LCD12864的指针式电子钟设计与实现

发布时间:2026/9/11 11:19:33
基于51单片机与LCD12864的指针式电子钟设计与实现 简介一套基于51单片机与LCD12864显示屏的指针式电子时钟设计资料包面向单片机初学者、嵌入式爱好者及电子设计学习者可解决从时间基准获取、显示驱动到硬件布局的完整实践需求尤其适合作为课程设计或自学进阶的参考项目。压缩包内含75个文件整体大小仅816KB主要文件包括C语言源码、A51汇编、Hex烧录文件、Keil工程文件、列表与备份文件以及原理图、PCB设计文件并附有使用说明、程序说明和元件清单便于直接编译烧录并对照电路理解程序逻辑。已有568人学习下载资源按程序、PCB工程和说明文档分类结构清晰检索方便。通过这套资料学习者既能掌握单片机定时器中断、时间格式转换等底层编程方法也能熟悉LCD12864的驱动控制与指针式界面绘制并依据原理图与PCB文件完成实物制作或二次改进。这套资料把开发环节完整整合对自主完成一个电子作品很有帮助。1. 先想清楚指针式时钟为什么值得用51去做大多数51单片机课程设计里的电子钟都用数码管或1602显示数字时间因为那只管把BCD码送出去就行。而用LCD12864做指针式表盘问题从「显示时间」变成了「画时间」你需要在128x64的点阵上实时计算时针、分针、秒针三条线段的坐标并处理每秒一次的动画刷新。51单片机在12MHz下做整数运算并不慢但浮点三角函数会明显拖慢刷新速度所以这个项目的核心价值在软件——怎么用查表、整数运算和画线算法撑起每秒一次的表盘更新。资料里包含了原理图、PCB工程、元件清单和完整程序文件适合理清51外设后想往图形界面方向过渡的人也适合课程设计需要从原理图到烧录全流程对照的读者。2. 硬件链路从51引脚到LCD12864的驱动信号2.1 最小系统与晶振选型对计时的影响51单片机最小系统由电源、复位、晶振三部分组成。项目使用AT89S52或STC89C52这类带8K Flash的型号程序空间完全够用不需要外扩ROM。晶振频率是设计时钟时第一个要定下来的参数12MHz下51单片机机器周期正好1us定时器初值和延时函数计算都直观11.0592MHz的优势是能让串口波特率整除为整数但这个项目若不使用串口对时没必要为波特率牺牲定时器计算的直观性。建议先用12MHz跑通等拿到实测日差再决定要不要换晶振或加软件修正。复位电路用10uF电容配10K电阻即可上电时RST引脚保持高电平约100ms保证可靠复位。原理图里需要逐根核对EA引脚使用内部ROM时必须接VCC接错的话单片机会去执行外部总线取指程序完全跑不起来。P0口作为数据总线时必须外接10K上拉排阻因为51的P0口是开漏输出高电平驱动能力弱接上LCD数据线后电平可能被拉到1V左右出现乱码或缺笔画。建议在原理图和元件清单里都确认上拉排阻是否画出这是网上模板图里最常缺的器件。电源部分的基本做法是主板电源入口并联一个100uF电解电容滤低频纹波每个芯片电源引脚旁放0.1uF瓷片电容滤高频。LCD12864背光引脚LEDA要串限流电阻直接接5V会让背光电流超出规格长时间工作后稳压器件发热明显。元件清单.txt里列出的电阻电容大多在这些位置复用照单采购即可不需要特殊物料。注意P0口上拉排阻是LCD12864数据乱码的头号原因拿到原理图第一件事找这个器件其次是确认EA和PSB两个引脚的接法。2.2 LCD12864并行接口与控制线时序LCD12864屏心以ST7920控制器为主支持8位并行、4位并行和串行三种模式由PSB引脚电平决定。这个项目使用8位并行PSB接高电平。数据线DB0到DB7接P0口控制线RS寄存器选择、RW读写选择、E使能接P2口引脚。RS低电平表示写入指令高电平表示写入数据E引脚用下降沿锁存数据而51写入一条指令只需要几条机器周期拉高E再拉低E的时间间隔天然满足ST7920对E高电平时长几百纳秒的要求不需要额外插延时。引脚接线可以按下面这张表整理对照原理图检查效率更高LCD12864引脚功能推荐的51接法VSS / VDD电源地 / 逻辑电源GND / 5VVO对比度调节10K电位器中间抽头RS寄存器选择P2.0RW读写选择P2.1E使能信号P2.2DB0~DB78位数据总线P0.0~P0.7外接上拉排阻PSB并口/串口选择VCCRST复位输入RC自动复位电路LEDA / LEDK背光正极 / 负极串100欧电阻接5V / GND对比度脚VO是这个项目最容易出现假故障的位置。VO直接接地时整个屏幕变成深色块直接接VCC时几乎看不到内容只有通过电位器分压才能调到合适浓度。硬件调试时要先把电位器拧到能看到表盘刻度再调整其他部分。RST脚可以自动复位但ST7920上电后需要大约100ms稳定时间所以LCD初始化函数开头要有一句延时。2.3 从原理图到PCB的信号流向检查原理图的读图顺序建议从电源往信号走5V入口的滤波电容单片机最小系统LCD12864接口再到按键和背光。电源走线尽量不要经过晶振区背光电流波动会给晶振引入噪声进而让定时器时钟源发生微小抖动。PCB工程里如果LCD排线接口下方有完整地铜说明作者考虑了回流路径这种细节在PCB1.PcbDoc里可以直接查看。布局上还有两个值得留意的习惯LCD12864接口排针间距2.54mm与洞洞板通用方便调试时飞线验证。P0口上拉排阻靠近LCD接口摆放能让各路数据线走线更均匀。晶振和两个20pF负载电容放在单片机晶振脚旁边走线短且对称。掌握这些习惯之后读原理图和PCB就能快速区分哪些是刻意设计哪些是工具默认生成而不是一根线一根线去追。这套思路同样适用其他51单片机硬件设计项目芯片换了原理结构也不大变。3. 指针表盘把时间数据换成屏幕上的坐标旋转3.1 定时器中断与时间基准的建立时间基准来自51内部定时器。ST7920不维护时间日期它只负责把GDRAM里的点阵显示到屏幕所以秒、分、时的累计必须自己用硬件定时器完成。常用方案是把定时器0配置为16位模式产生50ms周期中断20次中断累计为1秒。12MHz下机器周期1us定时器初值用65536减50000即每50000us进一次中断。中断服务程序写法如下注意先重载初值再更新时间变量#define TIMER0_RELOAD (65536 - 50000) // 50ms定时重载值 volatile unsigned char tick_50ms 0; volatile unsigned char sec 0, min 0, hour 0; void timer0_init(void) { TMOD 0xF0; // 保留定时器1的配置 TMOD | 0x01; // 定时器0方式116位定时模式 TH0 TIMER0_RELOAD 8; TL0 TIMER0_RELOAD 0xFF; ET0 1; // 使能定时器0中断 EA 1; // 使能总中断 TR0 1; // 启动定时器0 } void timer0_isr(void) __interrupt 1 { TH0 TIMER0_RELOAD 8; TL0 TIMER0_RELOAD 0xFF; if (tick_50ms 20) { tick_50ms 0; if (sec 60) { sec 0; if (min 60) { min 0; if (hour 24) hour 0; } } }这段代码里TMOD 0xF0是保护式写法只改低四位而保留定时器1的原有配置比直接对整个TMOD赋值更稳妥。sec、min、hour声明为volatile是因为它们会被中断和主循环同时访问不加volatile时编译器可能把它们优化进寄存器导致主循环读到旧值。重载初值放在中断服务程序最前面是为了让下一轮定时的起点尽量接近理论值虽然单次误差只有几个机器周期但一天累计下来会有可测量的偏差这也是第五章做精度修正的入口。3.2 查表法计算指针终点坐标指针绘制需要把时间角度转成屏幕坐标。表盘中心设为(cx, cy)指针长度r角度angle为从12点方向顺时针旋转的角度终点坐标公式为x cx r * sin(angle) y cy - r * cos(angle)秒针每秒转6度分针每分钟转6度且每秒多0.1度时针每小时转30度且每分钟多0.5度。直接调用C库的sin/cos在51上非常慢一次浮点三角函数通常耗时数百微秒三根指针叠加表盘重绘时会出现肉眼可见的闪烁。工程上常用预计算正弦表存入code段运行时用查表和整数乘除代替浮点运算code unsigned int sin_table[91] { 0, 4, 9, 13, 18, 22, 27, 31, 36, 40, 45, 49, 54, 58, 63, 67, 72, 76, 81, 85, 90, 94, 98, 103, 107, 112, 116, 121, 125, 130, // 省略中间数值按 sin(angle) * 256 取整 }; int angle_to_x(int cx, int r, int angle) { int a angle % 360; int s 0; if (a 90) s sin_table[a]; else if (a 180) s sin_table[180 - a]; else if (a 270) s -sin_table[a - 180]; else s -sin_table[360 - a]; return cx (r * s) / 256; }代码先把任意角度规约到0到359再借助正弦函数的对称性映射到0到90度查表同时处理符号。r乘以正弦值后除以256相当于右移8位在51上属于快速整数除法。正弦表用code关键字存进Flash不占内部RAM而code段访问不需要MOVX指令执行速度比xdata快。想要更细的刷新分辨率可以把表扩到360条每条2字节共720字节Flash对8K Flash的51单片机来说开销可以接受。实际绘制时还要给三根指针分配不同长度秒针最长取半径48分针略短取半径42时针最短取半径30这样从视觉上就能区分层次比统一长度更好辨认。3.3 表盘绘制与每秒刷新策略LCD12864在图形模式下可以逐点写入GDRAM。表盘外圈、整点刻度、中心圆点属于静态元素只在初始化时绘制一次每秒重绘的内容只有三根指针。消除闪烁的关键是不要整屏清掉再重画正确顺序是先计算三根指针的新旧位置用背景色擦掉旧位置然后按秒针、分针、时针的顺序画新位置最后再把中心点画成实心圆盖住公共端点。中心点最后画的原因在于三根线在圆心附近重叠时任何一次擦除都会影响其他指针统一最后点亮可以保证视觉上始终只有一个完整圆心。画线函数用整数版Bresenham算法void draw_pointer(int x0, int y0, int x1, int y1, unsigned char color) { int dx x1 x0 ? x1 - x0 : x0 - x1; int dy y1 y0 ? y1 - y0 : y0 - y1; int sx x1 x0 ? 1 : -1; int sy y1 y0 ? 1 : -1; int err dx - dy; for (;;) { lcd_draw_point(x0, y0, color); if (x0 x1 y0 y1) break; int e2 2 * err; if (e2 -dy) { err - dy; x0 sx; } if (e2 dx) { err dx; y0 sy; } } }Bresenham算法只用整数加减比较没有乘除和浮点避免了DDA算法每步除法带来的误差累积。color参数传1为画前景色传0为擦除复用同一个函数可以减少代码量。这里有一个实际坑擦旧指针时如果新指针已经画好会把刚画出的线段擦掉所以必须按「全部擦旧、再全部画新」的顺序执行。主循环每秒唤醒一次读取sec、min、hour计算三组终点坐标调用draw_pointer完成一轮擦除和重绘。整个流程在12MHz下占用几十毫秒剩余时间足够处理按键调时等其他逻辑。4. PCB布局与程序烧录里的实际问题4.1 晶振、去耦电容和LCD排线的布线位置PCB走线要求听起来玄但对这种低速数字电路真正关键的只有三点晶振区、电源去耦、地平面回流。晶振和两个20pF负载电容必须贴近单片机晶振引脚走线短且对称晶振下方不要铺大面积地铜否则寄生电容会把振荡波形拉偏。底层大面积铺地作为完整参考平面在晶振区、电源入口、LCD接口三处各打几个地过孔可以有效降低回流路径的电感。电源走线避免穿过晶振区域。LCD背光电流是动态变化的如果背光供电走线贴着晶振电流波动会通过空间耦合干扰振荡信号严重时屏幕刷新瞬间时间会跳变。P0口上拉排阻靠近LCD数据排针摆放DB0到DB7走线长度差控制在几毫米内虽然并口速度不高但等长布线能减少数据建立时间偏差。排针间距2.54mm通用的杜邦线可以直接插上方便调试时飞线测量信号。4.2 Keil工程配置与程序文件组织程序文件通常按模块拆分对应资料包里的Program目录main.c负责初始化和主循环lcd12864.c负责ST7920驱动clock.c管时间变量和指针坐标计算timer.c放定时器中断服务函数table.c存查表数据。每个文件职责单一在别的课程设计里复用LCD驱动时把lcd12864.c和table.c直接拷走就能用。建议对照程序说明.txt来看每个函数的上下文理解作者为什么把某个计算放进中断而不是主循环。Keil里有一处配置容易被忽略Target选项卡的晶体频率值参与延时函数的耗时估算实际板子用12MHz就填12用11.0592MHz就填11.0592否则软件仿真里的延时时间和真实板子对不上。存储模式选small变量默认放内部RAM访问速度最快。正弦表用code声明后编译进Flash不占用RAM空间。常用芯片如STC89C52内置512字节扩展RAM如果要把帧缓冲全放到xdata也够用但会增加写GDRAM时分页的复杂度初学者按每秒即时画线的方式更简单。这里可以配一张模块说明表对照程序文件快速定位代码文件职责对外接口main.c初始化、主循环、按键调时main, key_scanlcd12864.cST7920底层驱动、GDRAM写点lcd_init, lcd_write_cmd, lcd_draw_pointclock.c时间累计与指针坐标计算get_time, calc_pointer_coordtimer.c定时器0初始化与中断服务timer0_init, timer0_isrtable.c正弦查表数据sin_table, cos_table编译生成hex文件后烧录也有门道。STC系列用ISP软件下载时要点下载按钮后再给板子上电因为STC只在冷启动时进入引导区程序运行时串口不会让出Flash控制权。AT89S52则要接ISP下载线配合ProgISP烧写。烧录完成后首次上电如果背光亮但表盘没出现先调对比度电位器如果表盘出现但时间不走检查TR0是否置1以及中断是否被意外关闭。4.3 显示异常场景与快速定位调试中遇到的显示问题大致分成三类。第一类是全屏黑块或满屏竖线多半是LCD复位时间不足把上电后延时加到200ms再初始化。第二类是字符乱码叠加很可能是PSB引脚没拉高屏幕跑在串行模式而程序发的并行指令全被串行解析。第三类是只有背光亮、屏幕没有内容先量VO电位器两端电压正常应该在3到5V可调再量E引脚是否有脉冲E引脚接错或松动时故障现象和VO没调好几乎一样。一个有效的分域手段是在初始化最后画一个测试矩形把GDRAM第一行全部写0xFFvoid lcd_test_fill(void) { unsigned char i; lcd_write_cmd(0x34); // 开启扩展指令集 lcd_write_cmd(0x36); // 开启图形显示模式 for (i 0; i 16; i) { // ST7920的GDRAM按行地址结构写入 lcd_write_data(0xFF); lcd_write_data(0xFF); } }如果第一行出现完整矩形色块说明数据总线和控制线都连通问题在表盘绘制算法如果矩形不出现优先检查RS/RW/E控制线再查PSB和VO对比度。这个二分法能立刻把排查范围缩小一半比逐根量线效率高不少。注意0x34和0x36是ST7920扩展指令集的开关不同厂家屏的指令兼容性基本一致但个别屏需要等待指令执行完成后再写GDRAM可以加一个短延时提高可靠性。5. 用软时钟对时验证指针时钟的日差指针时钟做完不能靠肉眼确认大概准要量化日差。方法是用电脑网络时间做基准当秒数跳到00的瞬间记录秒针相对12点位置的偏移量delta024小时后重复记录delta1delta1减delta0就是一天累计误差。误差方向固定且大小稳定比如每天固定快10秒说明晶体频率偏高或定时器重载值偏小可以在软件上做补偿。软件补偿的思路是建立一个跳帧机制。以每天快1秒为例一天86400秒对应1728000个50ms帧需要跳过的帧数为20那么每1728000除以20等于86400帧跳一帧即大约每12小时少计50ms一天少计1秒。把补偿参数做成宏定义按实测值替换#define COMPENSATE_TICKS 86400 // 每天快1秒时每86400帧跳一帧(约12小时) volatile unsigned int tick_counter 0; void timer0_isr(void) __interrupt 1 { TH0 TIMER0_RELOAD 8; TL0 TIMER0_RELOAD 0xFF; if (tick_counter COMPENSATE_TICKS) { tick_counter 0; return; // 吞掉这一帧50ms计数 } // 原有点击_50ms累计逻辑不变 }COMPENSATE_TICKS越大补偿粒度越细最小步进是50ms。如果实测每天慢就把跳过一帧改成额外多计一个50ms帧。软件修正受限于50ms帧的最小粒度日差小于0.5秒时基本够用等于把误差控制在肉眼无法察觉的范围。如果日差波动超过2秒且方向时快时慢问题往往不在软件而在电源纹波或晶振品质这时回到硬件侧用示波器查5V纹波而不是继续在补偿参数上调来调去。最后提供一个验证指针联动的技巧把初始化时间设为3点15分时针指向3到4之间偏一点分针精确指向3秒针指向12。三根长度不同的线段在屏幕上清晰分开如果方向偏了或长短错乱问题集中在查表象限符号处理或y轴取反上如果三根线方向正确但整体偏了一个固定角度说明表盘中心坐标或0度基准方向设置有偏差。这类逻辑错误在纯数字计算时不容易暴露但放到可视化的表盘上一眼就能定位。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询