数字电子钟课程设计报告.doc_第1页
数字电子钟课程设计报告.doc_第2页
数字电子钟课程设计报告.doc_第3页
数字电子钟课程设计报告.doc_第4页
数字电子钟课程设计报告.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课 程 设 计 课程名称单片机课程设计题目名称电子钟专业班级11电子信息科学2班学生姓名 学 号 指导教师 本设计是一种基于AT89C51单片机控制的数字万年历设计。它具有多项显示和控制功能。能用LCD实时显示当前年、月、日、星期、时间;可对时间进行调整;具有调整时间和日期时报警功能。本设计通过一个基于单片机的能实现万年历功能电子时钟的设计,从而达到学习、了解单片机相关指令在各方面的应用。系统由主控制器AT89C51、时钟电路DS1302、显示电路、按键电路和复位电路等部分构成,能实现时钟日历显示的功能,能进行时、分、秒的显示。关键字: AT89C51单片机、LCD液晶显示、双电源供电、数字电子钟设计一、任务设计:1、设计任务:利用AT89C51单片机设计一个具有如下功能的电子万年历。2、设计要求:l 能够显示年、月、日、时、分、秒、星期;l 可更改年、月、日、时、分、秒、星期;3.发挥部分:l 能够通过按键对时间与日期进行调整; 二、方案论证:1.显示部分:显示部分是本次设计的重要部分,一般有以下两种方案:方案一:采用LED显示,分静态显示和动态显示。对于静态显示方式,所需的译码驱动装置很多,引线多而复杂,且可靠性也较低。而对于动态显示方式,虽可以避免静态显示的问题,但设计上如果处理不当,易造成亮度低,有闪烁等问题。方案二:采用LCD显示。LCD液晶显示具有丰富多样性、灵活性、电路简单、易于控制而且功耗小等优点,对于信息量多的系统,是比较适合的。鉴于上述原因,我们采用方案二。2.时钟芯片的选择:数字时钟是本设计的核心的部分。根据需要可采用以下两种方案实现:方案一:直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。采用此方案虽然减少芯片的使用,节约成本,但是,实现的时间误差大。方案二:采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年进行计数,而且精度高,位的RAM做为数据暂存区,工作电压2.55.5V,2.5V时耗电小于300nA。基于时钟芯片的上述优点,本设计采用方案二完成数字时钟的功能。3.电源模块:方案一:采用干电池作为系统电源。但需经常换电池,不符合节约型社会的要求。方案二:采用直流稳压电源作为系统主电源。不仅不需要经常更换电源,并且当市电停止时能够采用干电池做为系统电源,使用更加安全可靠。基于以上分析,我们决定采用方案二三、总体方案:工作原理: 按照系统设计的要求和功能,将系统分为主控模块、时钟电路模块、按键扫描模块、LCD显示模块、电源电路、复位电路、晶振电路几个模块,系统框图如图1所示。主控模块采用AT89C51单片机,利用按键模块调整时间,时钟电路模块采用DS1302实时时钟实现对时间,日期的操作四、系统硬件设计(单元电路设计及分析):1.AT89C51最小系统:AT89C51为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3,每一条I/O线都能独立地作输出或输入。单片机的最小系统如下图所示,18引脚和19引脚接晶振电路,XTAL1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出。第9引脚为复位输入端,接上电容,电阻及开关后够上电复位电路,31引脚为电源端。 XTAL1:单芯片系统时钟的反向放大器输入端。XTAL2:系统时的反向放大器输出端,一般在设计上只要在XTAL1和XTAL2上接上一只石英震荡晶体系统就可以工作了,此外可以在两引脚与地之间加入20PF的小电容,可以使系统更稳定,避免噪音干扰而死机。RESET:重置引脚,高电平动作,当要对晶体重置时,只要对此引脚电平提升至高电平并保持两个及其周期以上的时间便能完成系统重置的各项动作,使得内部特殊功能寄存器内容均被设成已知状态。如下图所示:图2 单片机最小系统2.晶振电路时钟振荡电路图3所示,时钟振荡电路用于产生单片机正常工作时所需要的时钟信号,电路由两个30pF的瓷片电容和一个12MHz的晶振组成,并接入到单片机的XTAL1和XTAL2引脚处,使单片机工作于内部振荡模式。此电路在加电后延迟大约10ms振荡器起振,在XTAL2引脚产生幅度为3V左右的正弦波时钟信号,其振荡频率主要由石英晶振的频率决定。时钟振荡电路如图3所示。图3 AT89C51时钟振荡电路3.复位电路:复位电路由电阻和极性电容组成,如图4所示,通过高电平使单片机复位,在时钟电路开始工作后,当高电平的时间超过大约2us时,即可实现复位。此复位电路同时具备了上电复位和手动复位的功能,上电复位发生在开机加电时,由系统自动完成,手动复位通过一个按键来实现,在程序运行时,若遇到死机,死循环或程序“跑飞”等情况,通过手动复位就可以实现重新启动的操作。手动按钮复位需要人为在复位输入端RST上加入高电平。一般采用的办法是在RST端和正电源VCC之间接一个按钮以及在RST端和地之间接一个电阻,如图所示,当人为按下按钮时,则VCC 的+5V电平就会直接加到RST端,由于人的动作再快也会使按钮保持接通达数十毫秒,所以,完全能够满足复位的时间要求。图4 AT89C51复位电路4.DS1302时钟电路:时钟电路用于产生单片机工作所需要的时钟信号,单片机本身就是一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格地按时序进行工作。在AT89C51中芯片内部有一个高增益反相放大器,其输入端为芯片引脚X1,输出端为引脚X2,在芯片的外部跨接晶体振荡器和微调电容,形成反馈电路,就构成了一个稳定的自激振荡器。此电路采用12MHz的石英晶体。如图5所示。图5 DS1302时钟电路5.显示电路:引脚说明:引脚符号功能说明1VSS一般接地2VDD接电源(+5V)3V液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。4RSRS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。5R/WR/W为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作6EE(或EN)端为使能(enable)端,下降沿使能。7DB0底4位三态、双向数据总线0位(最低位)8DB1底4位三态、双向数据总线1位9DB2底4位三态、双向数据总线2位10DB3底4位三态、双向数据总线3位11DB4高4位三态、双向数据总线4位12DB5高4位三态、双向数据总线5位13DB6高4位三态、双向数据总线6位14DB7高4位三态、双向数据总线7位(最高位)(也是busy flang)电路接口说明:AT889C51的P0口作为数据的输出端,P3.5和P3.6,P3.7作为控制信号的输出端。如图7所示。图7 显示电路5、 软件设计5.1 编程语言及编程软件的选择本设计选C语言作为编程语言。C语言虽然执行效率没有汇编语言高,但语言简洁,使用方便,灵活,运算丰富,表达化类型多样化,数据结构类型丰富,具有结构化的控制语句,程序设计自由度大,有很好的可重用性,可移植性等特点。而汇编语言使用起来并没有这么方便。本设计选用了keil作为编程软件,Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。5.2时间的显示ML016L和1602一样,都是两行十六列的液晶显示屏。通过程序对ML016L进行初始化后,通过写指令和写数据的操作就可以再液晶屏上显示出对应的数据,而时钟数据则是从DS1302获取。这样可以显示出时间。六、程序:#include DS1302.h#include SMC1602.h#include KeyScan.h#include KeyProcess.h#define TIME1H 0x3C#define TIME1L 0xB0/定时器1溢出时间:50ms#define SCANPORT P2/44键盘扫描端口,低4位是行线,高4位是列线。/防抖动标志bit b_KeyShock=0; /键盘防抖动标志位。/当按键中断产生时,首先判断此位。/0-执行键盘扫描及键码处理程序;1-不执行。bit b_KillShock=0;/防抖标志清除位:0-不清除;1-清除。unsigned char uc_KillCount=1;/抖动标志清除计数,使用定时器1。/bit b_KeyScan=0;/0-不扫描;/1-扫描。/TIME stCurrentTime; /存储从DS1302获取的时间,以及显示字符串。bit b_TimeRefresh=0; /定时刷新标志。unsigned char uc_TimeRefresh=0; /定时刷新计数。void main()vdInitialize(); /初始化LCD。vDSInitialize(); /初始化DS1302。 SCANPORT=0x0F; /初始化键盘。vWriteCMD(0x81);vShowChar(Date:);vWriteCMD(0xC1);vShowChar(Time:);/IT0=1; /中断方式:下降沿。EX0=1; /开启外部中断。/TH1=TIME1H;TL1=TIME1L;TR1=1; /开启定时器1ET1=1; /开定时器1中断 EA=1;while(1)/if(b_TimeRefresh=1)/没900ms执行1次,刷新LCD时间显示。b_TimeRefresh=0;/恢复标志。vDSGetTime(&stCurrentTime);/获取当前时间并将其存入指定数组。vDateString(&stCurrentTime);/生成日期字符串。vTimeString(&stCurrentTime);/生成时间字符串。 vWriteCMD(0x86);/向LCD写入当前时间。vShowChar(stCurrentTime.ucaDateString);vWriteCMD(0xC6);vShowChar(stCurrentTime.ucaTimeString);/if(b_KeyScan=1) /如果有按键按下,则进行按键扫描和键码处理。b_KeyScan=0;vKeyProcess(ucKeyScan();/*/* */*外部中断0,用于开启键盘扫描及键码处理* */* */*void vINT0(void) interrupt 0if(b_KeyShock=0)b_KeyScan=1;/开启键盘扫描标志。b_KeyShock=1;/设置防抖动标志。else b_KeyShock=0;/如果有抖动则不执行键扫描,恢复防抖动标志。/if(b_KeyShock=1)b_KillShock=1;/如果防抖动标志位开启则开启防抖动标志清除位,/300ms后清除防抖动标志。/*/* */*定时器1中断,用于计时功能和防抖动标志清除以及显示报告* */* */*void vTimer1(void) interrupt 3/if(b_KillShock=1)if(uc_KillCount=16) /当防抖动标志位为1时,计时300ms后清除抖动标志位。b_KeyShock=0;b_KillShock=0;uc_KillCount=1;else uc_KillCount+;/if(uc_TimeRefresh=18) /900ms刷新显示1次。b_TimeRefresh=1;uc_TimeRefresh=0;elseuc_TimeRefresh+;/TH1=TIME1H;TL1=TIME1L;九、设计心得体会:通过这次课程设计,我对单片机的理论知识有了进一步的掌握,对单片机的原理和实际应用有了更多地理解和掌握。我对单片机的C语言编程有了更深刻的认识和更扎实的掌握,通过不断修改,不断尝试,对程序各个模块的函数都有了一个非常深入的掌握。在收获知识的同时,还培养了独立思考、动手制作的能力,在各

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论