基于c语言的数字电子钟设计Word下载.docx
- 文档编号:7113887
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:15
- 大小:219.33KB
基于c语言的数字电子钟设计Word下载.docx
《基于c语言的数字电子钟设计Word下载.docx》由会员分享,可在线阅读,更多相关《基于c语言的数字电子钟设计Word下载.docx(15页珍藏版)》请在冰点文库上搜索。
时采用24进制计时器,可实现对一天24小时的累计。
校时电路时用来对“时”、“分”、“秒”显示数字进行校对调整,时分秒三个控制键分别接单片机的p3.2、p3.1、p3.0进行控制。
按一下秒键秒单元就加1,按一下分键分就加1,按一下时键时就加1。
4、晶振电路
单片机的时钟产生方法有两种:
内部时钟方式和外部时钟方式。
本系统中AT89C51单片机采用内部时钟方式。
采用外接晶体和电容组成的并联谐振回路。
其电路图如下:
5、显示电路
LED显示器是现在最常用的显示器之一发光二极管(LED)分段式显示器由7条线段围成8字型,每一段包含一个发光二极管。
外加正向电压时二极管导通,发出清晰的光。
只要按规律控制各发光段亮、灭,就可以显示各种字形或符号。
显示电路显示模块需要实时显示当前的时间,即时、分、秒,因此需要6个数码管,采用动态显示方式显示时间,其硬件连接方式如下图所示。
6、键盘控制电路
键盘可实现对时间的校对,用三个按键来实现。
按时键来调节小时的时间,按分键来调节分针的时间,按秒键来调节秒的时间。
其电路连接图如下:
三、软件设计
1、主程序流程图
主程序是先开始,然后启动定时器,定时器启动后在进行按键检测,检测完后,就可以显示时间。
主程序流程图如下
2、按键控制流程图
按键处理是先检测秒按键是否按下,秒按键如果按下,秒就加1;
如果没有按下,就检测分按键是否按下,分按键如果按下,分就加1;
如果没有按下,就检测时按键是否按下,时按键如果按下,时就加1;
每一次按后都有一次延迟,所有检测完后,就把时间显示出来。
N
Y
时加1
显示时间
结束
开始
秒按键按下?
秒加1
分按键按下?
分加1
时按键按下?
3、显示电路流程图
由P2口进行位选功能,进行动态显示。
时间显示是先时个位计算显示,然后是时十位计算显示,再是分个位计算显示,再然后是分十位显示,再就是秒个位计算显示,最后是秒十位显示。
每一位显示后都有一个延时
秒十位计算显示
时个位计算显示
时十位计算显示
分个位计算显示
分十位计算显示
秒个位计算显示
4、中断电路流程图
定时器中断时是先检测1秒是否到,1秒如果到,秒单元就加1;
如果没到,就检测1分钟是否到,1分钟如果到,分单元就加1;
如果没到,就检测1小时是否到,1小时如果到,时单元就加1,如果没到,就显示时间。
等于24小时
分单元清零,时单元加1
时单元清零
时间显示
中断返回
一秒时间到?
等于60秒
等于60分
秒单元加1
秒单元清零,分单元加1
四、系统测试
1、测试内容
(1)能否实现正常的时间显示
默认为走时状态,按24小时制分别显示“时时分分秒秒”六个数字,时间会按实际时间以秒为最少单位变化。
(2)能否进行正常的时间进位
当秒位为59时,下一次秒位数字变化分位是否加1同时秒位变为00;
当分位为59时,下一次分位数字变化时位是否加1同时分位变为00;
当时位为23时,下一次时位数字变化时为是否变为00.若满足以上要求则时间进位正常。
(3)能否通过按键进行时分秒的设定
按秒键对秒进行调整,按一下加一秒;
按分键对分进行调整,按一下加一分;
按时键对时进行调整,按一下加一小时,从而达到快速设定时间的目的。
若满足以上要求则符合方案要求。
若按一下连续加若干位,则按键延时时间设置太短,可以通过增大延时时间进行改进。
2、系统时钟误差分析
电子钟的走时误差S=S1-S2,S1表示程序实际运行计算所得的秒;
S2表示客观时间的标准秒。
S>
0时表示电子钟秒单元数值刷新滞后,即走时误差为“慢”;
反之,S<
0表示秒单元数值的刷新超前,即走时误差为“快”。
本次设计的单片机电子钟系统中,因条件有限S2所参照的时间是电脑显示时间,经测试S>
0即走时“慢”。
其误差主要来源包括晶体频率误差,定时器溢出误差,延迟误差。
晶体频率产生震荡,容易产生走时误差;
定时器溢出的时间误差,本应这一秒溢出,但却在下一秒溢出,造成走时误差;
延迟时间过长或过短,都会造成与基准时间产生偏差,造成走时误差。
3、软件调试
仿真部分采用protus7.5professional软件,可以很容易的实现各种系统的仿真。
先进行原理图的绘制;
绘制好后再选择Keil软件来生成.hex文件,选择运行,观察显示结果,根据显示的结果和课题的要求再修改程序,再运行查,直到满足要求。
4、仿真图
//基于AT89C51单片机的电子钟C语言程序
#include<
reg51.h>
absacc.h>
#defineucharunsignedchar
#defineuintunsignedint
/*七段共阴管显示定义*/
ucharcodedispcode[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
0xBF,0x86,0xCB,0xCF,0xEF,0xED,0xFD,0x87,0xFF,0xDF};
/*定义并初始化变量*/
ucharseconde=0;
ucharminite=0;
ucharhour=12;
ucharmstcnt=0;
sbitP3_0=P3^0;
//second调整定义
sbitP3_1=P3^1;
//minite调整定义
sbitP3_2=P3^2;
//hour调整定义
/*函数声明*/
voiddelay(uchark);
//延时子程序
voidtime_pro();
//时间处理子程序
voiddisplay();
//显示子程序
voidkeyscan();
//键盘扫描子程序
voidinit();
//定时子程序
/*****************************/
/*延时子程序*/
/****************************/
voiddelay(uchark)
{
ucharj;
while((k--)!
=0)
{
for(j=0;
j<
125;
j++)
{;
}
}
}
/**************************/
/*时间处理子程序*/
voidtime_pro(void)
{
if(seconde==60)//秒钟设为60进制
{seconde=0;
minite++;
if(minite==60)//分钟设为60进制
{minite=0;
hour++;
if(hour==24)//时钟设为24进制
{hour=0;
/*显示子程序*/
voiddisplay(void)
P2=0xfe;
P0=dispcode[hour/10];
//显示小时的十位
delay(4);
P2=0xfd;
P0=(dispcode[(hour%10)])|0X80;
//显示小时的个位
P2=0xfb;
P0=dispcode[minite/10];
//显示分的十位
P2=0xf7;
P0=(dispcode[minite%10])|0X80;
//显示分的个位
P2=0xef;
P0=dispcode[seconde/10];
//显示秒的十位
P2=0xdf;
P0=dispcode[seconde%10];
//显示秒的个位
/*******************************/
/*键盘扫描子程序*/
voidkeyscan(void)
if(P3_0==0)//按键1秒的调整
{
delay(30);
if(P3_0==0)
seconde++;
if(seconde==60)
{seconde=0;
while(!
P3_0);
if(P3_1==0)//按键2分的调整
if(P3_1==0)
if(minite==60)
{minite=0;
}
P3_1);
if(P3_2==0)//按键3小时的调整
if(P3_2==0)
if(hour==24)
while(!
P3_2);
voidtimer0(void)interrupt1using0//定时器0方式1,50ms中断一次
TH0=0x3c;
TMOD=0x11;
mstcnt++;
if(mstcnt==20)
mstcnt=0;
//对计数单元清零
}
/*定时子程序*/
voidinit()
P3=0xff;
//初始化p3口,全设为1
TMOD=0x11;
//time0为定时器,方式1
//预置计数初值
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
/*主函数*/
voidmain(void)
init();
while
(1)
keyscan();
//按键扫描
time_pro();
//时间处理
display();
//显示时间
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 语言 数字 电子钟 设计