基于单片机的万年历的设计(毕业论文)_第1页
基于单片机的万年历的设计(毕业论文)_第2页
基于单片机的万年历的设计(毕业论文)_第3页
基于单片机的万年历的设计(毕业论文)_第4页
基于单片机的万年历的设计(毕业论文)_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

万年历设计PAGE34PAGE1毕业论文(设计)论文题目:基于51单片机的万年历的设计摘要随着当今世界经济的快速发展和信息化时代的来临,各种各样的小型智能家电产品陆续出现在我们的生活中。日历是人们不可或缺的日常用品。但一般日历都为纸制用品,使用不便,寿命不长。本文借助电路仿真软件Protues对基于AT89S51单片机的电子万年历的设计方法及仿真进行了全面的阐述。该电子万年历在硬件方面主要采用AT89C51单片机作为主控核心,由DS1302时钟芯片提供时钟、1602LCM点阵液晶显示屏显示。时间、日期调整由三个按键来实现,并可对闹铃开关进行设置。日历能显示阳历和阴历年、月、日以及星期、时、分、秒。此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景关键词:单片机万年历可调DS130212864AbstractWiththerapiddevelopmentofworldeconomyandtheforthcomingofinformationera,manykindsofmini-typeintelligentdomesticelectricappliancesappearinourlifeoneafteranother.Calendarsarenecessarydailygoodsinpeople’slife.ThispapermainlydiscussthedesignandsimulationofelectroniccalenderbasedonAT89S51withthehelpofProtues.Onthehardwareside,theelectroniccalendarusingAT89C51microcontrollerasthemaincontrolcenter,clockprovidedbytheDS1302clockchip,1602LEDdotmatrixLCDdisplay.Timeanddateadjustingiscarriedoutbythreekeys,whichcanalsosetthealarmclock.Tosumupthecalendarhasreadconvenient,directdisplay,functionaldiversity,simplecircuit,lowcost,andmanyotheradvantages,conformtothetrendofthedevelopmentofelectronicinstruments,andhasabroadmarketprospect.Keywords:SCMperpetualcalendarDS130212864青海民族大学毕业论文PAGE33万年历设计2目录TOC\o"1-3"\h\u24582前言 1291091.方案设计 2240491.1系统基本方案选择和论证 2312481.1.1单片机芯片的选择 PAGEREF_Toc312482299921.1.2显示模块选择方案和论证 2326901.1.3时钟芯片选择方案与论证 2281781.2电路设计最终方案决定 3134882.系统的硬件设计与实现 4144732.1电路设计框图 4161442.2系统硬件概述 4270612.2.1AT89C52概述 445542.2.2DS1302概述 6146992.2.312684概述 7233193.系统的软件设计 89833.1程序流程框图 866543.2从1302读取日期和时间流程图 9146593.3时间调整程序流程图 10157384.系统测试 10136154.1硬件测试 104394.2软件测试 43911325385.结论 119260参考文献 1219121致谢 133493附录 14前言在日新月异的21世纪里,时间对现代人来说更加紧迫,从观太阳、摆钟到现在电子钟,时间的记录方式在不断的更新进步。然而,随着社会、科技的发展,集直观性,精度高,寿命长,功能全等为一体的记录方式更为人们所需求。在电子产业高速发展这一时代背景下,大规模集成电路大量出现,电子钟也因读取方便、显示直观、功能多样、电路简洁等诸多优点随之诞生,它的出现极大地影响了人们的生活,我们的时间记录更为全面和科学。因此,对万年历的研究与探索是具有相当重要的现实意义和实用价值。电子万年历属于小型智能电子产品,既可广泛应用于家庭,也可应用于银行、医院、学校等公共场所。它利用单片机进行控制,因为单片机具有高可靠性、高性价比、低电压、低功耗等一系列优点;利用DS1302实时时钟芯片进行记时,因为其具有高性能、低功耗、带RAM的实时时钟电路,可对年、月、日、周日、时、分、秒进行计时,同时具有闰年补偿功能等优点;利用12864液晶显示,因为其具有显示功能强大、价格便宜等特点,再外加一些基本系统即可实现时间的调整和显示。因此,电子万年历制作既有市场前景,又能培养单片机的运用能力,无论从实用价值,还是从培养能力的角度来看这都是很有意义的毕业设计课题。本万年历的设计要实现公历年、月、日,农历年、月、日,星期,时、分、秒,显示公历节日,农历节日,生日,时间段提醒以及节日、生日与时间段的交替显示,并在开机时设置显示作者的相关信息。最终在老师的指导和同学们的帮助下,经过自己的努力完成了这个课题,并从中提高了实践动手、团结合作和综合运用理论知识进行工程实践的能力。方案设计1.1系统基本方案选择和论证1.1.1单片机芯片的选择本设计采用AT89C52芯片作为硬件核心,该芯片内有4K字节的在线编程Flash存储器,可以擦写1000次,具有掉电模式,而且具有掉电状态下的中断恢复功能,对设计开发非常实用。1.1.2显示模块选择方案和论证方案一:采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以不用此种作为显示。方案二:LED数码管显示数码管具有低能耗、低损耗、低压、寿命长、耐老化、防晒、防潮、防火、防高(低)温,操作简单方案等优点。但由于数码管动态扫描需要借助74LS164移位寄存器进行移位,该芯片在电路调试时往往会有很多障碍,所以不采用LED数码管作为显示。方案三:LCD12864液晶显示此液晶具有轻薄短小、低耗电量、无辐射危险,平面直角显示以及影象稳定不闪烁等优势和可视面积大,画面效果好,分辨率高,抗干扰能力强等特点,并且能够方便的显示文字和数字。所以最终选择LCD12864。1.1.3时钟芯片选择方案与论证方案一:不使用芯片,采用单片机的定时计数器这种方法直接采用单片机定时计数器提供信号,模拟时钟的时,分,秒。如:利用AT80C52芯片,定时器用工作方式1,每50ms产生一个中断,循环20次,即1s周期。每一个周期加1,那么1min为60个周期,1h就是60*60=3600个周期。采用此种方案虽然可以减少时钟芯片的使用,节约成本,但实现的时间误差较大,所以不采用此方案。方案二:并行接口时钟芯片DS12887采用单片机应用系统并行总线(三总线)扩展的接口电路,采用这种接口电路具有操作速度快,编程方便的优点。但是对于80C52单片机来说,低位地址线要通过锁存器输出,还要地址译码器,而且并行口芯片的体积相对较大。方案三:串行接口时钟芯片DS1302采用DS1302时钟芯片实现时钟,DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用普通32.768kHz晶振。所以,最终选择串行时钟芯片DS1302。1.2电路设计最终方案决定综上各模块的选择方案与论证,确定最后的主要硬件资源如下:采用AT89C52作为主控制系统;DS1302提供时钟;12864液晶屏作为显示。2.系统的硬件设计与实现2.1电路设计框图单片机主控模块从DS1302时钟模块读取时间,通过片内芯片处理,将显示结果通过PO口床送至12684液晶显示模块显示出最终的界面;同时,单片机主控模块对键盘进行扫描,有按键按下时进入调整状态,并在12684液晶上显示状态。2.2系统硬件概述2.2.1AT89C52概述AT89C52功能特性概述:8K字节Flash闪速存储器,256字节内部RAM,32个I/O口线,3个16位定时器/计数器,一个6向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路;可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式;空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作;掉电方式保存RAM中的内容,但振荡器停止工作并禁止其他所有部件工作直到下一个硬件复位。AT89C52的引脚定义及功能:Vcc:接+5V电源Vss:接地XTAL1和XTAL2:时钟引脚,外接晶体引线端。当使用芯片内部时钟时,此两引脚端用于外接石英晶体和微调电容;当使用外部时钟时,用于接外部时钟脉冲信号。RST:复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。WDT溢出将使引脚输出高电平,设置SFRAUXR的DISRT0(地址8EH)可打开或关闭该功能。DISRT0位缺省为RESET输出高电平打开状态。ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存器允许)输出脉冲用于锁存地址的低8位字节。即使不访问外部存储器,ALE仍以时钟振荡频率的1/6输出固定的正脉冲信号,因此它可对外输出时钟或用于定时目的。PSEN:程序存储允许(PSEN)输出是外部程序存储器的读选通信号,当AT89C51由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。当访问外部数据存储器,没有两次有效的PSEN信号。EA/VPP:外部访问允许。欲使CPU仅访问外部程序存储器(地址为0000H—FFFFH),EA端必须保持低电平(接地)。需要注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。如EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。Flash存储器编程时,该引脚加上+12V的变成电压Vpp.POP1P2P3口:四个I/O口,其中P3口还具有第二功能:端口引脚第二功能端口引脚第二功能P3.0RXD(串行输入口)P3.4T0(定时/计数器0)P3.1TXD(串行输出口)P3.5T1(定时/计数器1)P3.2(外中断0)P3.6(外部数据存储器写通道)P3.3(外中断1)P3.7(外部数据存储器读通道)AT89C52管脚图及控制电路:2.2.2DS1302概述DS1302功能特性概述:提时钟计数功能,可以对秒、分钟、小时、日、月、年、星期的计数;年计数可达到2100年;有31*8位的额外数据暂存寄存器;采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据;内部有一个31×8的用于临时性存放数据的RAM寄存器;具有主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。AT89C52的引脚定义及功能:Vcc1:备用电源Vcc2:主电源X1和X2:振荡源,外接32.7、68KHz晶振I/O:串行数据输入端(双向)SCLK:输入端RST:复位端DS1302管脚图及控制电路:2.2.312684概述12684功能特性概述:显示内容128×64点;全屏点阵;2MROM总共提供8192个汉字(16×16点阵);16KROM总共提供128个字符(16×8点阵);工作温度:-20—70摄氏度,存储温度:-30—80摄氏度。引脚定义及功能:VSS:电源地VDD:电源正V0:液晶显示器驱动电器(可调)RS:RS=“H”,表示DB0—DB7为显示数据;RS=“L”,表示DB0—DB7为控制指R/W:R/W=“H”,E=“H”,数据被督导DB0—DB7;R/W=“1”,E=“H→L”,DB0—的数据被写到IR或DRDB1-7:数据线PSB:串并口选择NC:空脚RST:复位脚VOUT:倍压输出脚LEDA/K:背光电源,A正K负12864管脚图及控制电路系统的软件设计该系统的软件设计方法与硬件设计相对应,按整体功能分成多个不同的程序模块,分别进行设计、编程和调试,最后通过主程序将各程序模块连接起来。电子万年历的程序主要包括3个方面的内容:一是DS1302从单片机中读取数据进行计数,二是利用按键进行时间的调整,三是单片机中读取DS1302中的数据驱动LED12684显示时间。3.1程序流程框图主程序流程框图如下图所示,12864,DS1302的数据读取及指令写入函数均已在各自的头文件中完成,在主程序中只须引用即可。3.2从1302读取日期和时间流程图3.3时间调整程序流程图4.系统测试4.1硬件测试在Protues仿真结束后,于焊接板上完成了硬件组装。在调试硬件时遇到过很多问题,但只要细心、认真检查这些问题都是可以避免的,主要问题及解决办法现列如下:接通电源后LCD12864没有正确的显示。在不通电状态下用万用表检测电路是否正常连接,在检查回路时没有发现问题,怀疑是单片机驱动电路有问题,加载了所有端口的LED的驱动程序,所有端口都能正常工作,排除是单片机驱动电路有问题这一可能性;再次对电路进行检查发现排阻太小,换成10K的排阻后,LCD正常显示。电路工作一段时间之后有的芯片发热严重。经查发现原来是有尖锐的管脚刺破邻近的漆包线造成短路,断掉该线并再次连接可解决问题。接通后液晶正常显示了,但是在时间位置全部显示“?”号,初步判断是时间未正确读取,经过仔细用万用表检查,发现DS302接地端接触不良,解决后显示正常。4.2软件测试(1)程序烧入后,开机画面正常,可是一进入显示界面就有未知符号出现,后又恢复正常,且调时也没问题。初步判断与显示程序无关,经过反复调试,发现是开机画面结束后为对12864液晶进行初始化,最后修改后问题得以解决。(2)修改时间、日期时农历没有自动对应上。把不相关的程序暂时屏蔽,地农历的子程序独立调试,发现在调用农历自动更新时,对十进制和十六进制处理不好,所以会造成错乱。最后把相应的十进制进行修改,使得可以与十六进制对应,最后解决了此问题。5.结论通过对电子万年历的设计,从中不仅学习到了新知识,还丰富了许多的设计经验。例如进行程序编写时,由于思路的不清晰,导致程序问题不断出现,还不知从何而解,最后静下心来,仔细理了一下编程思路,再一步一步往下编写,遇到问题一个一个解决,这样既锻炼自己又节约了时间。经过这一个多月的努力,从开始准备资料到硬件电路的制作,再到毕业论文的完成,其中有问题不能得以解决的烦恼,也有收获新知的快乐。而且,经过这次设计真的理解了理论与实践的差别,没有扎实的理论,实践过程要走很多弯路,而实践中又会遇到很多理论上不曾提到过的问题。所有,我们要有脚踏实地,认真严谨,实事求是的学习态度,也要有不怕困难、坚持不懈、吃苦耐劳的精神去面对困难。参考文献杨子文.单片机原理及应用.西安:西安电子科技大学出版社,2006彭伟.单片机C语言程序设计实训100例.北京:电子工业出版社,2009阎石.数字电子技术基础.北京:高等教育出版社,2006陈正振.电子电路设计与制作.广西:广西交通职业技术学院信息工程系,2007胡汉才.单片机原理与接口技术.北京:清华大学出版社,2004何小艇.电子系统设计[M].杭州:浙江大学出版社,2007李光飞.单片机课程设计实例指导.北京:北京航空航天大学出版社,2004.马忠梅.单片机的C语言应用程序设计.北京:北京航空航天大学出版社,2003侯玉宝.基于proteus的51系列单片机设计与仿真.北京:电子工业出版社,2008郭荣生.电子技术实验与实践济南:中国石油大学出版社,2007王法能.单片机原理及应用.北京:科学出版社2004致谢我的大学生活将随着这个毕业论文而随之结束,在大学这四年的学习和生活中,我不仅学到了丰富的专业知识,还学会了怎么为人处世,怎么面对困难,怎么奋发向上,怎么学会关心别人。在学校期间,有太多的感动让我们怀念,有太多的人让我们难忘,有太多的笑声与快乐。总之,有太多太多值得怀念的东西,它将是我们一生宝贵的财富。在这个毕业设计阶段,我学习到了新知识,丰富了实践经验,还对我们这个专业的工艺流程有了更深刻的理解,对我们毕业后从事本专业工作打下了结实的基础。因为这个过程,我们就拥有了比别人更多的专业体验,在面试中我们就比别人多了一个砝码。在大学最后的这个阶段,经过一个月的努力终于完成了电子万年历设计,在此要感谢的人有很多,首先感谢学校提供的优越实验环境,使我能全身心的投入到我的设计中。感谢物理与电子工程学院,有大量量参考文献供我们查阅。感谢我的指导老师孙老师给我的仔细检查和改正。感谢同我一起探讨学习的同学们。还要感谢实验室老师的大力支持,当印制电路板生成后,借出各种调试工具,使系统在最短的时间里调试成功,使本系统能顺利实现。附录附录一元器件明细表:元件名称数量元件名称数量AT89C521个10K电阻1个DS13021个22UF电解电容1个LCD128641个30PF电容2个排阻(10K)1个12M晶振1个按钮5个32.768k晶振1个附录二仪器设备清单仪器名称数量仪器名称数量RF-2148USB智能编程器1个EDA实验箱1个附录三电路原理图附录四PCB图附录五实物图附录六程序清单#include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintucharsec,min,hour,day,month,year,week; bitw;ucharnext;voidDelayUs2x(unsignedchart){while(--t);}voidDelayMs(unsignedchart){while(t--){//大致延时1mSDelayUs2x(245); DelayUs2x(245);}}voiddelay(uintms)//延时子程序{uinta,b,c;//ms=1000为1.015sfor(a=2;a>0;a--)for(b=46;b>0;b--)for(c=ms;c>0;c--);}sbitRS=P2^4;sbitRW=P2^5;sbitE=P2^6;sbitRES=P2^1;sbitPSB=P2^0;sbitsclk=P1^0; //1302串行时钟sbitI_O=P1^1; //1302数据端口sbitrst=P1^2; //1302复位sbit k1=P3^4; //功能健sbit k2=P3^5; //时间加sbit k3=P3^6; //时间减sbit k4=P3^7; //确定键#defineDataPortP0//单片机P0<>液晶DB0-DB7ucharcodeDayCode1[9]={0x00,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};uintcodeDayCode2[3]={0x111,0x130,0x14e};ucharLunarMonth,LunarDay,LunarYear;bitc_moon;ucharcodeYearCode[300]={0x0C,0x96,0x45,//20002970x4d,0x4A,0xB8,//20013000x0d,0x4A,0x4C,//20023030x0d,0xA5,0x41,//20033060x25,0xAA,0xB6,//20043090x05,0x6A,0x49,//20053120x7A,0xAd,0xBd,//20063150x02,0x5d,0x52,//20073180x09,0x2d,0x47,//20083210x5C,0x95,0xBA,//20093240x0A,0x95,0x4e,//20103270x0B,0x4A,0x43,//20110x4B,0x55,0x37,//20120x0A,0xd5,0x4A,//20130x95,0x5A,0xBf,//20140x04,0xBA,0x53,//20150x0A,0x5B,0x48,//20160x65,0x2B,0xBC,//20170x05,0x2B,0x50,//20180x0A,0x93,0x45,//20190x47,0x4A,0xB9,//20200x06,0xAA,0x4C,//20210x0A,0xd5,0x41,//20220x24,0xdA,0xB6,//20230x04,0xB6,0x4A,//20240x69,0x57,0x3d,//20250x0A,0x4e,0x51,//20260x0d,0x26,0x46,//20270x5e,0x93,0x3A,//20280x0d,0x53,0x4d,//20290x05,0xAA,0x43,//20300x36,0xB5,0x37,//20310x09,0x6d,0x4B,//20320xB4,0xAe,0xBf,//20330x04,0xAd,0x53,//20340x0A,0x4d,0x48,//20350x6d,0x25,0xBC,//20360x0d,0x25,0x4f,//20370x0d,0x52,0x44,//20380x5d,0xAA,0x38,//20390x0B,0x5A,0x4C,//20400x05,0x6d,0x41,//20410x24,0xAd,0xB6,//20420x04,0x9B,0x4A,//20430x7A,0x4B,0xBe,//20440x0A,0x4B,0x51,//20450x0A,0xA5,0x46,//20460x5B,0x52,0xBA,//20470x06,0xd2,0x4e,//20480x0A,0xdA,0x42,//20490x35,0x5B,0x37,//20500x09,0x37,0x4B,//20510x84,0x97,0xC1,//20520x04,0x97,0x53,//20530x06,0x4B,0x48,//20540x66,0xA5,0x3C,//20550x0e,0xA5,0x4f,//20560x06,0xB2,0x44,//20570x4A,0xB6,0x38,//20580x0A,0xAe,0x4C,//20590x09,0x2e,0x42,//20600x3C,0x97,0x35,//20610x0C,0x96,0x49,//20620x7d,0x4A,0xBd,//20630x0d,0x4A,0x51,//20640x0d,0xA5,0x45,//20650x55,0xAA,0xBA,//20660x05,0x6A,0x4e,//20670x0A,0x6d,0x43,//20680x45,0x2e,0xB7,//20690x05,0x2d,0x4B,//20700x8A,0x95,0xBf,//20710x0A,0x95,0x53,//20720x0B,0x4A,0x47,//20730x6B,0x55,0x3B,//20740x0A,0xd5,0x4f,//20750x05,0x5A,0x45,//20760x4A,0x5d,0x38,//20770x0A,0x5B,0x4C,//20780x05,0x2B,0x42,//20790x3A,0x93,0xB6,//20800x06,0x93,0x49,//20810x77,0x29,0xBd,//20820x06,0xAA,0x51,//20830x0A,0xd5,0x46,//20840x54,0xdA,0xBA,//20850x04,0xB6,0x4e,//20860x0A,0x57,0x43,//20870x45,0x27,0x38,//20880x0d,0x26,0x4A,//20890x8e,0x93,0x3e,//20900x0d,0x52,0x52,//20910x0d,0xAA,0x47,//20920x66,0xB5,0x3B,//20930x05,0x6d,0x4f,//20940x04,0xAe,0x45,//20950x4A,0x4e,0xB9,//20960x0A,0x4d,0x4C,//20970x0d,0x15,0x41,//20980x2d,0x92,0xB5,//2099};/***复位1302***/voidreset1302(){ sclk=0; rst=0; rst=1; }/***向1302写入1字节***/voidwrieteByte1302(ucharadd){ uchari; for(i=0;i<8;i++) { I_O=0; if(add&0x01)I_O=1; sclk=0; sclk=1; add>>=1; }}voidwriteClkBye(ucharadd,ucharnum){ reset1302(); wrieteByte1302(add); wrieteByte1302(num);}/***1302初始化***/voidinit1302(){ reset1302(); writeClkBye(0x8e,0); //允许写入 reset1302(); writeClkBye(0x90,0xaa); //慢充电 reset1302(); writeClkBye(0x80,00); //秒初值 reset1302(); writeClkBye(0x82,0x12); //分 reset1302(); writeClkBye(0x84,0x12); // 时 reset1302(); writeClkBye(0x86,0x04); // 日 reset1302(); writeClkBye(0x88,0x03); // 月 reset1302(); writeClkBye(0x8a,0x07); // 星期 reset1302(); writeClkBye(0x8c,0x12); // 年 reset1302();}/***检测忙位***/voidCheck_Busy(){RS=0;RW=1;E=1;DataPort=0xff;while((DataPort&0x80)==0x80);//忙则等待E=0;}/***写命令***/voidWrite_Cmd(unsignedcharCmd){ Check_Busy(); RS=0; RW=0; E=1; DataPort=Cmd; DelayUs2x(5); E=0; DelayUs2x(5);}/****写数据***/voidWrite_Data(unsignedcharData){ Check_Busy(); RS=1; RW=0; E=1; DataPort=Data; DelayUs2x(5); E=0; DelayUs2x(5);}/****液晶屏初始化***/voidInit_ST7920(){DelayMs(40);//大于40MS的延时程序PSB=1;//设置为8BIT并口工作模式DelayMs(1);//延时RES=0;//复位DelayMs(1);//延时RES=1;//复位置高DelayMs(10);Write_Cmd(0x30);//选择基本指令集DelayUs2x(50);//延时大于100usWrite_Cmd(0x30);//选择8bit数据流DelayUs2x(20);//延时大于37usWrite_Cmd(0x0c);//开显示(无游标、不反白)DelayUs2x(50);//延时大于100usWrite_Cmd(0x01);//清除显示,并且设定地址指针为00HDelayMs(15);//延时大于10msWrite_Cmd(0x06);//指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位,光标从右向左加1位移动DelayUs2x(50);//延时大于100us}/****从1302读取***/ucharReadByte1302(){ uchari; ucharRByte; ucharTempByte; RByte=0x00; I_O=1; for(i=0;i<8;i++) { sclk=1; sclk=0; TempByte=(uchar)I_O; TempByte<<=7; RByte>>=1; RByte|=TempByte; } returnRByte;}ucharread1302(ucharadd){ ucharnum; reset1302(); wrieteByte1302(add); ReadByte1302(); num=ReadByte1302(); returnnum;}voidLCDTestWord(biti,ucharword){if(i==0){Write_Cmd(word); //i=0;则写入指令}else{Write_Data(word);//i=1;则写入数据}}/***向LCD发送一个字符串即写汉字***/voidLCDSendWord(uchar*p){while(*p>0){Write_Data(*p);p++;}}/***往LCD上填写年月日小时分钟秒星期以及它们的数据***/voidDisplayYear(){ year=read1302(0x8d);//从1302的0X8D处读出年数据 LCDTestWord(0,0x81);//写指令在第一行第二个字符位置显示年 LCDTestWord(1,(year/16)+0x30);//写数据 LCDTestWord(1,year%16+0x30);//写数据 LCDTestWord(0,0x82);//写指令第一行第三个字符位置 LCDSendWord("年");//显示年LCDDDRAM第一行地址为80-87, //第二行为90-97,第三行为88-8F,第四行为98-9F}voidDisplayMonth(){ month=read1302(0x89);//从1302中读取月份数据 LCDTestWord(0,0x83);//写命令 if(month/16!=0) { LCDTestWord(1,(month/16)+0x30);//写数据 } else { LCDTestWord(1,0x20);//写数据 } LCDTestWord(1,month%16+0x30);//写数据 LCDTestWord(0,0x84);//写指令 LCDSendWord("月");//显示月}voidDisplayDay(){ day=read1302(0x87);//从1302中读取日期数据 LCDTestWord(0,0x85); if(day/16!=0) { LCDTestWord(1,(day/16)+0x30); } else { LCDTestWord(1,0x20); } LCDTestWord(1,day%16+0x30); LCDTestWord(0,0x86); LCDSendWord("日");}voidDisplayWeek(){ week=(read1302(0x8b))%16; //从1302中读取星期数据 LCDTestWord(0,0x95); LCDSendWord("星期"); LCDTestWord(0,0x97); if(week==7){LCDSendWord("日");} if(week==6){LCDSendWord("六");} if(week==5){LCDSendWord("五");} if(week==4){LCDSendWord("四");} if(week==3){LCDSendWord("三");} if(week==2){LCDSendWord("二");} if(week==1){LCDSendWord("一");}//显示星期一到星期日}voidDisplayHour(){ hour=read1302(0x85); LCDTestWord(0,0x90); LCDTestWord(1,(hour/16)+0x30); LCDTestWord(1,hour%16+0x30);}voidDisplayMin(){ min=read1302(0x83); LCDTestWord(0,0x91); LCDTestWord(1,0x3a); //写入分割号: LCDTestWord(1,(min/16)+0x30); LCDTestWord(1,min%16+0x30); LCDTestWord(1,0x3a); //写入分割号:}voidDisplaySec(){ sec=read1302(0x81); LCDTestWord(0,0x93); LCDTestWord(1,(sec/16)+0x30); LCDTestWord(1,sec%16+0x30);}voidUpDate(){DisplayYear();//显示年DisplayMonth();//显示月DisplayDay();//显示日DisplayWeek();//显示星期DisplayHour();//显示时DisplayMin();//显示分DisplaySec();//显示秒 }voidSetTime(ucharcount){unsignedcharaddress,item;unsignedcharmax,mini;LCDTestWord(0,0x98);LCDSendWord("设置");if(count==5){LCDSendWord("秒钟");address=0x81;max=59;mini=0;}if(count==4){LCDSendWord("分钟");address=0x83;max=59;mini=0;}if(count==3){LCDSendWord("小时");address=0x85;max=23;mini=0;}if(count==6){LCDSendWord("星期");address=0x8b;max=7;mini=1;}if(count==2){LCDSendWord("日期");address=0x87;max=31;mini=1;}if(count==1){LCDSendWord("月份");address=0x89;max=12;mini=1;}if(count==0){LCDSendWord("年份");address=0x8d;max=99;mini=0;}item=read1302(address);//读取DS1302某地址上的数值赋给itemitem=(item/16)*10+item%16;if(k2==0)//加item++;//数加1if(k3==0)//-减item--;//数减1if(item>max)item=mini;//查看数值有效范围if(item<mini)item=max;writeClkBye(0x8e,0x00);item=(item/10)*16+item%10;writeClkBye(address-1,item);//将调整好的item值写入DS1302UpDate();} /*键盘扫描*/voidkeyscan(){if(k1==0)//设置时间{DelayMs(10);//按键消抖if(k1==0&&w==0)//当是正常状态时就进入调时状态{w=1;//进入调时SetTime(next);//调整}if(k1==0&&w==1)//当是调时状态本键用于调整下一项{next++;if(next>=7){next=0;}SetTime(next);//调整}while(k1==0);//等待键松开}if(k4==0)//当在调时状态时就退出调时{DelayMs(10);//按键消抖if(k4==0&&w==1){w=0;next=0; Write_Cmd(0x01);//清除LCD的显示内容}while(k4==0);//等待键松开}if(k2==0)//加调整{DelayMs(10);//按键消抖if(k2==0&&w==1){SetTime(next);//调整}while(k2==0);//等待键松开}if(k3==0)//减调整{DelayMs(10);//按键消抖if(k3==0&&w==1){SetTime(next);//调整}while(k3==0);//等待键松开}}/***开机画面***/voidwelcome(){LCDTestWord(0,0x81); LCDSendWord("万年历设计");LCDTestWord(0,0x91); LCDSendWord("指导:…");LCDTestWord(0,0x89); LCDSendWord("制作:…");LCDTestWord(0,0x99); LCDSendWord("阳光总在风雨后");}bitGetMoonDay(ucharLunarMonth,uintTableAddr){uchartemp;switch(LunarMonth)//LunarMonth指向农历月份 {case1: { temp=YearCode[TableAddr]&0x08;//1月,对应年份表里第一字节的BIT3位if(temp==0)return(0);//为0,月小 elsereturn(1);//为1,月大 }case2: { temp=YearCode[TableAddr]&0x04;//2月,对应年份表里第一字节的BIT2位 if(temp==0)return(0);//为0,月小 elsereturn(1);//为1,月大 }case3: { temp=YearCode[TableAddr]&0x02; //3月,对应第一字节的BIT1位 if(temp==0)return(0); //为0,月小 elsereturn(1); //为1,月大 }case4: { temp=YearCode[TableAddr]&0x01;//1月,对应第一字节的BIT0位 if(temp==0)return(0); //为0,月小 elsereturn(1); //为1,月大 }case5: { temp=YearCode[TableAddr+1]&0x80;//5月,对应第二字节的BIT7位 if(temp==0)return(0); //为0,月小 elsereturn(1); //为1,月大 }case6: { temp=YearCode[TableAddr+1]&0x40;//6月,对应第二字节的BIT6位 if(temp==0)return(0); //为0,月小 elsereturn(1); //为1,月大 }case7: { temp=YearCode[TableAddr+1]&0x20;//7月,对应第二字节的BIT5位 if(temp==0)return(0); //为0,月小 elsereturn(1); //为1,月大 }case8: { temp=YearCode[TableAddr+1]&0x10;//8月,对应第二字节的BIT4位 if(temp==0)return(0); //为0,月小 elsereturn(1); //为1,月大 }case9: { temp=YearCode[TableAddr+1]&0x08;//9月,对应第二字节的BIT3位 if(temp==0)return(0); //为0,月小 elsereturn(1); //为1,月大 }case10: { temp=YearCode[TableAddr+1]&0x04;//10月,对应第二字节的BIT2位 if(temp==0)return(0);//为0,月小 elsereturn(1); //为1,月大 }case11: { temp=YearCode[TableAddr+1]&0x02;//11月,对应第二字节的BIT1位 if(temp==0)return(0); //为0,月小 elsereturn(1); //为1,月大 }case12: { temp=YearCode[TableAddr+1]&0x01;//12月,对应第二字节的BIT0位 if(temp==0)return(0); //为0,月小 elsereturn(1); //为1,月大 }case13: { temp=YearCode[TableAddr+2]&0x80;//13月,对应第三字节的BIT7位 if(temp==0)return(0); //为0,月小 elsereturn(1); //为1,月大 }}}voidConversion(ucharyear,ucharmonth,ucharday){uchartemp1,temp2,temp3,MonthP;//temp3,temp4分别表示春节距元旦的天数uinttemp4,TableAddr; //公历日离元旦的天数bitflag2,flag_y;temp1=year/16; //BCD->hex先把数据转换为十六进制高位temp2=year%16; //低位year=temp1*10+temp2; //把年数据转换成16进制temp1=month/16; //月份高位temp2=month%16; //月份低位month=temp1*10+temp2; //把月数据转换成16进制temp1=day/16; //日期高位temp2=da

温馨提示

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

评论

0/150

提交评论