数字电子钟设计文档格式.docx

上传人:b****6 文档编号:16789780 上传时间:2022-11-26 格式:DOCX 页数:20 大小:186.04KB
下载 相关 举报
数字电子钟设计文档格式.docx_第1页
第1页 / 共20页
数字电子钟设计文档格式.docx_第2页
第2页 / 共20页
数字电子钟设计文档格式.docx_第3页
第3页 / 共20页
数字电子钟设计文档格式.docx_第4页
第4页 / 共20页
数字电子钟设计文档格式.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

数字电子钟设计文档格式.docx

《数字电子钟设计文档格式.docx》由会员分享,可在线阅读,更多相关《数字电子钟设计文档格式.docx(20页珍藏版)》请在冰豆网上搜索。

数字电子钟设计文档格式.docx

参考文献13

附录A电路原理图14

附录BPCB图15

附录C元器件布局图16

附录D元器件清单17

附录E程序清单18

1设计课题任务、功能要求说明及总体方案介绍

1.1设计课题任务

设计一个具有特定功能的电子钟。

具有时间显示、调整功能。

1.2功能要求说明

该电子钟上电或按键复位后能自动显示系统提示符“P.”,进入时钟准备状态;

第一次按电子钟启动/调整键,电子钟从00时00分00秒开始,进入时钟运行状态;

再次按电子钟启动/调整键,则电子钟进入时钟调整状态,此时可利用各调整键调整时间,调整结束后可按启动/调整键再次进入时钟运行状态。

1.3总体方案介绍及工作原理说明

1.3.1总体方案介绍

本电子钟主要由AT89S52单片机、4个独立键盘、显示接口电路和复位电路构成,设计课题的总体方案如图1所示:

本设计电路中,采用独立式键盘动态扫描方式。

利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据,同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。

图1总体设计框图

1.3.2电子钟工作原理说明

数字电子钟的计时原理为:

上电后,电子时钟显示P.,按下S2键后,从“00—00—00”开始计时。

当定时器0的定时时间满50ms后,定时器0溢出一次,溢出满20次后,数字电子时钟的秒加1,满60秒后,分加1,满60分后,时加1,满24时后,电子表重新从“00—00—00”开始计时。

当再次按下S2后,计数显示暂停,进入时间调整状态,按S3、S4、S5分别表示秒、分、时加1。

2硬件系统的设计

2.1硬件系统各模块功能简要介绍复位电路

2.1.1MCU

硬件电路采用的是80C51单片机中的AT89S52芯片。

其中包括256个数据存储器单元,4KB的程序存储器。

C51中共有两个16位的定时器/计数器,用于实现定时或者计数功能。

还有4个8位并行I/O口(P0、P1、P2、P3),以实现数据的并行输入/输出。

2.1.2电源电路

本次课题设计采用USB电源。

它可以热插拔。

这就让用户在使用外接设备时,不需要重复“关机将并口或串口电缆接上再开机”这样的动作,而是直接在电脑工作时,就可以将USB电缆插上使用。

而且具有携带方便,成本低,制作电路简单的特点,输出电压足以支持单片机工作。

2.1.3复位电路

复位是单片机的硬件初始化操作,其主要功能是把PC初始化为0000H,使单片机从0000H单元开始执行程序,并使其它功能单元处于一个确定的初始状态。

对于51单片机上有三种复位复位方式,为上电复位、按键复位和按键脉冲复位。

此次设计的电路采用按键复位。

按键复位,它是通过复位端经电阻与VCC电源接通而实现的。

2.1.4时钟电路

单片机的时钟电路由振荡电路和分频电路组成。

其中振荡电路由反相器以及并联外接的石英晶体和电容构成,用于产生振荡脉冲。

而分频电路则用于振荡脉冲分频,以得到所需要的时钟信号。

2.1.5键盘电路

由于按键较少,所以此处使用独立式键盘。

每个按键单独占用一根I/O口线,每个按键的工作不会影响其它I/O口线的状态。

四个按键接到单片机的P1.0-P1.3四根口线上。

当键按下时,在其相应的口线上产生低电平信号,键松开时为高电平信号。

2.1.6数码管显示电路

