实例92 开机显示PC机时分秒的时钟1302(LED数码管显示)
摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版
时钟显示除了用LCD显示,还可以用LED显示。
设计时钟DS1302并LED数码管显示电路如图7-8所示,电路分成两部分:左半部分是时钟DS1302读写控制电路,右半部分是LED数码管动态显示电路。
⑴ 时钟DS1302读写控制电路
时钟DS1302读写控制电路与实例 90、 91中相同,晶振32768Hz与DS1302 X1、X2端连接;VCC2为主电源,接+5V电源;VCC1为备用电源,接3.6V锂电池;串行数据输入/输出端I/O、串行时钟脉冲输入端SCLK和复位/片选端分别与80C51 P1.7、P1.6和P1.5连接。
⑵ LED数码管动态显示电路
LED数码管动态显示 电路与实例 65、 66、 71、 72、 73中相同,80C51 P1.2~P1.0与138译码输入端CBA(A为低位)连接;译码输出端~(低电平有效)作为位码,选通6位共阴型LED数码管;138片选端E1接+5V,、接地,始终有效;80C51接74LS377时钟端CLK;P2.7接门控端;P0口接数据输入端D0~D7,377 Q0~Q7输出段码,与数码管笔段a~g、Dp连接。
74LS377和74LS138特性已分别在实例34和实例58中介绍,此处不再重复。
⒉ 程序设计
按图7-8电路,要求开机即能直接显示PC机时分秒数据,时分秒数据间用小数点分隔,其中秒数据闪烁(亮600ms,暗400ms),并不断更新。
需要说明的是,T0 4ms中断有3个作用:一是用于动态扫描显示,每隔4ms更换显示位;二是用于秒闪烁,4ms计数,前600ms亮,后400ms暗;三是用于在接近1秒(0.996秒)时突发读时钟。然后隔4ms再读一次,即在0.996s和1s两个时点突发读时钟。若在这两个时点发现秒数据更新,就更新显示值,尔后4ms计数重新开始。既做到及时更新,又避免在T0每一次4ms中断时均去突发读时钟。为什么不在4ms计数1秒时一次性去突发读时钟呢?主要考虑4ms计数与1302实时时钟可能(多数)存在时差,若4ms计数1秒小于1302实时时钟1秒,实时时钟显示滞后将超过1秒,而且这种“滞后”几乎会一直保持下去(需累计时差大于一秒后才“正确”一次)。但若在0.996s和1s两个时点突发读时钟,有时差时,“滞后”只有一次,第二次即被更正,而且这种“正确”几乎会一直保持下去(需累计时差大于4ms后才再“滞后”一次)。
⒊Keil调试
本题Keil调试同上例。因涉及外围元件DS1302,在Keil软件调试中无法得到外围元件的有效信号。因此,仅在Keil中,按实例 1所述步骤,编译链接,语法纠错,自动生成Hex文件,并在变量观察窗口Watch页中设置(设置方法参阅图 8-30)全局变量b(时钟数据数组)和d(时钟显示数组),获得数组b[]和d[]的首地址(分别为0x08、0x0f,用于在proteus仿真中观测)。
需要注意的是,引用实例90的3个子函数必须插入,否则Keil调试将显示出错。
⒋Proteus仿真
⑴ 按实例23所述Proteus仿真步骤,打开Proteus ISIS软件,按表7-5选择和放置元器件,并连接线路,画出Proteus仿真电路如图7-9所示。
⑵ 鼠标左键双击Proteus ISIS仿真电路中AT89C51,装入Keil调试后自动生成的Hex文件。
⑶ 全速运行后,LED显示屏显示PC时分秒实时数据,中间用小数点分隔,秒数据闪烁。
⑷ 按暂停按钮,打开80C51片内RAM(主菜单“Debug”→“80C51 CPU”→“Internal(IDATA)Memory -U1”),可看到08H~0EH和0FH~14H已经依次存放了时钟数据数组b[]和显示字段码数组d[]的即时数据,如图 7-10所示。
⑸ 终止程序运行,可按停止按钮。
⒌ 思考与练习
本例程序中,T0 4ms中断有什么作用?
|