电子时钟设计(DS1302)基于51单片机(共15页).doc
精选优质文档-倾情为你奉上安 康 学 院单片机课程设计报告书 课题名称:电子时钟的设计(DS1302)姓 名:学 号:院 系:电子与信息工程系专 业:电子信息工程指导教师:时 间:2012年6月专心-专注-专业一、设计任务及要求:1、设计任务:设计一个能够显示年月日及时分秒的电子时钟。2、要 求:利用单片机芯片AT89C52,和DS1302芯片,使得数码管7SEG-MPX8-A-BLUE显示年月日和时间,时间和年月日分开显示,屏幕显示时间。指导教师签名: 年 月 日 二、指导教师评语:此次课程设计,该学生积极参与,积极思考,有问题及时提问,和同学配合良好,充分发挥了自由创新的设计思想,并且学会使用芯片AT89C52和Protues软件实现了具有显示年月日和时间功能的电子时钟。此设计满足设计要求,希望该学生继续保持。指导教师签名: 年 月 日 三、成绩评定:指导教师签名: 年 月 日四、系部意见:系部盖章: 年 月 日设计项目成绩评定表设计报告书目录一、设计目的1、掌握电子时钟的基本工作方式。2、进一步熟悉DS1302芯片的特性。3、通过使用各基本指令,进一步熟练掌握单片机的编程和程序调试。二、设计思路利用AT89C52的特点及DS1302的特点,设计一种基于DS1302单片机控制,再利用数码管显示的数字钟。本系统硬件利用AT89S52作为CPU进行总体控制,通过DS1302时钟芯片获取准确详细的时间(年、月、日、周、日、时、分、秒准确时间),对时钟信号进行控制,同时利用液晶显示芯片LCD1602对时间进行准确显示年、月、日、周、日、时、分、秒。三、设计过程3.1系统设计结构图图1系统设计结构图图2 系统软件流程图根据系统设计的要求和设计思路,确定该系统的系统设计结构图。如图1所示。硬件电路主要由MCU微处理控制器单元、DS1302时钟电路、储存器、复位电路、晶振电路、数码管显示模块构成。3.2 MCU微控制器电路AT89S52作为系统的核心控制元件,只有它能正常工作后才能使其它的元件进入正常工作状态。因此,下面对AT89S52进行必要的说明,AT89S52的管脚如图3所示。图3 AT89S52的管脚1)VCC:40脚,供电电压,一般接+5V电压。2)GND:20脚,接工作地。3)P0口:18脚,P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。对P0端口写“1”时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下,P0具有内部上电阻。但是P0口在程序校验作为输出指令字节时,需要外部加上拉电阻,一般上拉电阻选4.7K10K为宜。本设计中用5.1K的排阻对P0口进行上拉电平。4)P1口:3239脚,P1口是一个内部具有上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4个TTL门电流。P1端口写入“1”后,被内部上拉电阻把端口拉高,此时可以作为作输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流。5)P2口:2027脚,P2 口是一个具有内部上拉电阻的8 位双向I/O 口,P2 输出缓冲器能驱动4 个TTL 逻辑电平。对P2 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。6)P3口:1017脚,P3 口是一个具有内部上拉电阻的8 位双向I/O 口,P3 输出缓冲器能驱动4 个TTL 逻辑电平。对P3 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。7)RESET:9脚,复位输入端。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。8)ALE/P非:30脚,当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于系统校验。9)PSEN:29脚,外部程序存储器的选通信号。10)RST非/VP:31脚,访问外部程序存储器控制信号。当EA非为低电平时,读取外部程序存储器;当EA非端为高电平时,则读取内部程序存储器,设计中一般接高电平。11)XTAL1:19脚,振荡器反相放大器和内部时钟发生电路的输入端。如采用外部时钟源时,XTAL1为输入端。12)XTAL2:18脚,振荡器反相放大器的输出端。如采用外部时钟源时,XTAL2应悬空不接。3.3 LCD液晶显示电路液晶显示器以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,在各种小系统中得到了更广泛的应用。本设计中使用的液晶显示模块是LCD1602。图4所示为本设计LCD1602的连接图。图4 LCD1602的连接图3.4实时时钟电路本设计使用的实时时钟电路芯片是美国DALLAS公司生产的一种高性能、低功耗、带RAM的实时时钟电路芯片DS1302。VCC1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由VCC1或VCC2两者中的较大 者供电;当VCC2大于VCC10.2V时,VCC2给DS1302供电;当VCC2小于VCC1时,DS1302由VCC1供电。X1和X2是振荡源,外接32.768kHz晶振。RST非是复位/片选线,通过把RST非输 入驱动置高电平来启动所有的数据传送。图5 时钟电路3.5复位电路在AT89S52单片机中的振荡器运行时,RST非引脚上保持到少2个机器周期的高电平输入信号,复位过程即可完成。根据此原理,本设计采用上电复位和按键复位嵌套在系统中,增强了系统的实用性。本设计的具体复位图如下。图6 复位电路3.6 晶振电路AT89S52在工作时需要外部提供时钟信号,因此,本设计选择在其18脚19脚之间接上12MHz的晶振,为单片机提供1s的机器振荡周期。其电路连接图如图所示。在图中,电容器C3、C4起稳定振荡频率、快速起振的作用,其电容值一般在2050pF。图7 晶振电路四、系统调试与结果系统调试过程利用Proteus绘制出相应硬件电路后进行仿真,出现液晶显示无法正常显示的问题。经过思考和查阅的资料发现AT89C52的P0在进高电平时没有接上拉电阻导致LCD1602无法正常显示时间。修改电路后(P0口接上拉电阻)烧入程序后,程序正常运行,LCD1602准确的显示。用Proteus仿真能够正确的现实时间,但烧入学习板出现乱码现实不能正常工作。经过反复检查及思考发现仿真软件上的硬件电路与学习板上的硬件电路不一致无法对应起来。最后根据学习板的硬件电路修改相应程序及仿真软件上的硬件电路,最终现实了功能。系统调试结果图8 调试结果五、主要元器件与设备Protues软件、AT89C512芯片、DS1302芯片及各电路模块六、课程设计体会本设计利用单片机AT89C512控制串行实时时钟芯DS1302构成数字时钟电路,实现计时功能。该电路使用简单的三线接口,为单片机节省大量的接口资源,时钟芯片带有后备电池。该时钟功能强大,性能优越,能为很多领域,特别是对时钟工作的准确性和可靠性有较高要求。通过对电子时钟的设计的设计与制作,让我了解了电子时钟模块的编程思想,也让我明白了电子时钟的基本原理与设计理念,要设计一个电路必须先编好程序,用仿真软件测试成功后再得出结论。通过这次学习,让我对该软件有了更熟悉的了解,我们应该自己动手,实际操作,才会有更深刻的理解。经过这次设计我学到很多很多的的东西,不仅巩固了以前所学过的知识,而且通过这次课程设计使我懂得了理论与实际相结合的重要性,同时也提高了自己的实际动手能力和独立思考的能力。最后感谢老师的授课和教导!七、参考文献1张义和.例说51单片机M.北京:人民邮电出版社,2010年2 阎石编著 数字电子技术基础 (第五版) 北京高等教育出版社 2006.15503 蔡明文 冯先成主编 单片机课程设计 华中科技大学出版社 2007.34陈明萤 编著 8051单片机课程设计实训教材 清华大学出版社 20045 康华光 编著 模拟电子技术基础(第五版) 高等教育出版社 20066 黄智伟 编著 全国大学生电子设计竞赛电路(第一版)航空航天大学出版社 2006.36附录源程序代码:#include<reg52.h>#include <intrins.h>#define uchar unsigned charsbit SCK=P36; sbit SDA=P34;sbit RST = P35; bit ReadRTC_Flag;uchar l_tmpdate7=0,0,12,15,5,3,8;uchar l_tmpdisplay8;uchar bianma=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f; code uchar read_rtc_address7=0x81,0x83,0x85,0x87,0x89,0x8b,0x8d; code uchar table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40;void Write_Ds1302_Byte(uchar temp); void Write_Ds1302(uchar address,uchar dat );uchar Read_Ds1302 ( uchar address );void Read_RTC(void);/read RTC void Set_RTC(void); /set RTC void InitTIMER0(void);/inital timer0void main(void) InitTIMER0(); /初始化定时器0 Set_RTC(); while(1) if(ReadRTC_Flag) ReadRTC_Flag=0;Read_RTC(); l_tmpdisplay0=l_tmpdate2/16;l_tmpdisplay1=l_tmpdate2&0x0f;l_tmpdisplay2=10; /加入"-"l_tmpdisplay3=l_tmpdate1/16;l_tmpdisplay4=l_tmpdate1&0x0f;l_tmpdisplay5=10;l_tmpdisplay6=l_tmpdate0/16;l_tmpdisplay7=l_tmpdate0&0x0f;void InitTIMER0(void) TMOD|=0x01; /定时器设置 16位 TH0=(65535-500)/256; TL0=(65535-500)%256; /初始化值 ET0=1; TR0=1; EA=1;void Set_RTC(void) /设定 日历unsigned char i,*p,tmp;for(i=0;i<7;i+) /BCD处理DS1302存放的数据格式是BCD型tmp=l_tmpdatei/10;l_tmpdatei=l_tmpdatei%10;l_tmpdatei=l_tmpdatei+tmp*16; Write_Ds1302(0x8E,0X00);p=write_rtc_address; /传地址 for(i=0;i<7;i+) / 7次写入 秒分时日月周年 Write_Ds1302(*p,l_tmpdatei); /在0x80-0x8c中写入数据 p+; Write_Ds1302(0x8E,0x80); void Write_Ds1302( uchar address,uchar dat ) RST=0;_nop_(); SCK=0;_nop_(); RST=1; _nop_(); /启动 Write_Ds1302_Byte(address); /发送地址 Write_Ds1302_Byte(dat); /发送数据 RST=0; /恢复void Write_Ds1302_Byte(uchar temp) uchar i; for (i=0;i<8;i+) /循环8次 写入一个字节数据 SCK=0; SDA=temp&0x01; /每次传输低字节 temp>>=1; /右移一位 SCK=1; void Read_RTC(void) /读取 日历uchar i,*p; p=read_rtc_address; /地址传递 for(i=0;i<7;i+) /分7次读取 秒分时日月周年 l_tmpdatei=Read_Ds1302(*p); p+; uchar Read_Ds1302 (uchar address ) uchar i,temp=0x00; RST=0;_nop_();_nop_(); SCK=0;_nop_();_nop_(); RST=1;_nop_();_nop_(); Write_Ds1302_Byte(address); for (i=0;i<8;i+) /循环8次 读取数据 if(SDA) temp|=0x80;/每次传输低字节SCK=0;temp>>=1;/右移一位_nop_(); _nop_(); _nop_(); SCK=1; RST=0;_nop_(); /以下为DS1302复位的稳定时间 _nop_();RST=0;SCK=0;_nop_();_nop_();_nop_();_nop_();SCK=1;_nop_();_nop_();SDA=0;_nop_();_nop_();SDA=1;_nop_();_nop_();return (temp);/返回void tim(void) interrupt 1 using 1 /中断,用于数码管扫描 static uchar i,num; TH0=(65535-500)/256; TL0=(65535-500)%256;P0=tablel_tmpdisplayi;/查表法得到要显示数字的数码段P1=bianmai;i+;if(i=8) i=0; num+; if(20=num) ReadRTC_Flag=1; /使用标志位判断 num=0;