本次课题设计中采用的是两个4位一体的LED共阳数码管作为显示窗口,因此,将阳极公共引脚接+5V的电源,因而,当阴极引脚上加低电平时,发光二极管导通点亮。

并且,电路使用了8个NPN型的三极管反相驱动。

并且采用动态显示方式,用P0口来控制LED数码管的段控线,而用P2口来控制其位控线。

动态显示通常都是采用动态扫描的方法进行显示,即循环点亮每一个数码管,这样虽然在任何时刻都只有一位数码管被点亮,但由于人眼存在视觉残留效应,只要每位数码管间隔时间足够短,就可以给人以同时显示的感觉。

2.1.7下载口电路

硬件电路中,下载口电路通过P1口及复位引脚直接与单片机相连,以实现将编写好的程序下载到芯片中,实现相应的功能。

2.2电路原理图、PCB图、元器件布局图

2.2.1电路原理图

电路原理图见附录A。

2.2.2PCB图

电路PCB图见附录B。

2.2.3元器件布局图

元器件布局图见附录C。

2.3设计课题元器件清单

元器件清单见附录D

3软件系统的设计

3.1使用单片机资源的情况

在电子钟的编程过程中,单片机资源使用情况如下:

IO口线:

P0口为作数码管的段控口

P2口为作数码管的位控口

P1口低四位作键盘接口

定时器:

定时器0

3.2软件系统各模块功能简要介绍

本设计的软件系统主要采用以主函数、中断服务函数、键盘扫描函数、数码管显示函数和延时函数来实现的。

3.2.1主函数

主要是用于对输入信号的处理、输出信号的控制和对各个功能程序模块的运用及其控制。

3.2.2中断服务函数

用了定时器0中断,是为了使秒自加而使用定时器中断,定时50MS循环20次到一秒以后,向CPU申请中断,使秒自加1。

3.2.3键盘扫描函数

运用直接判断IO口线的方法编成键盘扫描程序,来完成用键盘监控程序的功能。

通过判键按下,再去抖,再确认是否真正有键按下,计数并保存闭合键码,最后判键释放,恢复键值。

3.2.4数码管显示函数

即为位控信号送到位控口,段控信号送到段控口,对八位LED数码管一次点亮。

3.3设计课题软件系统程序流程框图

3.3.1主函数流程图

图2主函数流程框图

3.3.2键扫描函数流程图

图3键扫描函数流程图

3.3.3中断服务函数流程图

图4中断服务函数流程框图

3.3.4显示函数流程图

图5显示函数流程图

3.4电子钟软件系统程序清单

程序清单见附录E

4设计结论、设计结果、误差分析、教学建议

4.1电子钟的设计结论及使用说明

本课程设计的目的是设计一个电子钟,在前期做出的实物上,通过编写程序基本上能够达到预期的目的,以下本次所作电子钟的具体的使用说明:

电子钟上电后,最右边一位显示P.,按下启动/调整键,电子钟从0时0分0秒开始自动运行,再次按下启动/调整键,电子钟运行停止,处于调整状态,按下调时键,时加1,按下调秒键,秒加1,按下调分键,分加1,这样可以实现时、分、秒的累加调整,再次按下启动/调整键,电子钟自动运行起来,处于运行状态,调整结束。

4.2电子钟实现的结果

实现了一下功能:

可调整运行的电子钟具有三种工作状态:

“P.”状态、运行状态、调整状态。

(1)“P.”状态,依靠上电或按复位键进入,在此状态下,按S3、S4、S5键均无效,按S2键有效,进入运行状态;

(2)运行状态,在此状态下,按S3、S4、S5键均无效,只有按S2键有效,按下S2键后,退出运行状态,进入调整状态;

(3)调整状态,按S3键进入调整秒,在此状态下,按S3一下,秒加1。

与此同时,S4、S5键均有效;

同理,按S4,分钟加1;

按S5,小时加1。

调整结束后必须按S2键,即可退出调整状态,进入运行状态。

时间显示格式为:

时-分-秒。

4.3设计课题出现问题及分析

在编写好程序,经过调试后下载到单片机中,发现运行完好,但是,如果手动按键则会出现24-60-60的现象。

再回到程序,仔细检查发现,在主函数键程序中,发现编写的程序是先对数据处理再判断再显示,因而显示的是判断之前的数据,因此才出现了如上的问题。

