基于c语言的数字电子钟设计.docx

上传人:b****0 文档编号:17462675 上传时间:2023-07-25 格式:DOCX 页数:14 大小:784.28KB
下载 相关 举报
基于c语言的数字电子钟设计.docx_第1页
第1页 / 共14页
基于c语言的数字电子钟设计.docx_第2页
第2页 / 共14页
基于c语言的数字电子钟设计.docx_第3页
第3页 / 共14页
基于c语言的数字电子钟设计.docx_第4页
第4页 / 共14页
基于c语言的数字电子钟设计.docx_第5页
第5页 / 共14页
基于c语言的数字电子钟设计.docx_第6页
第6页 / 共14页
基于c语言的数字电子钟设计.docx_第7页
第7页 / 共14页
基于c语言的数字电子钟设计.docx_第8页
第8页 / 共14页
基于c语言的数字电子钟设计.docx_第9页
第9页 / 共14页
基于c语言的数字电子钟设计.docx_第10页
第10页 / 共14页
基于c语言的数字电子钟设计.docx_第11页
第11页 / 共14页
基于c语言的数字电子钟设计.docx_第12页
第12页 / 共14页
基于c语言的数字电子钟设计.docx_第13页
第13页 / 共14页
基于c语言的数字电子钟设计.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于c语言的数字电子钟设计.docx

《基于c语言的数字电子钟设计.docx》由会员分享,可在线阅读,更多相关《基于c语言的数字电子钟设计.docx(14页珍藏版)》请在冰点文库上搜索。

基于c语言的数字电子钟设计.docx

基于c语言的数字电子钟设计

一、功能要求

整体上要考虑:

结构简单大方、布局美观合理、操作方便易懂、尽量避免各元器件之间的相互影响。

1、以AT89C51单片机进行实现秒分时上的正常显示和进位,其中显示功能由单片机控制共阴极数码管来实现,数码管进行动态显示。

2、具有校时功能,按键控制电路其中时键、分键、秒键三个键分别控制时分秒时间的调整。

按秒键秒加1;按分键分加1;按时键时加1.

二、硬件设计

1、整体设计框图

2、管脚功能描述

(1)XTAL1(19脚)和XTAL2(18脚):

振荡器输入输出端口,外接晶振电路。

(2)RST/Vpd(9脚)为复位输入端口,外接电阻电容组成的复位电路。

(3)P0口8个端口依次和LED显示器的A、B、C、D、E、F、G和Dp端口对应连接,实现对显示器的片选功能。

(4)P2.0~P2.5依次与LED显示器的1、2、3、4、5、6一一连接,实现对显示器的为选功能。

(5)P3.0~P3.2依次与按键电路的秒、分、时三个按键相连接。

通过按键实现对时间的调试功能。

3、整体原理设计

其计时周期为24小时,显示满刻度为23时59分59秒,另外还有校时功能。

整个设计图由晶振电路、复位电路、AT89C51单片机、键盘控制电路组成。

显示电路将“时”、“分”、“秒”通过七段显示器显示出来,6个数码管的段选接到单片机的P0口,位选接到单片机的P2口。

数码管按照数码管动态显示的工作原理工作。

把定时器定时时间设为50ms,则计数溢出20次即得时钟计时最小单位秒,而20次计数可用软件方法实现,每累计60秒进1分,每累计60分钟,进1小时。

时采用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;每一次按后都有一次延迟,所有检测完后,就把时间显示出来。

3、显示电路流程图

由P2口进行位选功能,进行动态显示。

时间显示是先时个位计算显示,然后是时十位计算显示,再是分个位计算显示,再然后是分十位显示,再就是秒个位计算显示,最后是秒十位显示。

每一位显示后都有一个延时

4、中断电路流程图

定时器中断时是先检测1秒是否到,1秒如果到,秒单元就加1;如果没到,就检测1分钟是否到,1分钟如果到,分单元就加1;如果没到,就检测1小时是否到,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

#include

#defineucharunsignedchar

#defineuintunsignedint

/*七段共阴管显示定义*/

ucharcode

dispcode[]={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)//制

{seconde=0;

minite++;

if(minite==60)//秒钟设为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;//

个位

delay(4);

P2=0xfb;显示小时的显示小时的

P0=dispcode[minite/10];//显示分的十位

delay(4);

P2=0xf7;

P0=(dispcode[minite%10])|0X80;//显示分的个位

delay(4);

P2=0xef;

P0=dispcode[seconde/10];//显示秒的十位

delay(4);

P2=0xdf;

P0=dispcode[seconde%10];//显示秒的个位

delay(4);

}

/*******************************/

/*键盘扫描子程序*/

/*******************************/

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分的调整{

delay(30);

if(P3_1==0)

{

minite++;

if(minite==60)

{minite=0;}

}while(!

P3_1);

}

if(P3_2==0)//按键3小时的调整{

delay(30);

if(P3_2==0)

{

hour++;

if(hour==24)

{hour=0;}

}

}

while(!

P3_2);

}

voidtimer0(void)interrupt1using0//50ms中断一次

{

TH0=0x3c;

TMOD=0x11;

mstcnt++;定时器0方式1,

if(mstcnt==20)

{

seconde++;

mstcnt=0;//对计数单元清零}

}

/*******************************//*定时子程序*/

/*******************************/voidinit()

{

P3=0xff;//初始化p3口,全设为1TMOD=0x11;//time0为定时器,方式1TH0=0x3c;//预置计数初值TL0=0xb0;EA=1;ET0=1;

TR0=1;

}

/**************************/

/*主函数*/

/**************************/voidmain(void)

{

init();

while

(1)

{

keyscan();//按键扫描time_pro();//时间处理

display();//显示时间}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2