实例93 具有校正功能的时钟1302(LED数码管显示)
摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版
上例LED显示的1302时钟电路无时钟校正功能,本例加上时钟校正功能(校正方法与实例91略有不同)。
⒈ 电路设计
在上例时钟电路的基础上,加入3个时钟修正按键:K0(修正)、K1(移位)和K2(加1),分别与80C51P2.0、P2.2和P2.4连接,如图7-11所示。
⒉ 程序设计
按图7-11电路,要求开机显示13时47分58秒,数据间用小数点分隔,其中秒数据闪烁(亮600ms,暗400ms),并不断更新。同时要求K0、K1和K2具有时钟校正功能,其控制过程为:按下K0(带锁),进入时钟修正;首先,时十位快速闪烁(亮暗各120ms);按一次K1(不带锁),被修正位(快速闪烁)按时十位、时个位、分十位、分个位、秒十位、秒个位次序向右移一位(循环往复);按一次K2(不带锁),被修正位加1(最大值不超过时钟规定值,超过复0);时钟修正期间,计时继续运行;释放K0,退出时钟修正。
⒊ Keil调试
本题Keil调试同上例。因涉及外围元件DS1302,在Keil软件调试中无法得到外围元件的有效信号。因此,仅在Keil中,按实例1所述步骤,编译链接,语法纠错,自动生成Hex文件,并在变量观察窗口Watch页中设置(设置方法参阅图8-30)全局变量b(时钟数据数组)和d(时钟显示数组),获得数组b[]和d[]的首地址(分别为0x08、0x0f,用于在Proteus仿真中观测)。
需要注意的是,引用先前实例的6个子函数必须插入,否则Keil调试将显示出错。
⒋ Proteus仿真
⑴ 按实例23所述Proteus仿真步骤,打开Proteus ISIS软件,按表7-6选择和放置元器件,并连接线路,画出Proteus仿真电路如图7-12所示。
⑵ 鼠标左键双击Proteus ISIS仿真电路中AT89C51,装入Keil调试后自动生成的Hex文件。
⑶ 全速运行后,6位LED显示初始值:13时47分58秒,时分秒数据间用小数点分隔,其中秒数据闪烁并不断更新。
⑷ 按下K0(锁定),进入时钟修正。
需要说明的是,本例选用的BUTTON按键有两种运行功能:有锁运行和无锁运行。作有锁运行时,鼠标左键单击按键图形中小红圆点,单击第一次闭锁,第二次开锁。作无锁运行时,鼠标左键单击按键图形中键盖帽“ ”,单击一次,键闭合后弹开一次,不闭锁。
① 首先时十位快速闪烁,表示时十位允许修正。此时每按一次K2(鼠标左键单击键图形中键盖帽“ ”,单击一次,键闭合后弹开一次,不闭锁),时十位显示数加1,但不超过时十位最大值2,超过时复0。
② 若按一次K1(不闭锁,方法同K2),被修正位(快速闪烁)移至时个位数据,每按一次K2,时个位数据显示数加1,但不超过规定的最大值(时十位为0和1时,时个位不超过9;时十位为2时,时个位不超过3),超过时复位0。
③ 再按一次K1,被修正位(快速闪烁)移至分十位,每按一次K2,分十位数据显示数加1,但不超过分十位最大值5,超过时复位0。
④ 再按一次K1,被修正位(快速闪烁)移至分个位,每按一次K2,分个位数据显示数加1,但不超过分个位最大值9,超过时复位0。
⑤ 再按一次K1,被修正位(快速闪烁)移至秒十位,每按一次K2,秒十位数据显示数加1,但不超过秒十位最大值5,超过时复位0。
⑥ 再按一次K1,被修正位(快速闪烁)移至秒个位,每按一次K2,秒个位数据显示数加1,但不超过秒个位最大值9,超过时复位0。
⑦ 再按一次K1,回复到时十位修正(继续按K1,重复上述①~⑤过程)。
⑧ 释放K0,退出时钟修正,恢复正常计时显示。
⑹ 打开80C51片内RAM(主菜单Debug→80C51 CPU→Internal(IDATA)Memory -U1),可看到08H~0EH和0FH~14H已经依次存放了时钟数据数组b[]和显示字段码数组d[]的即时数据,与图7-10所示相似。
⑺ 终止程序运行,可按停止按钮。
⒌ 思考与练习
本例程序中,T0 4ms中断的作用与上例有什么不同?
|