经修改之后,将判断语句放到处理之前,就能正常显示。

4.4设计体会及教学建议

4.4.1设计体会

这次课程设计已经圆满结束,从这次编程过程中,让我受益匪浅。

我深深地感受到自己欠缺的还很多,考虑问题不够全面。

对于刚接触到这个课题的时候,我感到不知所措,直到后来慢慢静下心来,理清思绪,才觉得都是把我们所学的综合到一起而已。

总的来说,这次课程设计,真正的考验了我很多。

让我学到的更多。

本设计的重点及难点在于显示函数以及数据处理,而精妙之处在于主函数中,判时是否为24,分、秒是否为60时,在加1后,先要判断再对数据处理显示。

4.4.2教学建议

通过一学期与王老师的接触,深深地感受到王老师讲课的诙谐幽默,并在这个学期真正的学到了很多知识。

在实验课上,虽然每次实验课总是提心吊胆,因为总是担心自己准备的不够充分,但是却还是因为这样,让自己懂得了很多,学到了很多。

并且充实的过来一个学期,现在回想这个学期,感觉还是很有成就感的。

不过,对于王老师有一点小小的建议,讲课的时候幽默是挺好的,可以让我听课兴致更高,但是也会因为这样偏离上课内容,有时候会照成后面讲课的时间不够,而变得讲课速度加快。

结束语

经过一个多星期,本次的课程设计电子钟最终圆满结束。

本次设计为数字电子钟,是以AT89S52单片机为核心,再结合相关元器件,如LED共阳数码管,独立键盘等,最后通过编写相关程序,得以实现电子钟显示及调整的功能。

在编写程序的过程中,我用了C语言和汇编语言编写了程序,但是最终汇编的结果不是让我很满意,而C语言结果却很稳定。

从编写程序的过程来说,对于汇编语言,需要自己安排存储单元,因此程序显得繁琐复杂,并且需要思路清晰,严谨。

相对而言,C语言就要方便简单许多。

在本次设计中,遇到了很多困难,但是却考验了我独立思考和解决问题的能力。

最后在数码管显示中,出现了矛盾的问题,感谢王老师的指点,让我豁然开朗。

通过本次课程设计,真的是收获良多。

我懂得了实践的重要性,也看到我们需要学习的路还很漫长。

当看到自己的努力有了成果时,那种喜悦油然而生。

这种一步一个脚印,踏实的感觉,会让我以后更加努力的。

我相信下次我会做的更加好。

致谢

这次的课程设计最终圆满的完成了,首先要感谢王老师。

谢谢王老师的细心教导以及对工作,对我们的认真、负责,让我们在学习知识的同时,也懂得了做人的道理,让我在这个学期成长了很多。

在此,我表示衷心的感谢!

同时也感谢身边的那些朋友,衷心的感谢你们,谢谢你们的帮助与支持!

参考文献

[1]李广第,朱月秀,冷祖祁.单片机基础[M].第三版.北京:

航空航天大学出版社,2007.6

LiGuangdi,ZhuYuexiu,LengZuqi.Scmcbasis[M].Thethirdedition.Beijing:

Aerospaceuniversitypress,2007.6

附录A电路原理图

附录BPCB图

附录C元器件布局图

附录D元器件清单

名称

数量

参数

电阻

3个

1KΩ

数码管

2个

4位一体共阳数码管

1个

200Ω

下载口

普通插座

40P

24个

470Ω

按键

9个

三极管

9012

USB供电线

1根

晶振

12MHz

电容

33pF

极性电容

22μF

芯片

1块

发光二极管

8个

六角开关

蜂鸣器

附录E程序清单

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

项目名称:

数字电子钟

作者:

李和

时间:

2012年12月21日

要求:

<

一>

.显示系统提示符“P.”

<

二>

.定义4个功能键:

分别为电子钟启动键/停止键;

调时键;

调分键;

调秒键

<

三>

.在系统提示符状态下,只有按启动键/停止键才能开启电子钟,电子钟进入运行状态;

再次按下启动键/停止键,电子钟进入调整状态,此时,调时、调分、调秒键才可以工作。

调整结束后,按下启动键/停止键,电子钟由调整状态返回运行状态,紧跟着以调整以后的时间运行。

