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