用DS1302与LCD1602设计的可调式电子日历时钟的设计与实现.docx
《用DS1302与LCD1602设计的可调式电子日历时钟的设计与实现.docx》由会员分享,可在线阅读,更多相关《用DS1302与LCD1602设计的可调式电子日历时钟的设计与实现.docx(40页珍藏版)》请在冰豆网上搜索。
用DS1302与LCD1602设计的可调式电子日历时钟的设计与实现
中州大学信息工程学院
毕业设计(论文)
2011—2012学年第二学期
题目:
用DS1302与LCD1602设计的可调式电子日历时钟的设计与实现
学生姓名(学号)梁慧萍田萌萌宋书倩
指导教师刘爱荣职称教授
评阅教师职称
时间
中州大学信息工程学院毕业设计(论文)开题报告
课题名称(来源、类型):
用DS1302与1602LCD设计的可调式电子日历与时钟的设计
指导教师:
刘爱荣学生姓名:
梁慧萍田萌萌宋书倩
开题报告内容:
(调研资料的准备,设计/论文的目的、要求、思路与预期成果;任务完成的阶段内容及时间安排;小组内其他成员的分工;完成设计(论文)所具备的条件因素等。
)
1.目的:
实现日历和时钟的显示并且能够调整
2.要求:
完成可调式电子日历和时钟的软件和硬件的设计,包括单片机的相关内容;日历时钟模块的设计,液晶显示模块的设计,按键模块的设计。
控制程序的编写等。
3.预期成果:
仿真成功,做出实物。
(1)显示初始值日历时钟初始值;
(2)用按键调整日历时钟。
4.时间安排:
第1周:
熟悉课题的基本要求,查阅相关资料,初步拟定设计的
整体方案,完成开题报告。
第2-3周:
自学这次课题所涉及的相关内容,包括器件基础知识、单片机,DS1302时钟芯片工作原理和相关软件的使用以及LCD1602液晶显示屏的相关内容。
并设计一些简单的实际电路,熟练所学内容并加以巩固。
第4-6周:
设计DS1302时钟模块的控制电路、LCD1602液晶显示电路、电源电路等硬件电路,并用Proteus仿真
第7周:
焊接调试电路,根据个部分的作用对硬件进行调试,最后联机调试。
第8周:
写毕业设计论文,完成全部毕业设计
5.小组成员分工:
梁慧萍负责日历时钟模块的设计和控制程序的编写
宋书倩负责液晶显示模块的设计
田萌萌负责按键模块的设计
指导教师签名:
日期:
2012年2月20日
备注:
(1)来源:
A—教师拟订;B—学生建议;C—企业和社会征集;D—实习单位提供
(2)类型:
X—真实课题;Y—模拟课题;Z—虚拟课题
中州大学信息工程学院毕业设计(论文)任务书
指导教师:
刘爱荣职称:
教授学生人数:
3人
学生姓名(学号、专业):
梁慧萍田萌萌宋书倩
毕业设计(论文)题目(来源、类型)
用DS1302与LCD1602设计的可调式电子日历时钟的设计与实现
毕业设计(论文)工作内容与基本要求(目标、任务、途径、方法、成果形式,应掌握的原始资料(数据)、参考资料(文献)以及设计技术要求、注意事项等)(纸张不够可加页)
基本要求:
(1)显示:
年、月、日、时、分、秒;
(2)具有年、月、日、时、分、秒的设置功能。
成果形式:
(主要包括毕业论文,系统设计技术文档,软件等):
设计功能演示;论文电子文档及程序提交光盘;按学院格式要求打印论文3份上交。
参考资料有:
单片机的C语言应用程序设计(马忠梅)新编单片机应用程序设计(张毅刚)单片机应用技术(王静霞)单片机接口技术(张道德)
完成时间:
2012.1.7~2012.4.14
教研室审批意见:
审批人签名:
摘要
随着现代科技的快速发展,时间的不断流逝,从观太阳、摆钟到现在的电子时钟,人类凭借非凡的智慧不断研究,又创造出新的纪录。
美国Dallas公司推出了一种具有涓细电流充电能能力的低功耗实时时钟时钟芯片DS1302。
它可以对年、月、日、星期、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。
对于可调电子日历采用直观的数字显示,可以同时显示年、月、日、星期、时、分、秒信息,还具有时间校准等功能。
该电路采用STC89C52单片机作为核心,功耗小,能在3V的低压工作,电压可选用3-5V电压供电。
用LCD1602液晶显示,较直观。
综上所述此可调电子日历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。
关键词
时钟电路;DS1302;LCD1602;单片机STC89C52
Abstract
Withtherapiddevelopmentofmodernscienceandtechnology,thepassageoftime,fromtheviewofthesun,thependulumclocksarenowelectronicclock,humanwithextraordinarywisdomcontinuouslyresearch,createanewrecord.TheDallascompanylaunchedahasJuanfinecurrentchargeabilityoftherealtimeclocklowpowerconsumptionDS1302chip.Itcanbetoyear,month,day,week,when,minutesandsecondsforthetime,alsohasaleapyearcompensationandotherfunctions,andtheDS1302longservicelifeandsmallerror.Foradjustableelectroniccalendarbyusingobjectdigitaldisplay,canalsoshowsthatyear,month,day,week,when,minutesandsecondsinformation,butalsohastimecalibrationetc.Function.ThiscircuitSTC89C52singlechipmicrocomputerasthecore,itspowerconsumptionissmall,canbein3Voflow-pressurework,voltagecanchoose3~5Vvoltagepowersupply.WithLCD1602liquidcrystaldisplay,moreintuitive.
Tosumuptheadjustableelectroniccalendarhasreadtheconvenient,directdisplay,functionaldiversity,simplecircuit,lowcost,andmanyotheradvantages,conformtothetrendofthedevelopmentofelectronicinstruments,andhasabroadmarketprospect.
KeyWords
TheclockDianZhong;DS1302;LCD1602;STC89C52singlechipmicrocomputer
第1章设计要求与方案论证
1.1设计要求:
1具有年、月、日、星期、时、分、秒等功能;
2具备年、月、日、星期、时、分、秒校准功能;
1.2系统基本方案选择和论证
1.2.1单片机芯片的选择方案和论证
方案一:
采用STC89C52芯片作为硬件核心,采用FlashROM,内部具有4KBROM存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。
方案二:
采用STC89C52,片内ROM全都采用FlashROM;能以3V的超底压工作;同时也与MCS-51系列单片机完全该芯片内部存储器为8KBROM存储空间,同样具有STC89C52的功能,且具有在线编程可擦除技术,对所下载的程序能够加密,比较安全。
当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏。
所以选择采用STC89C52作为主控制系统。
1.2.2显示模块选择方案和论证
方案一:
采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以不用此种作为显示。
方案二:
采用LED数码管动态扫描,虽然LED数码管价格适中,但要显示多个数字所需要的个数偏多,功耗较大,所以也不用此种作为显示。
方案三:
采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见,与普通数码管相比功耗较小,硬件连接简单。
所以显示部分采用1602液晶显示。
1.2.3时钟芯片的选择方案和论证
方案一:
直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。
采用此种方案虽然减少芯片的使用,节约成本,但是,实现的时间误差较大。
所以不采用此方案。
方案二:
采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、周、月、年一级闰年补偿的年进行计数,而且精度高,
RAM作为数据暂存区,工作电压2.5V~5.5V范围内,2.5V时耗电小于300nA.
1.3电路设计最终方案决定
综上各方案所述,对此次作品的方案选定:
采用STC89C52作为主控制系统;DS1302提供时钟;LCD1602液晶作为显示
第2章系统的硬件设计与实现
2.1电路设计框图
图1电路设计框图
2.2系统硬件概述
本电路是由STC89C52单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;时钟电路由DS1302提供,它是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.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时钟电路DS1302
1.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始终是输入端。
图3DS1302的引脚图
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:
图41602字符型液晶显示器实物图
2.1602LCD的基本参数及引脚功能
1602LCD分为背光和不带背光两种,基控制大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,引脚功能说明
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表1所示:
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
数据
2
VDD
电源正极
10
D3
数据
3
VL
液晶显示偏压
11
D4
数据
4
RS
数据/命令选择
12
D5
数据
5
R/W
读/写选择
13
D6
数据
6
E
使能信号
14
D7
数据
7
D0
数据
15
BLA
背光源正极
8
D1
数据
16
BLK
背光源负极
表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端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
D0~D7为8位双向数据线。
第15脚:
背光源正极。
第16脚:
背光源负极。
1602LCD的一般初始化(复位)过程
延时15mS
写指令38H(不检测忙信号)
延时5mS
写指令38H(不检测忙信号)
延时5mS
写指令38H(不检测忙信号)
以后每次写指令、读/写数据操作均需要检测忙信号
写指令38H:
显示模式设置
写指令08H:
显示关闭
写指令01H:
显示清屏
写指令06H:
显示光标移动设置
写指令0CH:
显示开及光标设置
3.LCD1602液晶显示如图5所示:
图5LCD液晶显示
2.3.4按键模块的设计
根据设计要求需要选择四个独立按键分别为选择、加、减、确定,
按键模块如图6所示:
图6按键模块设计
第3章系统的软件设计
3.1主程序流程图
图-A主程序流程图
主程序:
voidmain()
{
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时间调整程序流程图
voidSET_DS1302()
{
uchari;
Write_DS1302(0x8e,0x00);
for(i=0;i<7;i++)
{
Write_DS1302(0x80+2*i,(DateTime[i]/10<<4|(DateTime[i]%10)));
}
Write_DS1302(0x8e,0x80);
}
/*------------------------------------
读取当前时期时间
------------------------------------*/
voidGetTime()
{
uchari;
for(i=0;i<7;i++)
{
DateTime[i]=Read_Data(0x81+2*i);
}
}
/*------------------------------------
时间和日期转换成数字字符
------------------------------------*/
voidFormat_DateTime(uchard,uchar*a)
{
a[0]=d/10+'0';a[1]=d%10+'0';
}
/*------------------------------------
判断是否为闰年
------------------------------------*/
ucharisLeapYear(uinty)
{
return(y%4==0&&y%100!
=0)||(y%400==0);
}
/*------------------------------------
星期转换
------------------------------------*/
voidRefreshWeekDay()
{
uinti,d,w=5;
for(i=2000;i<2000+DateTime[6];i++)
{
d=isLeapYear(i)?
366:
365;
w=(w+d)%7;
}
d=0;
for(i=1;id+=DateTime[3];
DateTime[5]=(w+d)%7+1;
}
/*------------------------------------
年月日时分秒++/--
------------------------------------*/
voidDateTime_Adjust(charx)
{
switch(Adjust_Index)
{
case6:
//年
if(x==1&&DateTime[6]<99)DateTime[6]++;
if(x==-1&&DateTime[6]>0)DateTime[6]--;
MonthsDays[2]=isLeapYear(2000+DateTime[6])?
29:
28;
if(DateTime[3]>MonthsDays[DateTime[4]])
DateTime[3]=MonthsDays[DateTime[4]];
RefreshWeekDay();
break;
case4:
//月
if(x==1&&DateTime[4]<12)DateTime[4]++;
if(x==-1&&DateTime[4]>1)DateTime[4]--;
MonthsDays[2]=isLeapYear(2000+DateTime[6])?
29:
28;
if(DateTime[3]>MonthsDays[DateTime[4]])
DateTime[3]=MonthsDays[DateTime[4]];
RefreshWeekDay();
break;
case3:
//日
MonthsDays[2]=isLeapYear(2000+DateTime[6])?
29:
28;
if(x==1&&DateTime[3]if(x==-1&&DateTime[3]>0)DateTime[3]--;
RefreshWeekDay();
break;
case2:
//时
if(x==1&&DateTime[2]<23)DateTime[2]++;
if(x==-1&&DateTime[2]>0)DateTime[2]--;
break;
case1:
//秒
if(x==1&&DateTime[1]<59)DateTime[1]++;
if(x==-1&&DateTime[1]>0)DateTime[1]--;
break;
}
}
3.3液晶初始化子程序
/*************初始化*************/
voidT0_INT()interrupt1
{
TH0=-50000/256;
TL0=-50000%256;
if(++tCount!
=2)return;
tCount=0;
Format_DateTime(DateTime[6],LCD_DSY_BUFFER1+5);
Format_DateTime(DateTime[4],LCD_DSY_BUFFER1+8);
Format_DateTime(DateTime[3],LCD_DSY_BUFFER1+11);
strcpy(LCD_DSY_BUFFER1+13,WEEK[DateTime[5]-1]);
Format_DateTime(DateTime[2],LCD_DSY_BUFFER2+5);
Format_DateTime(DateTime[1],LCD_DSY_BUFFER2+8);
Format_DateTime(DateTim