1、 摘 要 钟表作为一种定式工具被广泛的使用在生产生活的各方面。人类最初依靠太阳的角度来进行定时,所以受天气的影响比较大,为了克服依靠自然现象定时的缺点人们发明的机器钟表,电子钟表一系列的定时工具。而电子钟表具有价格便宜、质量轻、定时误差小等优点,被广泛的应用在生产、生活的各个方面。由于电子钟能提供精确定时所以被广泛的运用在测量之中。此电子钟采用单片机进行设计,8段数码通过单片机进行刷新显示。其设计的产品除了单片机之外没有用到其他集成块,使其成本可以大大降低,而其便与维修。成品可以被广泛的用于公共场所、匾额装饰、以及教学等方面。关键词:电子时钟;单片机;数码管目 录1 数字电子钟设计任务、功能要
2、求说明及总体方案介绍1 1.1 设计任务1 1.2 功能要求说明1 1.3 设计总体方案介绍及原理说明12 数字电子钟硬件系统的设计3 2.1 硬件系统各模块功能简要介绍3 2.2 电路原理图、PCB图4 2.3 元器件清单43 设计课题软件系统的设计 5 3.1 数字电子钟使用单片机资源的情况5 3.2 数字电子钟软件系统各模块功能简要介绍5 3.3 数字电子钟软件系统程序流程框图6 3.4 数字电子钟软件系统程序清单114 设计结论、仿真结果、误差分析、教学建议12 4.1 数字电子钟的设计结论及使用说明12 4.2 数字电子钟的仿真结果12 4.3 数字电子钟的误差分析14 4.4 设计
3、体会14 4.5 教学建议15参考文献 16致谢17附录一 电路原理图18附录二 电路PCB图19附录三 程序清单20251 数字电子钟设计任务、功能要求说明及总体方案介绍1.1 设计任务 设计一个具有特定功能的电子钟,要求该电子钟能正确显示时、分、秒,能够对时间进行调整。1.2 功能要求说明该电子钟上电或按键复位后能自动显示系统提示符“P.”, 进入时钟准备状态;第一次按电子钟启动/调整键,电子钟从0时0分0秒开始运行,进入时钟运行状态;再次按电子钟启动/调整键,则电子钟进入时钟调整状态,此时可利用各调整键调整时间,调整结束后可按启动/调整键再次进入时钟运行状态。1.3 总体方案介绍及工作原
4、理说明1.3.1 总体方案介绍本系统主要设计思想是:整个系统用单片机为中央控制器,由单片机执行采集时钟电路的时间信号并通过显示模块来输出信号及相关的控制功能。时钟电路产生时钟信号,利用单片机的I/O口传给单片机;并通过P0和P2控制数码管显示时间, 通过P1口外接4个按键对时间进行调整。本电子钟由AT89S52单片机、时钟电路、复位电路、4*1独立键盘、限流电阻、电源电路、USB接口电路和8位数码管构成。总体方案图如图1.1所示。AT89S52电源振荡电路复位电路独立式键盘驱动电路数码管显示限流图1.1 总体方案图1.3.2 工作原理说明 本电子钟的所有的软件、参数均存放在AT89S52的Fl
5、ash ROM和内部RAM中,减少了芯片的使用数量简化了整体电路也降低了整机的工作电流。由于AT89S52芯片内部Flash ROM有8KB,RAM有256个字节,故软件下载编译时有足够的存储空间。键盘采用动态扫描方式。利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据,同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。2 数字电子钟硬件系统的设计2.1 硬件系统各模块功能简要介绍本设计的硬件系统主要采用以下基本模块来实现:单片机最小系统模块、输入模块、输出模块和电源模块四个模块。 (1) 单片机最小模块 单片机最小化模块
6、由时钟电路、复位电路和AT89S52单片机构成。时钟电路由振荡电路和分频电路组成。其中振荡电路由高增益反相器以及并联外接的石英晶体和电容构成产生振荡脉冲。而分频电路则用于把振荡脉冲分频,已得到所需的时钟信号。振荡电路由单片机芯片的XTAL1端输入,XTAL2端输出。通过这两个引脚并接一个石英晶体振荡器和两个电容(电容一般取30pF)。而AT89S52中自带有分频电路所以不需要外接电路对脉冲信号进行分频。复位是单片机的硬件初始化操作,经复位操作后,单片机系统才能开始正常工作。复位电路用于产生复位信号,通过RET引脚送入单片机,进行复位操作。 (2) 输入模块 输入模块由五个按键构成,一个电源开关
7、键,一个复位键。独立式键盘通过程序控制来完成电子钟的启、停及时间调整。A键控制电子钟的启、停;B键调整时;C键调整分;D键调整秒。电源开关键控制电源的闭合和断开。复位键控制单片机系统的复位操作。 (3) 输出模块 输出模块为2个四位一体的LED所组成的八位数码管显示器。数码管都为共阳极接法,由74LS245芯片进行驱动和阻值都为470的八个电阻进行限流,提高显示亮度,数码管显示电路采用动态显示方式。 (4) 电源模块 直流稳压电源一般由电源变压器、整流滤波电路及稳压电路组成。直流稳压电源设计的主要内容是根据性能指标,选择合适的电源变压器、集成稳压器、整流二极管及滤波电容。本设计中所需要的电源有
8、PC机的USB口直接供电,没有设计直流稳压电源,故在此不作详细介绍。2.2 电路原理图、PCB图数字电子钟电路原理图,见附录一。数字电子钟电路的PCB图,见附录二。2.3 元器件清单数字电子钟元器件清单如表2.1所示。 表2.1元器件清单元器件名称型 号数量单片机AT89S521片芯片座40脚1个四位一体数码管共阳极2个晶振12MHZ1个瓷片电容33pf2蜂鸣器5V1个电阻4.7K1个电阻1K3个电阻47024个电阻2001个电容22uf1个三极管S90129个排阻10K2个LED指示灯 绿9个单排插针8脚4排下载口10针1个温度传感器18B201个六脚开关1个3 数字电子钟软件系统的设计3.
9、1 数字电子钟使用单片机资源的情况根据实际和需要,本次设计选用定时器0做时钟定时,按方式1工作,每隔50ms溢出中断一次,计满20次为止。使用了通用寄存器组中第二组中的R0,R1,R3。和通用寄存器组三中的R6,R7片内RAM分配情况如表3.1所示:表3.1RAM分配情况78H79H7AH7BH7CH7DH7EH7FH秒个位秒十位分割符分个位分十位分割符时个位时分位20H46H键值中断次数P0.0-P0.7段控线,接LED的显示段a,b,c,d,e,f,g, dpP2.0P2.3,P2.4P2.7,位控线,从左至右(LED7,LED6,LE5,LED4,LED3,LED2,LED1,LED0)
10、使用定时器/计数器0,定时功能,工作方式1,提供50毫秒的定时时间,以中断方式工作,计满20次即得到秒计时单位;应用了显示字符段选码表(共阳极代码首地址TAB)3.2 数字电子钟软件系统各模块功能简要介绍 (1)主程序:主要建立堆栈和对PSW清零,显示P. (2)时钟运行程序:对定时器设置计数初值,开启定时器和中断,并调显示程序显示时钟的运行情况。 (3)时钟调整程序:关定时器,调键盘扫描程序,对时钟的时、分、秒进行加的调整。 (4)键盘扫描程序:读P1口的数据,把按键的状态输入单片机。 (5)显示程序:把存放在显示缓冲区里的时钟数据通过查表得到所对应的段控码送到数码管上,以使数码管正确的显示
11、时间。 (6)中断服务程序:进行计时操作用于完成对时、分、秒的加操作,以使电子钟能够正常运行。 (7)时钟加1程序:使时钟时、分、或者秒完成加1的操作。 (8)显示缓冲区清零程序:完成所指定的显示缓冲单元清零操作。3.3 数字电子钟软件系统程序流程框图3.3.1 电子钟主程序程序流程框图 图3.1电子钟主程序程序流程框图接上图: 图3.1 电子钟主程序程序流程框图3.3.2 键盘扫描程序流程图图3.2 键盘扫描程序流程图3.3.3 显示程序流程图:图3.3 显示程序流程图3.3.4 中断服务程序流程图 图3.4 中断服务程序流程图3.3.5 时钟加1子程序: 图3.5 时钟加1子程序流程图3.
12、3.6 时钟缓冲单元清零程序流程图 图3.6 时钟缓冲单元清零程序流程图3.4 数字电子钟软件系统程序清单 (见附录三)4 设计结论、仿真结果、误差分析、教学建议4.1 数字电子钟的设计结论及使用说明4.1.1 设计结论本电子钟是利用AT89S52单片机通过汇编编程实现电子钟的计时功能的,经过程序的调试和仿真,可以在实物上实现电子钟的显P.、计时、调整等基本功能。通过对电子钟的编程,我学到了很多知识,对书本上所讲的东西可以运用到实践中去了,同时也对自身的不足之处有了更清醒的认识。4.1.2 使用说明(1) 时间显示:电子钟上电后,8位数码管显示初始状态即最左边的一个数码管显示P.。按下A键后电
13、子钟进入自动计时状态,电子钟显示00时00分00秒并开始运行。(2) 时间调整:若要进行时间调整,则需再次按下A键,进入时间调整状态,然后分别按下B键调时,按下C键调分,按下D键调秒,按下B、C、D键并松开可使电子钟的秒,分,时分别加一。调整好时间后,按下A键就可以回到调整好的时间为基础的自动计时状态。无论是在自动计时,还是在调整校正时,都可按下复位键使系统回到显示P.的初始状态。其中B键显示范围为0-23,0为24点;C,D键显示范围为0-59,0 为60分。4.2 数字电子钟的仿真结果在Proteus ISIS的Debug菜单中选择Execute,运行程序,仿真得到的结果分别如下所示。 显
14、示“P.”的仿真图如图4.1所示为通电情况下在没有按下功能键A之前数码管的显示情况,显示“P.”。图4.1显示P.仿真图时钟启动/调整键即A键的仿真图如图4.2所示,即按下功能键A键时钟开始运行电子钟从0时0分0秒开始运行。图4.2 第一次按下时钟功能键A后的仿真图时钟功能键A第二次按下进入时钟调整状态,此时电子钟定时关闭,按下B、C、D键即可对时钟的时、分、秒进行调整,我这里是以01-01-01作为基准点按下A键开始调整的。时钟调整到10-01-01的仿真图如图4.3所示图4.3 按下B键即时调整键后的仿真图时钟调整到10-10-01的仿真图如图4.4所示。图4.4 按下C键即分调整键后的仿
15、真图时钟调整到10-10-10的仿真图如图4.5所示。图4.5 按下D键即秒调整键后的仿真图当再次调整完之后,按下时钟功能键A,定时器开启,时钟开始运行,其运行后的仿真图如图4.6所示。图4.6 当再次按下A键后的仿真图4.3 数字电子钟的误差分析本电子钟在运行中会产生一定的误差,误差产生有三种可能,首先是采用的计时方案是软件计时的,计时优势利用中断来实现。而当电子钟运行时间1秒时,又得去执行中断程序,这个过程是需要时间的,所以就产生了一定的误差,当然这个误差是不可避免的。其次还有硬件系统也有一定的影响。单片机工作会受到环境的影响,比如温度、湿度,以及其它电子设备的干扰。因此,应该让电子钟工作
16、在适度温度、干燥和电子干扰较少的环境下,还有一种方法就是采用实时时钟芯片,这样可以使误差降低到最少。第三,设计用到12MHz的晶振,计算是满8次为一秒钟,但实际会慢很多。4.4 设计体会本次课程设计持续了几周时间,通过上网和到图书馆查阅资料最终完成了数字电子钟课程设计。设计主要包括两个方面:硬件设计和软件设计。对于硬件设计,图纸设计过程中问题不大 。Proteus软件上画过很多硬件设计的图纸,所以硬件设计对我们来说问题不大。但是实物制作出现了很多问题,如:打印PCB纸、印刷电路板、制板等工序。这些都是我们不熟悉的,所以在制作实物的过程中产生了很多错误,以致于实物的制作不成功。对于软件设计,开始
17、的时候出现了好多问题。我想这可能是因为自己很少动手编写这种大型程序,再者自己程序设计这方面还存在某些问题,并且是初次将编程与实物制作结合起来,导致了在软件设计出现了这些难题。用汇编语言编写程序要模块性运用子模块,不然编写起来很费事,编写过程中要建立起一种严谨系统的思维方式,比如子程序系统有中断程序、加1子程序、显示程序、扫键程序、延时程序等。程序写的时候会发现自己很多地方不懂,在解决的问题同时不仅学到了很多东西,而且对于各个子程序的运行情况也有了更深层次的理解。想向与现实还是有区别的它是一个培养自己能力的过程因为在制作过程中都会碰到一些自己意想不到的问题。通过对前面所学知识的回顾和理解,我渐渐
18、将程序编了出来,编写过程中我学到了很多新的知识。本次课程设计,让我受益匪浅,认识到了自己的许多缺点和不足,使我深深的感受到了理论联系实际的必要性及其重要性。在我们以往的学习过程中,我们刻意地去加强理论的基础,对于一个程序我们只求它在运行时没有出错,我们便以为我们的计划成功了岂不知它能否在硬件结构中得以实现则是另外一回事,这就要求我们的动手能力,如果无法使软件与硬件实现有机的结合,那么再好的程序也只是一堆废字符。4.5 教学建议我其实没什么资格跟您提教学建议,因为我都没去上课,在此我得跟您说声对不起,同时也意识到了自己的错误。我希望老师您应该多加强学生软件部分的能力培养,即编程能力的提高,在课堂
19、上多讲程序实例,多分析,多演示,在作业中多布置编程题,在实验中严格要求学生自己编程,这些对学生编程能力的提高有很大的帮助。以上是我的一点建议,希望老师能够喜欢。参考文献 致 谢 通过不断努力,我终于完成了这次电子钟的课程设计。通过这次课程设计,对课本上的知识有了更深一步的了解,也学到了很多课本上学不到的知识,在动手方面也掌握了很多方法。在这个过程中,有很多帮助我克服困难的人,在这里特别感谢吴乐老师对我的教导,感谢她教给我单片机的知识,并在学习过程中帮助我解决问题。同时也感谢各位帮助我的同学,感谢他们帮助我解决在课程设计中遇到的问题,让我学到了好多知识,积累了宝贵的经验。附录一 电路原理图附录二
20、 PCB图附录三 程序清单ORG0000HSTART:LJMP MAIN ORG000BHLJMP TT0KEYA BIT20H.0KEYB BIT20H.1KEYC BIT20H.2KEYD BIT20H.3;-主程序部分-MAIN:MOVSP,#60H;建立堆栈MOV77H, #0AH;把P.的字形代码送显示缓冲区MOVR0,#78H;把“灭”的字形代码送显示缓冲区MOVR7,#07HPPP:MOVR0,#0CHINC R0DJNZ R7,PPPPD:LCALL DIR;调显示子程序,只显示一个P.LCALL KEY;调键扫JB KEYA,SF;若A键按下,转SFLJMP PD;若无键按下
21、,转PDSF: LCALL DIR;判A键是否释放LCALL KEYJB KEYA,SF ;若A键未释放,转SF继续判释放MOVR0,#77H ;若A键释放,显示缓冲区全清零MOVR7,#08HQL:MOVR0,#00HINC R0DJNZ R7,QLMOV79H, #0BH ;79H送“-”的字形代码MOV7CH,#0BH ;7CH送“-”的字形代码SETB 0EH ;设0EH位为A键标志位KDS:MOVTMOD,#11H ;定时器初始化MOVTH0,#3CH ;定时50msMOVTL0, #0B0HSETB EA ;开总中断SETB TR0 ;开定时器SETB ET0 ;开定时器中断MOV
22、30H, #20 ;设计1秒中断次数;-键盘监控程序-LOOP1:LCALLDIR ;调显示程序LCALLKEY ;调键扫JBKEYA, KEYG;若A键按下,转KEYGJB0EH, LOOP1 ;判A是否处于调整状态JBKEYB, KEYH;若B键按下,转KEYHJBKEYC, KEYM;若C键按下,转KEYMJBKEYD, KEYS ;若D键按下,转KEYSLJMPLOOP1 ;没有键按下,转会LOOP1;-键功能程序-KEYG:LCALL DIR ;调显示LCALL KEY ;调键扫JB KEYA, KEYG ;若A键按下,转KEYGCPL 0EH ;取反0EHJB 0EH, KDS ;
23、判A是否处于运行状态CLR EA ;否,则关定时器CLR TR0CLR ET0LJMP LOOP1KEYH:LCALL DIR ;时加1MOV R0, #7EHLCALL ADD1MOV A, R2XRL A, #24HJNZ HHLCALL CLR0HH:LCALL DELAY1LJMP LOOP1KEYM:LCALL DIR ;分加1MOV R0, #7BHLCALL ADD1MOV A, R2XRL A, #60HJNZ MMLCALL CLR0MM:LCALL DELAY1 LJMP LOOP1KEYS:LCALL DELAY1 ;秒加1MOV R0, #78HLCALL ADD1MO
24、V A, R2XRL A, #60HJNZ SSLCALL CLR0SS:LCALL DIRLJMP LOOP1;-显示程序-DIR:PUSH DPH ;保护现场 PUSH DPL PUSH ACC PUSH PSW MOV R0, #77H;显示缓冲区首地址MOV R3, #80H;位控码初值LD0:MOV P2, R3;位控码送P2口MOV A, R0;段控码送P0口MOV DPTR, #TABLEMOVC A, A+DPTRMOV P0, ALCALL DELAY;延时2msINC R0;显示缓冲区地址加1MOV A, R3JB ACC.0, LD1 ;判是否到数码管最高位,是,转LD1
25、RR A;否,右移位控码,即左移数码管MOV R3, A;保存位控码值LJMP LD0LD1: POP PSW ;恢复现场 POP ACC POP DPL POP DPHRET;-键码处理部分-KEYCL: PUSH PSW ;保护现场 MOV A, P1 ;读P1,口,取键值 CPL A ;取反键值 ANL A, #0FH ;屏蔽P1口高4位 MOV 20H, A ;保存键值 POP PSW RET;-键扫描程序-KEY: LCALL KEYCL ;调键处理子程序 JZ EXIT ;没有键按下,转EXITLCALL DIR ;去抖动LCALL DIR LCALL KEYCL ;调键处理子程序
26、JZ EXIT ;没有键按下,转EXITEXIT:RET-中断服务程序-TT0: PUSH PSW ;保护现场PUSH ACCSETB PSW.3 ;选择当前通用寄存器组为组1MOV TL0, #0B0H ;重置计数初值MOV TH0, #3CHMOV 79H, #0CH ;送灭的显示代码MOV 7CH, #0CHMOV A, 30H ;1秒的中断次数减1DEC AMOV 30H, AJNZ RET0 ;若中断次数不满,返回LCALL DELAYMOV 79H, #0BH ;送“-”的字形代码MOV 7CH, #0BHMOV 30H, #20MOV R0,#78H ;秒显示缓冲单元地址ACAL
27、L ADD1 ;秒加1MOV A, R2XRL A, #60H ;判断是否到60sJNZ RET0 ;不到,转RET0返回ACALL CLR0 ;到则显示缓冲单元清零 MOV R0,#7BH ;分显示缓冲单元地址LCALL ADD1 ;分加1MOV A, R2XRL A, #60H ;判断是否到60minJNZ RET0 ;不到,转RET0返回LCALL CLR0 ;到则显示缓冲单元清零SETB P1.4MOV R0,#7EH ;时显示缓冲单元地址ACALL ADD1 ;时加1MOV A, R2XRL A, #24H ;判断是否到24hJNZ RET0 ;不到,转RET0返回LCALL CLR
28、0 ;到则显示缓冲单元清零RET0:POP ACC ;恢复现场POP PSWRETI;- 加1程序-ADD1:MOV A, R0 ;十位数送ADECR0SWAP A ;十位数占高四位ORLA,R0 ;个位数占低四位ADDA,#01H ;加1DA A ;十进制调整MOVR2,A ;全值暂存R2中ANLA,#0FH ;屏蔽十位数,取出各位数MOVR0,A ;个位值送显示缓冲单元MOVA,R2 INC R0ANLA,#0F0H ;取出十位数SWAP A ;使十位数占低四位MOVR0,A ;十位值送显示缓冲单元RETCLR0:CLR AMOVR0,A ;十位数缓冲单元清零DECR0 MOVR0,A ;个位数缓冲单元清零RET;-延时程序-DELAY:MOVR6,#250 ;延时2msDL:NOP NOP DJNZ R6,DLRETDELAY1: MOV R5, #20HDL1: LCALL DIR DJNZ R5, DL1RETTABLE:DB 0C0H;0-9的显示代码DB 0F9HDB 0A4HDB 0B0HDB 99HDB 92HDB 82HDB 0F8HDB 80HDB 90HDB 0CH ;p.的显示代码DB 0BFH ;“-”的显示代码DB 0FFH;灭的显示代码END .