摘要
:
本文设计了一款数字时钟,通过在
Keil
软件进行程序设计,在
Proteus
搭建仿真电路,系统联调,最终实现了数字时钟显示、
计时
、
定时
、
闹铃
、
设置等功能
。
本设计具有电路结构简单
、
成本低廉
、
精度较高
、
性能稳定等优点
。
通过数字时钟的设计,对虚拟设备的教学展示及应用系统的设计开发、
功能扩展具有较大的作用
。
关键词
:
单片机;
Proteus
;
Keil
;虚拟设备;功能扩展
0 引言
数字时钟是利用数字电子技术实现计时的电子设备,它可以采用晶振、
计数器
、
译码器
、
显示器和电源等硬件电路实现。
该方法设计的数字时钟电路结构较复杂
、
稳定性较差、
体积较大,因此逐步被以单片机为核心的数字时钟取代。
基于单片机
AT89S51
的数字时钟具有体积小
、
精度高、
稳定性好
、
性价比高,便于功能扩展等优点,为今后嵌入式数字时钟的智能化发展提供了可行性的参考方案。
1 系统总体设计
系统设计分为硬件设计及软件设计
。
硬件设计分为五个部分:单片机最小系统、
显示模块
、
闹钟指示
、
闹钟闹铃
、功能设置。
程序设计分为三个部分:时钟显示
、
时钟调节
、闹铃设置。
系统组成框图如图
1
所示
。
该数字时钟功能包括:显示时间、
手动更改时间
、
手动开启
/
关闭闹铃功能
、
手动设置闹钟、
时钟闹铃
、
闹铃状态指示
。

2 硬件仿真设计
本系统采用
Proteus
进行硬件仿真,该软件能够准确展示单片机的仿真效果,是单片机开发常用而有效的仿真软件。
仿真电路如图
2
所示,包括如下几个部分:
①
单片机最小系统:单片机能够正常工作的最小配置。
因最小系统模式固定,方便查阅学习,这里不再详述
。本设计中的最小系统硬件连接可参看图 2
中单片机时钟电路(XTAL1
、
XTAL2
)
、
复位电路(
RST
)
、
存储器选择电路(EA
) 部分,电源电路是将单片机
VCC
(
40#
引脚)
、
VSS(20#
引脚)分别接
DC+5V
,
GND
。
本着嵌入式系统开发适用、
够用的原则,根据系统功能要求,选用单片机
AT89S51作为核心控制芯片,该款芯片能够满足本系统要求,运行稳定,性价比高。
②
显示模块:选用八位一体的共阴极数码管构成(亦可采用八位一体的共阳极数码管),用于显示数字时钟当前时间、
时间调节和闹铃时间,显示格式为
hh-mm-ss
(时
-分-
秒)
。
段选信号
a~h
由单片机
P1.0~P1.7
控制;位选信号 WEI0~WEI7
由
P2.0~P2.7
控制
。
具体连接方式参看图
2中数码管及其对应的网络标号部分。
③
闹铃指示灯:采用一个发光二极管作为闹铃指示灯,灌电流方式。
LED
亮,表示闹铃功能开启;
LED
灭,表示闹铃功能关闭,由单片机 P3.1
引脚控制
。
其中
200
Ω
电阻起到限流作用,防止因电流过大烧坏发光二极管。
具体连接方式参看图 2
中的发光二极管部分
。
④
闹钟闹铃:闹铃采用蜂鸣器装置,由单片机
P3.0
引脚控制。
当闹钟时间到,蜂鸣器发出声音
。
具体连接方式参看图 2
中的蜂鸣器及其对应的网络标号
。
⑤
功能设置:根据系统功能,本数字时钟需要
5
个按键,因此可以采用独立式按键。
由五个非自锁按键分别与单片机 P3.2~P3.6
连接
。
按键定义及功能如表
1
所示
。


