一、简介:
通过定时器的使用、按键检测及数码管的动态显示,以STC89C2RC单片机为核心控制,设计一个简单的计时时钟,这里我们使用到的是6位LED数码管,分别显示“时分秒”。显示范围从0小时0分0秒到23小时59分59秒,通过定时器来定时一秒钟,每过一秒刷新一次显示时间。这里设置了三个按键SW1,SW2,SW3,在程序中设置好小时、分钟和秒数的初值。将调时按键SW1按下后开始进入调整时间模式,通过按键SW2和SW3进行新一次的时间调整,SW2键实现时分秒数值的增加,SW3键时分秒数值的减小。
二、功能需求分析:
(1)对时间显示进行设计,显示格式为:“时”(第1,2位)“分”(第3,4位)“秒”(第5,6位)。
(2)当调整时间按键SW1被按下时自动进入调整时间模式,时钟不再刷新时间,通过按键SW2和SW3的按下从右至左依次可以进行时间更改。
(3)将时间模式分为时调整模式,分调整模式,秒调整模式,正常显示模式
(4)按下按键SW1,在模式间切换,当切换到调整时间模式,数码管显示自动停止刷新时间,对应的时,分,秒开始以1秒的频率闪烁。
(5)通过点击按键SW2和SW3进行新一次的时间调整,SW2键实现时分秒数值的增加,SW3键时分秒数值的减小。
三、系统开发环境、工具需求分析与选择
PROTUES软件进行仿真、keil软件、PC机。
四、主要硬件。
硬件系统是指构成微机系统的实际装置,本设计中由单片机、数码管显示、定时器计数、按键等组成。单片机芯片选择AT89C51,显示区域使用6位LED共阴极数码管。
![](https://img-blog.csdnimg.cn/720f5fbd8b584272b79a9192e71a7cd1.png)
六、软件设计:
将 51 单片机的头文件包含进来,将共阴数码管 0-F段码数据使用数组定义好。以及定义时分秒,sec,min,hour,修改状态变量model,数码管闪烁标志变量sign。定义了一个key_scan函数。函数带一个形参 mode,该参数用来设定是否连续扫描按键,如果 mode 为 0,只能操作一次按键,只有当按键松开后才能触发下次的扫描,这样做的好处是可以防止按下一次出现多次触发的情况。当按下某个按键,会一直返回这 个按键的键值,这样做的好处是可以很方便实现连按操作。函数内的 delay_10us(1000)即为软件消抖处理,通常延时10ms即可。key_scan 函数还带有一个返回值,如果未有按键按下,返回值即为KEY UNPRESS,否则返回值即为对应按键的键值,如 KEY1 PRESS、KEY2 PRESS、 KEY3 PRESSKEY4 PRESS,这都是程序开头定义好的宏,函数内还定义了一个 static 变量 key,相当于全局变量。
另外定义函数keyy,根据修改状态变量的值,在四个状态切换,并在被选中的时分秒状态下,利用按键SW2和SW3实现时间的修改,对时分秒进行加减,用6位数码管实现时、分、秒的更新。函数display_number,根据对修改状态变量model的判断,对数码管闪烁标志变量sign除二求余,不断改变对应的段码。实现被选中时分秒的闪烁。
然后定义定时器0中断配置函数 time0_init,该函数配置内容就是按照使用手册所写,即选择定时器工作模式 0、工作方式 1、设置定时 1ms 初值、打开定时器计数功能和开启总中断功能。然后进入 while 循环,在循环体内,当定时时间到达即会进入定时器0中断,在中段服务函数内,重新赋初值准备下次计数,并且定义一个静态变量来累计定时 1ms 次数,当变量等于 1000 时,表示定时时间达1秒,然后清零变量以及控制 数码管闪烁标志变量sign+1。并且每秒sec加1,等于时60清零,同时min加1,等于60时清零,同时hour加1,等于24时清零。执行完成后退出中断返回主函数,当时间到达又进入中断,如此循环。利用定时器的定时功能,用6位数码管实现时、分、秒的显示。