用DS1302与LCD1602设计的可调式电子日历时钟的设计与实现.doc_第1页
用DS1302与LCD1602设计的可调式电子日历时钟的设计与实现.doc_第2页
用DS1302与LCD1602设计的可调式电子日历时钟的设计与实现.doc_第3页
用DS1302与LCD1602设计的可调式电子日历时钟的设计与实现.doc_第4页
用DS1302与LCD1602设计的可调式电子日历时钟的设计与实现.doc_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

广东岭南职业技术学院设计报告2014 2015学年第 二 学期题目: DS1302与LCD1602液晶显示电子钟姓名: 学号: 指导教师 : 23第1章 设计要求1.1 设计要求: 具有年、月、日、星期、时、分、秒等功能; 具备年、月、日、星期、时、分、秒校准功能;1.2 系统基本方案采用STC89C52芯片作为硬件核心,采用Flash ROM,内部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术, 当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。1.2.2 显示模采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见,与普通数码管相比功耗较小,硬件连接简单。所以显示部分采用1602液晶显示。1.2.3 时钟芯片采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、周、月、年一级闰年补偿的年进行计数,而且精度高,RAM作为数据暂存区,工作电压2.5V5.5V范围内,2.5V时耗电小于300nA.第2章 系统的硬件设计与实现2.1 电路设计框图图1电路设计框图2.2 系统硬件概述本电路是由STC89C52单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;时钟电路由DS1302提供,它是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31*8的用于临时性存放数据的RAM寄存器。可产生年、月、日、周日、时、分、秒,具有使用寿命长,精度高和低功耗等特点,同时具有掉电自动保存功能,本电路采用DS1302单字节传送方式实现与主控机之间数据的传送;显示部分由1602构成。2.3 主要单元电路的设计2.3.1 单片机主控制模块的设计STC89C52单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3, MCS-51单片机共有4个8位的I/O口(P0、P1、P2、P3),每一条I/O线都能独立地作输出或输入。单片机的最小系统如下图所示,18引脚和19引脚接时钟电路,XTAL1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出.第9引脚为复位输入端,接上电容,电阻及开关后够上电复位电路, 如图-2图2主控制系统2.3.2 时钟电路DS13021. DS1302的性能特性图3示出DS1302的引脚排列图,其中Vcc1为后备电源,Vcc2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768KHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电动行时,在Vcc大于等于2.5V之前,RST必须保持低电平。中有在SCLK 为低电平时,才能将RST置为高电平,I/O为串行数据输入端(双向)。SCLK始终是输入端。图3 DS1302的引脚图2. DS1302数据操作原理DS1302在每次进行读、写程序前都必须初始化,先把SCLK端置“0”,接着把RST端置“1”,最后才给予SCLK脉冲。DS1302的控制字,此控制字的位7必须置1,若为0则不能把对DS1302进行读写数据。对于位6,若对程序进行读/写时RAM=1,对时间进行读/写时,CK=0。位1至位5指操作单元的地址。位0是读/写操作位,进行读操作时,该位为1;该位为0则表示进行的是写操作。控制字节总是从最低位开始输入/输出的。DS1302的日历、时间寄存器内容:“CH”是时钟暂停标志位,当该位为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位为0时,时钟开始运行。“WP”是写保护位,在任何的对时钟和RAM的写操作之前,“WP”必须为0。当“WP”为1时,写保护位防止对任一寄存器的写操作。2.3.3 显示模块的设计1. 1602介绍字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。下面以长沙太阳人电子有限公司的1602字符型液晶显示器为例,介绍其用法。一般1602字符型液晶显示器实物如图- 4:图4 1602字符型液晶显示器实物图2. 1602LCD的基本参数及引脚功能1602LCD分为背光和不带背光两种,基控制大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,引脚功能说明1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表1所示:编号符号引脚说明编号符号引脚说明1VSS电源地9D2数据2VDD电源正极10D3数据3VL液晶显示偏压11D4数据4RS数据/命令选择12D5数据5R/W读/写选择13D6数据6E使能信号14D7数据7D0数据15BLA背光源正极8D1数据16BLK背光源负极表1:引脚接口说明表第1脚:VSS为地电源。第2脚:VDD接5V正电源。第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄器。第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第714脚:D0D7为8位双向数据线。第15脚:背光源正极。第16脚:背光源负极。1602LCD的一般初始化(复位)过程延时15mS写指令38H(不检测忙信号)延时5mS写指令38H(不检测忙信号)延时5mS写指令38H(不检测忙信号)以后每次写指令、读/写数据操作均需要检测忙信号写指令38H:显示模式设置写指令08H:显示关闭写指令01H:显示清屏写指令06H:显示光标移动设置写指令0CH:显示开及光标设置3.LCD1602液晶显示 如图5所示:图5 LCD液晶显示2.3.4 按键模块的设计根据设计要求需要选择四个独立按键分别为选择、加、减、确定,按键模块如图6所示:图6按键模块设计第3章 系统的软件设计3.1 主程序流程图 图-A 主程序流程图主程序:void main() init(); write_setds(0x80,0x50); write_setds(0x82,0x59); write_setds(0x84,0x10); write_setds(0x86,0x17); write_setds(0x88,0x03);write_setds(0x8a,0x03); write_setds(0x8c,0x10);write_setds(0x90,0xa4);while(1) keyscan(); display(); 3.2 按键扫描子程序调整时间用4个调整按钮,1个作为选择控制用,另外3个分别作为加调整,减调整和确定用。时间调整程序流程图如图-B所示:图-B 时间调整程序流程图void SET_DS1302()uchar i;Write_DS1302(0x8e,0x00);for(i=0;i7;i+)Write_DS1302(0x80+2*i,(DateTimei/104|(DateTimei%10);Write_DS1302(0x8e,0x80);/*-读取当前时期时间-*/void GetTime()uchar i;for(i=0;i7;i+)DateTimei=Read_Data(0x81+2*i); /*- 时间和日期转换成数字字符-*/void Format_DateTime(uchar d,uchar *a)a0=d/10+0;a1=d%10+0;/*- 判断是否为闰年-*/uchar isLeapYear(uint y)return (y%4=0&y%100!=0)|(y%400=0);/*- 星期转换-*/void RefreshWeekDay()uint i,d,w=5;for(i=2000;i2000+DateTime6;i+)d=isLeapYear(i) ? 366 : 365;w=(w+d)%7;d=0;for(i=1;iDateTime4;i+) d+=MonthsDaysi;d+=DateTime3;DateTime5=(w+d)%7+1;/*- 年月日时分秒+/-*/void DateTime_Adjust(char x)switch (Adjust_Index)case 6: /年if(x= 1&DateTime60) DateTime6-;MonthsDays2=isLeapYear(2000+DateTime6)? 29:28;if(DateTime3MonthsDaysDateTime4) DateTime3=MonthsDaysDateTime4;RefreshWeekDay();break;case 4: /月if(x= 1&DateTime41) DateTime4-;MonthsDays2=isLeapYear(2000+DateTime6)? 29:28;if(DateTime3MonthsDaysDateTime4)DateTime3=MonthsDaysDateTime4;RefreshWeekDay();break;case 3:/日MonthsDays2=isLeapYear(2000+DateTime6)? 29:28;if(x= 1&DateTime30) DateTime3-;RefreshWeekDay();break;case 2: /时if(x= 1&DateTime20) DateTime2-;break;case 1: /秒if(x= 1&DateTime10) DateTime1-;break; 3.3 液晶初始化子程序 /*初始化*/ void T0_INT() interrupt 1TH0=-50000/256;TL0=-50000%256;if(+tCount!=2) return;tCount=0;Format_DateTime(DateTime6,LCD_DSY_BUFFER1+5);Format_DateTime(DateTime4,LCD_DSY_BUFFER1+8);Format_DateTime(DateTime3,LCD_DSY_BUFFER1+11);strcpy(LCD_DSY_BUFFER1+13,WEEKDateTime5-1);Format_DateTime(DateTime2,LCD_DSY_BUFFER2+5);Format_DateTime(DateTime1,LCD_DSY_BUFFER2+8);Format_DateTime(DateTime0,LCD_DSY_BUFFER2+11);Display_LCD_String(0x00,LCD_DSY_BUFFER1);Display_LCD_String(0x40,LCD_DSY_BUFFER2);第4章 指标测试4.1 测试仪器测试如表2 所示。序号名称型号1PC机2单片机仿真软件Proteus、keil C3数字万用表DT9205B4ISP在线下载线表2 测试仪器4.2 硬件测试可调电子日历的电路,焊接不可轻视,只要出于一处的错误,则会对检测造成很大的不便,对于各种锋利的引脚要注意处理,否则会刺被带有包皮的导线,则会对电路造成短路现象。在可调电子日历的设计调试中遇到了很多的问题。回想这些问题只要认真多思考都是可以避免的,以下为主要的问题:(1)单片机晶振不起振(2)对可调电子日历修改时间或日期时,有时时间改变2次。解决:根据仪器的测试,发现电路引脚有接错的现象,重新焊接后晶振,复位正常,程序能够下载。4.3 软件测试可调电子日历是多功能的数字型,可以看当前日期,时间。在编写程序和调试时出现了较多的问题。最后经过多次的模块子程序的修改,一步一步的完成,最终解决了软件。4.4 测试结果分析与结论4.4.1 测试结果分析(1)在测试中遇到单片机晶振不起振,首先使用试测仪对电路进行测试,观察是否存在漏焊,虚焊,或者元件损坏.(2)LCD1602液晶不显示时间和日期,首先使用试测仪对电路进行测试,观察电路是否存在短路现象。然后查看程序是否正确无误,对程序进行认真修改。4.4.2 测试结论经过多次的反复测试与分析,可以对电路的原理及功能更加熟悉,同时提高了设计能力与及对电路的分析能力,同时在软件的编程方面得到更多的提高,对编程能力得到加强,同时对所学的知识得到很大的提高与巩固。附录一 系统电路图附图1系统电路图附录二 Proteus仿真图附图2 Proteus仿真图附录三 系统程序源程序如下:#include #include #include#define uchar unsigned char#define uint unsigned intsbit SDA=P10;/ DS1302数据线sbit CLK=P11;/DS1302时钟线sbit RST=P12; /DS1302复位线sbit RS=P20;sbit RW=P21;sbit EN=P22;sbit K1=P34; / 选择sbit K2=P35; / 加sbit K3=P36; / 减sbit K4=P37; / 确定void Display_LCD_String(uchar p,uchar *s);uchar tCount=0;/一年中每个月的天数,2月的天数由年份决定uchar MonthsDays=0,31,0,31,30,31,30,31,31,30,31,30,31;uchar *WEEK=SUN,MON,TUS,WEN,THU,FRI,SAT;/周日,周一到周六uchar LCD_DSY_BUFFER1=Date 00-00-00 ; /LCD显示缓冲uchar LCD_DSY_BUFFER2=Time 00-00-00 ;uchar DateTime7; /所读取的日期时间char Adjust_Index=-1; /当前调节的时间:秒,分,时,日,uchar Change_Flag=-MHDM-Y; uchar Read_LCD_State(); void LCD_Busy_Wait(); void Write_LCD_Data(uchar dat); void Write_LCD_Command(uchar cmd); void Init_LCD(); void Set_LCD_POS(uchar p); void DelayMS(uint x) uchar i;while(x-) for(i=0;i120;i+); uchar Read_LCD_State() uchar state;RS=0;RW=1;EN=1;DelayMS(1);state=P0;EN=0;DelayMS(1);return state; void LCD_Busy_Wait()while(Read_LCD_State()&0x08)=0x80);DelayMS(5);void Write_LCD_Data(uchar dat) /写数据LCD_Busy_Wait();RS=1;RW=0;EN=0;P0=dat;EN=1;DelayMS(1);EN=0;void Write_LCD_Command(uchar cmd)/写命令LCD_Busy_Wait();RS=0;RW=0;EN=0;P0=cmd;EN=1;DelayMS(1);EN=0;void Init_LCD()/LCD初始化Write_LCD_Command(0x38); DelayMS(1);Write_LCD_Command(0x01); DelayMS(1);Write_LCD_Command(0x06); DelayMS(1);Write_LCD_Command(0x0C); DelayMS(1);Display_LCD_String(0x00,zhongzhoudaxue);/DelayMS(1000);Display_LCD_String(0x40,dian zi ri li);DelayMS(2000);void Set_LCD_POS(uchar p)Write_LCD_Command(p|0x80);void Display_LCD_String(uchar p,uchar *s)uchar i;Set_LCD_POS(p);for(i=0;i16;i+)Write_LCD_Data(si);DelayMS(1);/*-向DS1302写入一字节-*/void DS1302_Write_Byte(uchar x) uchar i; for(i=0;i=1; /*-从DS1302读取一字节-*/uchar DS1302_Read_Byte()uchar i,b,t;for(i=0;i=1;t=SDA;b|=t7;CLK=1;CLK=0; return b/16*10+b%16;/*-从DS1302指定位置数据-*/uchar Read_Data(uchar addr)uchar dat;RST=0;CLK=0;RST=1;DS1302_Write_Byte(addr);dat=DS1302_Read_Byte();CLK=1;RST=0;return dat;/*-向DS1302某地址写入数据-*/void Write_DS1302(uchar addr,uchar dat)CLK=0;RST=1;DS1302_Write_Byte(addr);DS1302_Write_Byte(dat);CLK=0;RST=0;/*- 设置时间-*/void SET_DS1302()uchar i;Write_DS1302(0x8e,0x00);for(i=0;i7;i+)Write_DS1302(0x80+2*i,(DateTimei/104|(DateTimei%10);Write_DS1302(0x8e,0x80);/*-读取当前时期时间-*/void GetTime()uchar i;for(i=0;i7;i+)DateTimei=Read_Data(0x81+2*i); /*- 时间和日期转换成数字字符-*/void Format_DateTime(uchar d,uchar *a)a0=d/10+0;a1=d%10+0;/*- 判断是否为闰年-*/uchar isLeapYear(uint y)return (y%4=0&y%100!=0)|(y%400=0);/*- 星期转换-*/void RefreshWeekDay()uint i,d,w=5;for(i=2000;i2000+DateTime6;i+)d=isLeapYear(i) ? 366 : 365;w=(w+d)%7;d=0;for(i=1;iDateTime4;i+) d+=MonthsDaysi;d+=DateTime3;DateTime5=(w+d)%7+1;/*- 年月日时分秒+/-*/void DateTime_Adjust(char x)switch (Adjust_Index)case 6: /年if(x= 1&DateTime60) DateTime6-;MonthsDays2=isLeapYear(2000+DateTime6)? 29:28;if(DateTime3MonthsDaysDateTime4) DateTime3=MonthsDaysDateTime4;RefreshWeekDay();break;case 4: /月if(x= 1&DateTime41) DateTime4-;MonthsDays2=isLeapYear(2000+DateTime6)? 29:28;if(DateTime3MonthsDaysDateTime4)DateTime3=MonthsDaysDateTime4;RefreshWeekDay();break;case 3:/日MonthsDays2=isLeapYear(2000+DateTime6)? 29:28;if(x= 1&DateTime30) DateTime3-;RefreshWeekDay();break;case 2: /时if(x= 1&DateTime20) DateTime2-;break;case 1: /秒if(x= 1&DateTime10) DateTime1-;break; /*- 定时器每秒刷新LCD显示-*/void T0_INT() interrupt 1TH0=-50000/256;TL0=-50000%256;if(+tCount!=2) return;tCount=0;Format_DateTime(DateTime6,LCD_DSY_

温馨提示

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

评论

0/150

提交评论