3 系统软件设计
本系统选用
C
语言编写源程序
。
C
语言在功能性
、结
构性
、
可读性
、
可维护性上有明显的优势,具有较强的可移
植性
。
程序在
Keil
软件平台进行设计,编译
、
调试
、
运行
。
Keil
提供了包括
C
编译器
、
宏汇编
、
链接器
、
库管理和一个
功能强大的仿真调试器等在内的完整开发方案,无论用
C
语言还是汇编语言编程,
Keil
方便易用的集成环境
、
强大
的软件仿真工具使程序调试运行事半功倍
。
程序通过主函
数调用子函数实现数字时钟的相关功能
。
①
主函数:主函数将定时
/
计数器
、
中断初始化后,无限循环时间显示函数 xianshi()
、
时间调节函数
tiaojie()
、
闹铃函数 naoling()
。
初始化过程中,外部中断
0、
1开中断,采用下降沿触发方式。
定时
/
计数器
0
选用工作方式
1
,定时时间单位为 50ms
。
PT0
置
1
是设置内部定时中断优先级大于外部中断优先级。
参考程序如下:
void main( )
{TMOD =0X01;TH0 =(65536 -50000)/256;TL0 =(65536 -
50000)%256;TR0=1;ET0=1;IT1=1
;
IT0=1;EX1=1;EX0=1;PT0=1;EA=1;
while(1){xianshi();tiaojie();naoling();}}
②
时间显示函数:考虑单片机
I/O
口数量有限,数字时钟显示时间位数较多,与硬件连接相对应,显示函数采用动态显示。
动态显示是利用人的视觉暂留效应,按位轮流点亮数码管,对于八位一体的共阴数码管,每一位轮流显示,如果每位 LED
闪动的频率足够高,就可以给人一种稳定显示的视觉效果。
程序中通过数组
zixing[ ]
赋值
0~9的字形代码。
单片机
P1
口控制段选信号
a~h
,
P2
口控制位选信号,变量 h
、
m、
s分别为时计数、分计数
、
秒计数
。
时间显示格式:hh-mm-ss
。
参考程序如下:
void xianshi( )
{unsigned char zixing [ ] ={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned int j; P1=zixing[s%10]; P2=0x7f;for(j=0;j<100;
j++);
P1=zixing[s/10]; P2=0xbf; for(j=0;j<100;j++);
P1=0x40; P2=0xdf; for(j=0;j<100;j++);
P1=zixing[m%10]; P2=0xef; for(j=0;j<100;j++);
P1=zixing[m/10]; P2=0xf7; for(j=0;j<100;j++);
P1=0x40; P2=0xfb; for(j=0;j<100;j++);
P1=zixing[h%10]; P2=0xfd; for(j=0;j<100;j++); P1 =zix
-
ing[h/10]; P2=0xfe;}
③
时间调节函数:判断是否有调节时间的按键按下
。按下 INC_H
的调节小时按键,小时加
1
,当小时等于
24时,显示为 0
。
按下
INC_F
的调节分钟按键,分钟加
1
,如果分钟等于 60
时,显示为
0
。
参考程序如下:
void tiaojie()
{if(INC_H==0){ xianshi( );if(INC_H==0){if(s==23) s=0;
else s++;
while(! INC_H)xianshi( )}}else if(INC_F==0)
{ xianshi( ));if(INC_F==0){if(f==59)f=0;else f++;while(!
INC_F) xianshi( );}}}
④
闹铃函数:当程序判断闹铃时间与时钟时间的分
、时一致时,数字时钟闹铃 20
秒,参考程序如下:
void naoling()
{if(flag_nao){if(f==f_nao&&s==s_nao)
{while(m<=20&&flag_nao){BEEP=! BEEP;xianshi();}}}}
4 运行结果
仿真电路
、
程序设计完成后,经过系统联调,数字时钟具备正确显示当前时间、
调整时间
、
闹钟闹铃功能,达到了设计指标。
系统仿真运行结果见图
3
。

5 总结
通过对数字时钟的总体设计
、
搭建仿真电路
、
程序设计、
系统联调,成功设计了基于单片机的数字时钟,最终的运行结果符合设计要求。
该数字时钟具备功能可靠
、
性价比高、
结构简单等优点
。
本设计适合应用于虚拟仪器的教学演示和实际的应用系统功能设计等方面,为数字时钟的智能化发展及功能扩展提供了可行性参考方案。