第 29卷 第 4期 2005年 8月
武汉理工大学学报 (与工程版 ) Jo urnal o f Wuhan University of Techno logy ( T ranspo r ta tio n Scie nce & Engineering )
交通科学V o l. 29 No. 4 Aug. 2005
基于单片机的数字钟设计及时间校准研究
陈姚节 戴泽军
(武汉科技大学计算机学院
武汉 430081)
*
摘要: 用单片机来设计数字钟 ,软件实现各种功能比较方便 .但因软件的执行需要一定的时间 ,所以就
会出现误差 .对比实际的时钟 ,查找出误差的来源 ,并作出调整误差的方法 ,使得误差尽可能地小 ,使得系统可以达到实际数字钟的允许误差范围内 .
关键词: 显示消影;事件触发 ;误差分析 中图法分类号: T P365. 1
1 系统原理分析
系统设计中用到 89 C52单片机的部分功能:包括内部定时器 ,键盘扩展 ,程序中断 ,串口通信等. 用一个四联体的共阴极八段显示器 ,可通过一个输入 /输出口作为显示器数据发送端;另一个输入 /输出口的四位作为显示器各位的片选信号 ,另四位作为键盘扩展口使用 . 采用一个频率为
图 2 主程序流程图
11. 059 2 M Hz的晶振构成时钟电路. 系统原理如
图 1所示.
都是系统执行过程中采用中断事件触发产生 (中断部分处理如图 3所示 ) .定时中断是周期性发生的 , 而串口中断则须串口有数据传输才发生中断
[1, 2 ]
. 定时程序是整个系统的核心代码 ,
图 1 系统原理图
这段代码不光涉及到显示 ,还涉及到系统计时 ,这段代码的优劣关系到整个系统的可靠性 ,后面还将详细讨论.为初步减小系统误差 ,置定时初值一定要在程序开始就设置. 2. 3 数据的显示与刷新 更新显示器涉及到两个操作: 发数据和改片选
2 软件实现与流程
2. 1 主程序 由于系统的主要功能都是由程序中断来完
成的 ,主程序基本上没什么事可做 ,但因键盘扫描是通过程序查询的方式实现的 ,所以主程序只循环扫描键盘.主程序流程图如图 2所示.
信号. 但实践发现 ,代码中无论是先改片选信号还是先发数据信号 ,都会出现重影 (即相邻两位显示差不多 )这也是动态扫描引起的 .证明先发片选 ,则前一位的数据会在下一位显示一段时间; 先发数据 ,则后一位的数据会在前一位显示一段时间 ,因而出现重影 .解决这个问题的办法是先进行
2. 2 定时和串口程序 定时和串口都是中断响应程序 ,它们的调用
收稿日期: 2005 06 05 陈姚节: 男, 28岁,硕士 ,助教 ,主要研究领域为数据通信和设备驱动开发
*
国家 863计划项目资助(批准号: 2003 AA414011)
第 4期 陈姚节等: 基于单片机的数字钟设计及时间校准研究 · 551·
2. 4 键盘响应程序 键盘处理程序流程相对简单 ,只是简单的判键
与处理.这里不再给出流程图. 所谓键盘消抖就是一次按键的多次响应问题 .当然 ,一般一次按键只须响应一次 ,但有的时候需要多次响应 ,如系统进入修改模式 ,数字的增减. 当出现这种问题时 , 用户的一次击键是作为一次还是多次处理 ,必须有一个标准. 程序中用到了一个标志位 ,相当于中断系统的中断标志. 当用户按下键时 ,标志清零 , 松开键时 ,标志恢复; 键按下超过一定时间 (靠一扫描
图 3 中断程序流程图
一个消影操作 ,然后再发片选 ,最后发数据. 这样就能很好地解决了重影问题 .这样做的关键在于 , 在极短的一段时间内让显示器都不亮 ,等一切准备工作都做好了以后再发数据 ,只要显示频率足够快 ,是看不出显示器有闪烁的 (程序用定时中断频率作为显示更新频率 ,在表 1中 ,只有当更新率 ≤ 100 Hz时 ,才发现显示器有闪烁 ) . 这段显示程序代码如下.
P1= 0 x 00; / / 消影
P2= 选择 [选择 ]; / /发片选信号
codetmp= acode [ echoa rra y [选择 ] ];
如果 (选择 = = 2&& mo d= = 0&& do tfla g) / /判断是 否显示 \
codetmp|= 0 x 80;
P1= codetmp; / / 发数据
选择= + + 选择% 4; / / 片选计数器下移
表 1 系统时间校正测试数据
定时中断
PC
标准 系统计时
频率 k /
时长 (初值为 误差 备
次· s- 1
/min 00: 00: 00) t /s 注
100
10 00: 09: 58 - 2 显示器有闪烁
200 10 00: 09: 57 - 3
400 10 00: 09: 55
- 5
800
10 00: 09: 49 - 11
1 600
10 00: 09: 39 - 21
3 200
10 00: 09: 18 - 42 3 200
20 00: 18: 38 - 82 显示器无闪烁
3 200
30 00: 27: 57 - 123
3 200
60 00: 55: 54 - 246
3 200
120 01: 51: 46 - 494
3 200
180 02: 47: 38 - 742
3 200
240 03: 43: 31 - 989
3 200
300 04: 39: 24 - 1 224
计数器判定 )后 ,恢复标志 ,则经过一定的时间延迟 (也靠一扫描计数器判定 )可以响应一次按键 (即一次按键的多次响应 ) .而事实上 ,键盘响应程序就是一个事件触发器 ,键盘的每一个状态 (按下 ,松开 ,点击 )都可能引发一段响应程序 (如: 重新设定键按下→准备复位; 松开→系统复位 ) . 这里的时间延迟靠的是指令计数 ,由于受硬件中断等不确定因素影响 ,这个延迟一般不准确 ,但通过测试 ,可以找到一些合适的值.
3 系统性能测试与功能说明
3. 1 定时计数器的初始值设置公式推导 系统中所选用的晶振的频率为 f osc , 则机器
周期为公式 1: t0 = 12 /f osc[ 3]
设定时器要求的中
断频率为 k ,计数器位数为 n,则定时计数器的初值 X 设置有如下公式: t0 ( 2n
- X )= 1 /k
[3 ]
.
于是原始公式: X = 2n
- 1 /( k× t0 ) . 而实验测得的数据显示 ,这个公式所得的结果并不可靠 (表 1中的所有数据都是在计数器初始值严格按照原始公式给出的条件下测得 ,以个人计算机机系统时钟为标准 ) .从表 1中的数据可知 ,严格按照原始公式得出的计数初值是存在极大误差的 ,这个误差总使系统时间变慢 ,而且 ,系统时间的误差值随着每秒中断次数的增多而增大 ,随计时总长的增长而增大 ,并且总是成比例 (在误差允许的范围内 ) .这就是说 ,系统的误差跟每秒中断次数和个人计算机标准时长的乘积 (即中断总次数 )成正比 .也就是说 ,每次中断计时的时间误差是一个常数
. 误差来源分析 .不考虑晶振等固件的误差 ,则系统机器周期可以由公式 1准确给出 ,因而系统误差不可能来自于硬件 ,而应该主要来自于软件方面.系统每次调用定时中断程序的过程中 ,硬件并
没有自动进入下一个定时周期 ,而是在调用中断程序以后由软件置数来实现的. 而在程序调用