芯片:

电路描述:

12MHz晶振,P2口位控口,P0口段控口,P1口为按键控制位

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

#include<

reg52.h>

#defineucharunsignedchar

#defineuintunsignedint

/*****共阳数码管段控码数组对应0,1,2,3,4,5,6,7,8,9,P.,-,灭********/

charcodeduankong_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,

0xf8,0x80,0x90,0x0c,0xBF,0xff};

/*共阳数码管位控码数组(从右往左点亮,反向驱动)******************/

charcodeweikong_code[]={0xef,0xdf,0xbf,0x7f,0xfe,0xfd,0xfb,0xf7};

charfind_code[8];

sbitS2=P1^0;

//启动键/停止键

sbitS3=P1^1;

//调秒键

sbitS4=P1^2;

//调分键

sbitS5=P1^3;

//调时键

ucharsecond=0;

ucharminite=0;

ucharhour=0;

uchartime=0;

//计数器,对50ms时基信号累加到1s

voiddisp();

//显示函数

voidSHUZU();

//缓冲数组函数

ucharKEYCHULI();

//P1口处理函数

ucharKEY();

//键扫描函数

voiddelay1s();

//1秒延时函数

voidDelayX1ms(intcount);

//1ms延时函数

/**************************显示函数**************************/

voiddisp()

{chari;

charj;

for(i=0;

i<

8;

i++)

{P2=weikong_code[i];

j=find_code[i];

P0=duankong_code[j];

DelayX1ms

(1);

}

/***********************P1口处理函数***********************/

ucharKEYCHULI()

{uchark;

k=P1;

//P1口内容送K

k=~k;

//取反

return(k);

//返回键值

}

/***********************键扫描函数******************************/

ucharkey()

{ucharkeyzhi,keyzhii;

//键盘按键键值临时存放

keyzhi=KEYCHULI();

//调P1口处理函数

if(keyzhi!

=0)//延时去抖动,否则函数返回

{disp();

//调显示函数去抖

disp();

keyzhi=KEYCHULI();

//再次调P1口处理函数

if(keyzhi!

=0)//有键按下,取键值并暂存

{keyzhii=keyzhi;

while(keyzhi!

=0)//判按键释放,没有延时去抖动等待释放

{disp();

disp();

}

keyzhi=keyzhii;

//按键释放后恢复按键键值

}

return(keyzhi);

//返回按键键值

/*********************缓冲数组函数****************************/

voidSHUZU()

{find_code[0]=second%10;

//时-分-秒显示数组初始化

find_code[1]=second/10;

find_code[2]=11;

find_code[3]=minite%10;

find_code[4]=minite/10;

find_code[5]=11;

find_code[6]=hour%10;

find_code[7]=hour/10;

/*********************1ms延时函数*******************************/

voidDelayX1ms(intcount)

{intm;

while(count--!

=0)

{for(m=0;

m<

80;

m++);

/***********************1s延时函数****************************/

voiddelay1s()

{TMOD=0X01;

EA=1;

ET0=1;

TH0=(65536-50000)/256;

//50ms送计数初值

TL0=(65536-50000)%256;

TR0=1;

do{disp();

B=key();

}

while(B!

=1);

//有条件转移

/******************中断服务程序********************************/

voidtime0()interrupt1

{time++;

if(time==20)//计数满20次,即为1s

{second++;

time=0;

if(second==60)//秒值等于60,秒清零,分加1

{second=0;

minite++;

if(minite==60)//分值等于60,分清零,时加1

{minite=0;

hour++;

if(hour==24)//时值等于24,时清零,返回,全部归零

{hour=0;

SHUZU();

/********************主函数**************************************/

voidmain()

{while

(1)

{find_code[0]=10;

//初始化显示“P.”

find_code[1]=12;

find_code[2]=12;

find_code[3]=12;

find_code[4]=12;

find_code[5]=12;

find_code[6]=12;

find_code[7]=12;

B=key();

if(B==1)//S2键按下,进入延时函数,开始自动计时并显示

{while

(1)

{switch(B)

{case0:

//暂停显示

break;

case1:

delay1s();

TR0=0;

//自动显示时间时-分-秒

case2:

second++;

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

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1