单片机学习小组
直播中

何微微

7年用户 162经验值
私信 关注

开机显示PC机时分秒的时钟1302设计方案


实例92 开机显示PC机时分秒的时钟1302LED数码管显示)


摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版


时钟显示除了用LCD显示,还可以用LED显示。


电路设计


设计时钟DS1302LED数码管显示电路如图7-8所示,电路分成两部分:左半部分是时钟DS1302读写控制电路,右半部分是LED数码管动态显示电路。


  






时钟DS1302读写控制电路


时钟DS1302读写控制电路与实例9091中相同,晶振32768HzDS1302 X1X2端连接;VCC2为主电源,接+5V电源;VCC1备用电源,接3.6V锂电池;串行数据输入/输出端I/O、串行时钟脉冲输入端SCLK和复位/片选端分别与80C51 P1.7P1.6P1.5连接。


LED数码管动态显示电路


LED数码管动态显示电路与实例6566717273中相同,80C51 P1.2P1.0138译码输入端CBAA为低位)连接;译码输出端(低电平有效)作为位码,选通6位共阴型LED数码管;138片选端E1+5V接地,始终有效;80C5174LS377时钟端CLKP2.7接门控端P0口接数据输入端D0D7377 Q0Q7输出段码,与数码管笔段a~gDp连接。


74LS37774LS138特性已分别在实例34实例58中介绍,此处不再重复。


程序设计


7-8电路,要求开机即能直接显示PC时分秒数据,时分秒数据间用小数点分隔,其中秒数据闪烁(亮600ms,暗400ms),并不断更新




  




  





需要说明的是,T0 4ms中断有3个作用:一是用于动态扫描显示,每隔4ms更换显示位;二是用于秒闪烁,4ms计数,前600ms亮,后400ms暗;三是用于在接近1秒(0.996秒)时突发读时钟。然后隔4ms再读一次,即在0.996s1s两个时点突发读时钟。若在这两个时点发现秒数据更新,就更新显示值,尔后4ms计数重新开始。既做到及时更新,又避免在T0每一次4ms中断时均去突发读时钟。为什么不在4ms计数1秒时一次性去突发读时钟呢?主要考虑4ms计数与1302实时时钟可能(多数)存在时差,若4ms计数1秒小于1302实时时钟1秒,实时时钟显示滞后将超过1秒,而且这种“滞后”几乎会一直保持下去(需累计时差大于一秒后才“正确”一次)。但若在0.996s1s两个时点突发读时钟,有时差时,“滞后”只有一次,第二次即被更正,而且这种“正确”几乎会一直保持下去(需累计时差大于4ms后才再“滞后”一次)。


Keil调试


本题Keil调试同上例。因涉及外围元件DS1302,在Keil软件调试中无法得到外围元件的有效信号。因此,仅在Keil中,按实例1所述步骤,编译链接,语法纠错,自动生成Hex文件,并在变量观察窗口Watch页中设置(设置方法参阅8-30)全局变量b(时钟数据数组)和d(时钟显示数组),获得数组b[]d[]的首地址(分别为0x080x0f,用于在proteus仿真中观测)。


需要注意的是,引用实例903个子函数必须插入,否则Keil调试将显示出错。


Proteus仿真


实例23所述Proteus仿真步骤,打开Proteus ISIS软件,按7-5选择和放置元器件,并连接线路,画出Proteus仿真电路如7-9所示。




  


  






鼠标左键双击Proteus ISIS仿真电路中AT89C51,装入Keil调试后自动生成的Hex文件。


全速运行后,LED显示屏显示PC时分秒实时数据,中间用小数点分隔,秒数据闪烁。


按暂停按钮,打开80C51片内RAM(主菜单“Debug”→“80C51 CPU”→“InternalIDATAMemory -U1”),可看到08H0EH0FH14H已经依次存放了时钟数据数组b[]和显示字段码数组d[]的即时数据,如7-10所示。


终止程序运行,可按停止按钮。


思考与练习


本例程序中,T0 4ms中断有什么作用?




更多回帖

发帖
×
20
完善资料,
赚取积分