




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
15-目录摘要………………3关键词………………3一、设计任务与要求………………3二、方案设计与论证………………3方案一…………3方案二…………4方案三…………4硬件单元电路设计与参数计算………………51.主控制系统…………………52.时钟振荡电路………………53.复位电路……………………64.DS1302时钟电路…………75.按键电路……………………86.显示电路……………………87.蜂鸣器电路…………………9软件设计与流程图……………9五、总原电路及元器件清单……………………131.总原理图……………………132.PCB制板图…………………133.整体电路仿真图以及仿真结果分析……144.元件清单……………………14六、安装与调试…………………151.电路安装……………………152.电路调试……………………153.软件调试……………………16七、性能测试与分析……………16八、结论与心得…………………16九、参考文献……………………16十、程序清单…………………17摘要:随着社会的快速发展,时间的流逝,从观察太阳、摆钟到现在的单片机电子钟,人类不断研究,不断创造新纪录,单片机电子万年历已成为当今人类准确、快速获取时间信息的重要工具之一。本设计的电子万年历以AT89C52单片机为控制核心,采用Dallas公司的DS1302实时时钟构成时钟电路,能够实现时间和日期的显示,还增加了闹钟报时的功能。设计详细地分析设计原理和制作的全过程。关键词:单片机;实时时钟;DS1302;12864,wt588d语音模块;设计任务:设计一个具有多功能的电子万年历。二、基本要求:能够显示阳历年、月、日、星期、小时、分、秒。显示模块采用LCD液晶显示,要求能用按键调整时间。3、能显示阴历月、日,在显示阴历时间时能标明是否为闰年。具有定时报警功能,能够进行整点和半点的语音报时。具有闹钟设定的功能。发挥部分:掉电存储功能,可存储掉电前用户定时设置。具有日程管理,可以设定指定日期的日程,可以设置日成的提醒时间,并可用语音进行提示。可以保存30个日程设定,每个日程的提醒采用音乐提醒至少有5首歌曲进行选择播放,提示音乐具有重复播放的功能。三、方案设计与论证方案一:按照系统设计的功能的要求,初步确定系统由主控模块、时钟模块、显示模块、语音模块各键盘接口模块共5个模块组成,电路系统构成框图如图1所示。主控芯片使用52系列AT89C52单片机,时钟芯片使用美国DALLAS公司推出的一款高性能、低功耗、带RAM的实时时钟DS1302。采用DS1302作为计时芯片,可以做到计时准确。更重要的是,DS1302可以在很小电流的后备电源(2.5V--5.5V电源,在2。5V时耗电小于300nA)下继续计时,而且DS1302可以编程选择多种充电电流来对后备电源进行慢速充电,可以保证后备电源基本功不耗电。显示模块采用普通的共阳LED数码管,键输入采用查询法实现功能调整。语音模块语音模块主控模块AT89C52键盘扫描电路路LED显示电路时钟电路(DS1302)图1电子万年历电路系统构成框图方案二:按照系统设计的要求和功能,将系统分为主控模块、时钟电路模块、按键扫描模块,LCD显示模块,语音模块,电源电路、复位电路、晶振电路几个模块,系统框图如图2所示。主控模块采用AT89C52单片机,按键模块用四个按键,用于调整时间和设定闹钟,显示模块采用LCD12864,时钟电路模块采用DS1302实时时钟实现对时间,日期的操作。主控模块主控模块AT89C52复位电路晶振电路按键扫描模块LCD12864显示模块时钟电路(DS1302)语音模块wt588d语音模块wt588d图2基于AT89C52单片机的电子万年历系统框图方案三:按照系统设计的要求和功能,将系统分为主控制器模块、显示模块、按键开关模块、蜂鸣器电路模块。系统框图如图3所示,主控制模块采用AT89C52单片机为控制中心,显示模块采用液晶LCD12864显示,计时使用AT89C52单片机自带的定时器功能,实现对时间、日期的操作,通过按键盘开关实现对时间、日期的调整。单片机单片机AT89C52复位电路晶振电路按键电路LCD1602显示模块蜂鸣器电路语音模块语音模块图3基于AT89C52单片机的电子万年历总体设计框图方案论证:上面提到的三个方案中,在电路原理方面大致相同,都能够达到设计任务与要求,在方案一款方案二中使用外部的时钟芯片DS1302来实现日期和时间的操作,方案三中则利用了单片机自身的定时器功能;在方案二和方案三在显示模块上都使用液晶显示屏LCD12864作为显示,方案一则使用LED数码管作为显示,采用LED数码管动态扫描,数码管的价格适中,对于显示数字较好,而且使用单片机的端口也较少;采用LCD12864液晶显示屏,液晶显示屏的显示功能强大,可以显示大量文字、图形,显示多样性,清晰可见,价格相对LED数码管来说要昂贵些,但是基于本设计显示的东西较多,若采用LED数码管的话,所需数码管较多,价格也相应的会提高,而且不利于控制,对于LCD12864,随着现在制造的发展,价格也在下降,同时它所使用的端口也不很多,能够清晰的显示,比较适合显示大量的数字,但LCD12864显示模块的屏幕面积相对于12864要小,不足以显示所有内容,故选择DS12864作为显示模块。DS1302是一款高性能的实时时钟芯片,以计时准确、接口简单、使用方便、工作电压范围宽和低功耗等优点,得到广泛的应用,同时可以对秒、时、分、日、月、年以及润年补偿的年进行计数,而且在掉电时能够在外部纽扣电池的供电下继续工作,不会因为掉电后,其时间就要重新设置,方案三中使用定时器的功能,当在掉电的时候就会使时间和日期回到原来设定的初始值,同时直接采用单片机定时计数提供秒信号,使用程序实现年时间和日期,采用此种方案,节约成本,但是实现的时间误差较大,所以不采用这种方案。通过对上述方案的论证分析,本次设计选择方案二,采用AT89C52作为主控制系统,DS1302提供时钟,LCD12864液晶作为显示模块四、硬件单元电路设计与参数计算主控制系统单片机中央处理系统的方案设计,我们选用具有ATMEL公司的AT89C52单片机作为中央处理器,如图4所示。该单片机除了拥有MCS-51系列单片机的所有优点外,内部还具有8K的在系统可编程FLASH存储器,低功耗的空闲和掉电模式,极大的降低了电路的功耗,还包含了定时器、程序存储器、数据存储器等硬件,其硬件能符合整个控制系统的要求,不需要外接其他存储器芯片和定时器件,方便地构成一个最小系统。整个系统结构紧凑,抗干扰能力强,性价比高。是比较合适的方案。图4AT89C52主控制系统2、时钟振荡电路时钟振荡电路图5所示,时钟振荡电路用于产生单片机正常工作时所需要的时钟信号,电路由两个30pF的瓷片电容和一个12MHz的晶振组成,并接入到单片机的XTAL1和XTAL2引脚处,使单片机工作于内部振荡模式。此电路在加电后延迟大约10ms振荡器起振,在XTAL2引脚产生幅度为3V左右的正弦波时钟信号,其振荡频率主要由石英晶振的频率决定。电路中两个电容C1、C2的作用使电路快速起振,提高电路的运行速度,对于AT89C52其工作频率为0至33MHz,在这个范围内单片机能够正常的工作。图5AT89C52时钟振荡电路3、复位电路复位电路由电阻和极性电容组成,如图6所示,通过高电平使单片机复位,在时钟电路开始工作后,当高电平的时间超过大约2us时,即可实现复位。此复位电路同时具备了上电复位和手动复位的功能,上电复位发生在开机加电时,由系统自动完成,手动复位通过一个按键来实现,在程序运行时,若遇到死机,死循环或程序“跑飞”等情况,通过手动复位就可以实现重新启动的操作。手动按钮复位需要人为在复位输入端RST上加入高电平。一般采用的办法是在RST端和正电源Vcc之间接一个按钮和一个电阻,如图所示,当人为按下按钮时,则Vcc的+5V电平就会直接加到RST端,由于人的动作再快也会使按钮保持接通达数十毫秒,所以,完全能够满足复位的时间要求。上电复位的工作过程是在加电时,复位电路通过电容加给RST端一个短暂的高电平信号,此高电平信号随着Vcc对电容的充电过程而逐渐回落,即RST端的高电平持续时间取决于电容的充电时间,由图可知充电时间为:T=2.3RC=2.3*10*10-6*5.1*103=0.1173s,保证系统能够可靠地复位。图6AT89C52复位电路4、DS1302时钟电路时钟电路主要由时钟芯片DS1302、备用电池、晶振等几部分组成,如图7所示。DS1302采用3线串行接口,占用引脚少,内部集成了可编程日历时钟,用户可以根据需要通过单片机的控制来自行设置,支持双电源供电,可以使用外部主电源和备用电源,备份电源能够使时钟芯片继续工作。图7DS1302时钟电路5、按键电路按键电路由四个轻触开关组成,如图8所示。按键用来调整时间和设定闹钟,其一端直接接到单片机的端口,另一端接地,当按下按键时,相应的端口变为低电平,通过检测这一低电平就可以判断是哪个键按下,从而作相应的操作。图8按键电路6、蜂鸣器电路蜂鸣器电路由一个220欧的电阻,三极管8550,及蜂鸣器组成,如图10所示。通过控制三极管的导通和截止来实现蜂鸣器的响与不响。图10蜂鸣器电路7.wt588模块按键控制模式触发方式灵活,可随意设置任意按键为脉冲可重复触发、脉冲不可重复触发、无效按键、电平保持不可循环、电平保持可循环、电平非保持可循环、上一曲不循环、下一曲不循环、上一曲可循环、下一曲可循环、音量+、音量-、播放/暂停、停止、播放/停止等15种触发方式;一线串口控制模式及三线串口控制模式可通过MCU发码端控制语音播放、停止、循环播放和音量大小,或者直接触发0~219地址位的任意语音。管脚图及描述:封装引脚引脚标号简述功能描述1NCNC空2NCNC空3NCNC空4NCNC空5NCNC空6NCNC空7RESETRESET复位脚8DACDACDAC音频输出脚,需外接功放才能驱动扬声器9PWM+PWM+PWM+音频输出脚,跟PWM-组合可直接驱动扬声器10PWM-PWM-PWM-音频输出脚,跟PWM+组合可直接驱动扬声器11P14SPI-FLASH_DI烧写程序数据输入脚(利用外部下载器下载时用到)8.AT24C02AT24C02是一个2K位串行CMOSE2PROM,内部含有256个8位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗。AT24C02有一个16字节页写缓冲器。该器件通过IIC总线接口进行操作,有一个专门的写保护功能。管脚图:引脚图:管脚名称
功能
A0、A1、A2
器件地址选择
SDA
串行数据、地址
SCL
串行时钟
WP
写保护
VCC
+1.8V~6.0V
工作电压
VSS
地
功能:AT24C02支持I2C,总线数据传送协议I2C,总线协议规定任何将数据传送到总线的器件作为发送器。任何从总线接收数据的器件为接收器。数据传送是由产生串行时钟和所有起始停止信号的主器件控制的。主器件和从器件都可以作为发送器或接收器,但由主器件控制传送数据(发送或接收)的模式,由于A0、A1和A2可以组成000~111八种情况,即通过器件地址输入端A0、A1和A2可以实现将最多8个AT24C02器件连接到总线上,通过进行不同的配置进行选择器件。五、软件设计与流程图1、程序流程图主程序首先初始化定时器、LCD12864及DS1302,然后就开始查询按键,有键按下则开始调整时间和设置闹钟,若没有按下,则执行下面的时间、日期及闹钟时间的显示,最后依次循环这些相同的操作,相应流程图如图11所示:开始开始初始化按键是否按下显示时间、日期及闹钟时间时间、日期、闹钟设定结束是否图11程序主流程图按键的检测主要是通过查询的办法来实现,利用按键进行间调整及闹钟设置,首先检测K1键是否按下,当K1键按下时,并且K2键按下时,则设置初始的默认时间;当K1按下,并且K4按下时,则是开启闹钟功能;若只是K3按下则开始设置时间及日期,同时被选择的时间和日期开始闪烁,第一次按下K3时,设置年份,若按下K1,则是减1操作,按下K2是加1操作,设置好年后,第二次按下K3时,则是设置月份,按K1减,按K2则加1,依次循环下去,则可以将时间和日期设置完毕;而当按下K4时,则是设置闹钟时间,第一次按下K4,设置时,按K1时减1,按K2时加1,第二次按下时,设置分,同样的操作,按K1分减1,按K2分加1,程序流程图12所示:图12时间调整及闹钟设置程序流程图六、总原电路及元器件清单1、总原理图基于AT89C52单片机的电子万年历硬件电路图如图13所示,系统由AT89S52单片机,按键扫描电路、显示电路、时钟电路、晶振电路、复位电路、电源指示电路及蜂鸣器输出电路。图13基于AT89C52的电子万年历电路原理图4、元件清单基于AT89C52单片机的电子万年历元件清单如表1所示。表1基于AT89C52单片机的电子万年历元件清单元件名称型号数量/个用途单片机AT89C521控制核心时钟芯片DS13021实时时钟晶振12MHz1晶振电路晶振32.768kHz1时钟电路电容30pF2晶振电路电解电容10uF/25V1复位电路按键开关6*6*65按键/复位电路电阻1K1电源指示电路电阻5.1K1复位电路电阻2202限流/复位电路滑动变阻器1M1LCD12864背光调节三极管S85501蜂鸣器电路发光二极管红色1电源指示电路蜂鸣器有源蜂鸣器1蜂鸣器电路纽扣电池CR2025/3V1时钟电路纽扣电池座CR20251时钟电路排座间距2.54mm16显示电路LCDLCD128641显示电路排针间距2.54mm2电源接口独石电容1041电源接口电源Vcc+5V1提供+5V电源七、安装与调试1、电路安装用Proteus画好电路图后,然后将各元件焊在电路板上,依照高矮,将剩余的元件安装在电路板上,并依次焊接好.当焊接完成后.剪去引脚,并测试电路焊接后是否有短路.2、电路调试在测试中遇到LCD12864不能够显示出时间和日期,经过检查才发现是LCD12864的背光没有调好,通过调节接在LCD12864上3脚上的滑动变阻器,改变所给的电压,可以清晰地看见了LCD能够显示。对于DS12864在测试过程中发其上电不久就发热,在检查电路过程中,不是因为发现芯片短路,最终检查发现原来是DS12864的引脚接法不正确,给+5V的应该是芯片的脚,给后备电池的是1脚,当换过来之后,芯片就不发热了,而且可以正常显示出我们要显示的时间和日期。3、软件调试在软件调试过程中,当按下按键调节时间和日期后,时间不能继续在加,后来分析了程序才发现,是在设置好时间和日期时我们暂停了时钟,在设置完后没有启动时钟,所以时间和日期就不能够继续走,在那里停止了,发现这个原因后,我在设置完时间后就开启时钟,时间和日期就能够正确显示了。八、性能测试与分析上电测试,LCD12864能够正确显示时间和日期,第一次K3按钮,开始设置年,再按K1,年减1,按K2,年加1,按二次K3,设置月,按K1,月减1,按K2,月加1,按三次K3,设置日,按K1,日减1,按K2,日加1,按四次K3,设置时,按K1,时减1,按K2,时加1,按五次K3,设置分,按K1,分减1,按K2,分加1,按第五次,设置时间完成。闹钟设置,按下K4,开始设置闹钟,按第一次,设置分,按K1,时减1,按K2,时加1,按第二次设置分,按K1,分减1,按K2,分加1,设置好闹钟后,按组合键K1+K4开启闹钟功能,当到闹钟时间后,蜂鸣器响,闹钟时间为1分钟,在对电路测试后,电路达到了所需的功能。通过对电路的多次的反复测试与分析,可以对电路的原理及功能更加熟悉,同时提高了设计能力及对电路的分析能力,同时在软件的编程方面得到了更高的提高,对编程能力得到加强,同时对所学的知识得到了大的提高与巩固。九、结论与心得在这学期的课程序设计中,在收获知识的同时,还收获了阅历,收获了成熟,在此过程中,我们通过查找大量资料,请教学长,以及不懈的努力,不仅培养了独立思考、动手制作的能力,在各种其它能力上也都有了提高。更重要的是,在程序设计里,我们学会了很多学习的方法。而这是以后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。同时在与老师和同学的交流过程中,互动学习,将知识融会贯通,提高自己与人交流的能力,提高自己的团队意思。老师给我们提出了许多革新非常的好,让我们能够有更多的发挥空间,提高了自己开发创新的能力。十、程序清单程序清单如下:#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintvoidConversion(bit,unsignedchar,unsignedchar,unsignedchar);uchartt=1;bitc_moon;bitcenbit=1;bitw;sbitrs=P1^4;sbitrw=P1^5;sbite=P1^6;sbitpsb=P1^7;sbitbusy=P0^7;//lcdbusybitsbitDS1302_CLK=P2^0;sbitDS1302_IO=P2^1;sbitDS1302_RST=P2^2;sbitscl=P3^0;sbitsda=P3^1;//实时时钟复位线引脚bitc_moon;sbitspeak=P3^7;//bitcenbit=1;sbitSetKey=P1^0;//按键功能:设置sbitSureKey=P1^1;//按键功能:确认sbitPlusKey=P1^2;//按键功能:加sbitReduceKey=P1^3;//按键功能:减unsignedcharsec,min,hour,day,month,year,cen,week,next,aa,bb,cc,dd,mm,nn,yy,rr,ss,ff,tt,qq,temp0,LunarMonth,LunarDay,LunarYear;inttemp;ucharTempBuffer[8],week_value[3];ucharhide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year;//秒,分,时到日,月,年位闪的计数voidDisplayLunarYearD();voiddelay_50us(uintt){ucharj;for(;t>0;t--)for(j=12;j>0;j--);}voiddelay_50ms(uintt){uintj;for(;t>0;t--)for(j=5500;j>0;j--);}voidstart(){sda=1;scl=1;delay_50us(1);sda=0;delay_50us(2);}voidstop(){sda=0;scl=1;delay_50us(1);sda=1;delay_50us(2);}voidresponse(){uchari;while((sda==1)&&i<255)i++;//给应答信号sda=0;错误(while((sda==0)|i<255)i++;)程序进入while死循环scl=1;delay_50us(1);scl=0;//没有这一步出错,如果没有sda将保持0状态,一直处于应答中。程序停止。delay_50us(1);}voidwrite24c02(uchardate){uchartemp,i;temp=date;for(i=0;i<8;i++){scl=0;sda=temp&0x80;delay_50us(1);scl=1;delay_50us(1);temp=temp<<1;}scl=0;delay_50us(1);sda=1;delay_50us(1);}ucharread24c02(){uchark,i;scl=0;delay_50us(1);sda=1;//仅仅是释放数据线,可有可无for(i=0;i<8;i++){scl=1;delay_50us(1);k=k<<1;if(sda)k++;scl=0;delay_50us(2);}returnk;}voidwrite_24c02add(ucharaddress,uchardate){start();write24c02(0xa0);response();write24c02(address);response();write24c02(date);response();stop();}ucharread_24c02add(ucharaddress){uchara;start();write24c02(0xa0);response();write24c02(address);response();start();write24c02(0xa1);response();a=read24c02();stop();returna;}voidWriteDs1302Byte(unsignedchartemp){unsignedchari;for(i=8;i>0;i--){DS1302_IO=temp&0x01;DS1302_CLK=0;DS1302_CLK=1;temp>>=1;}}voidWriteDs1302(unsignedcharaddress,unsignedchardat){DS1302_RST=0;DS1302_CLK=0;DS1302_RST=1;delay_50us(1);WriteDs1302Byte(address);WriteDs1302Byte(dat);DS1302_RST=0;}unsignedcharread_byte(){uchari;for(i=8;i>0;i--){if(DS1302_IO)temp0=temp0|0x80;DS1302_CLK=1;DS1302_CLK=0;temp0=temp0>>1;}returntemp0;}unsignedcharReadDs1302(unsignedcharaddress){unsignedchartemp;DS1302_RST=0;DS1302_CLK=0;DS1302_RST=1;WriteDs1302Byte(address);temp=read_byte();DS1302_RST=0;DS1302_CLK=1;returntemp;}voidInitDS1302(){unsignedcharSecond;Second=ReadDs1302(0x80);if(Second&0x80){WriteDs1302(0x8e,0x00);delay_50us(5);WriteDs1302(0x8c,0x10);//写入年份10年delay_50us(5);WriteDs1302(0x8a,0x06);//写入星期6delay_50us(5);WriteDs1302(0x88,0x11);//定入月分11月delay_50us(5);WriteDs1302(0x86,0x6);//写入日期6日delay_50us(5);WriteDs1302(0x84,0x17);//写入小时17点delay_50us(5);WriteDs1302(0x82,0x43);delay_50us(5);WriteDs1302(0x80,0x00);//写入秒30秒delay_50us(5);WriteDs1302(0x8e,0x80);//控制命令,WP为1,禁止写操作}}codeunsignedcharYearCode[597]={0x04,0xAe,0x53,//190100x0A,0x57,0x48,//190230x55,0x26,0xBd,//190360x0d,0x26,0x50,//190490x0d,0x95,0x44,//1905120x46,0xAA,0xB9,//1906150x05,0x6A,0x4d,//1907180x09,0xAd,0x42,//1908210x24,0xAe,0xB6,//19090x04,0xAe,0x4A,//19100x6A,0x4d,0xBe,//19110x0A,0x4d,0x52,//19120x0d,0x25,0x46,//19130x5d,0x52,0xBA,//19140x0B,0x54,0x4e,//19150x0d,0x6A,0x43,//19160x29,0x6d,0x37,//19170x09,0x5B,0x4B,//19180x74,0x9B,0xC1,//19190x04,0x97,0x54,//19200x0A,0x4B,0x48,//19210x5B,0x25,0xBC,//19220x06,0xA5,0x50,//19230x06,0xd4,0x45,//19240x4A,0xdA,0xB8,//19250x02,0xB6,0x4d,//19260x09,0x57,0x42,//19270x24,0x97,0xB7,//19280x04,0x97,0x4A,//19290x66,0x4B,0x3e,//19300x0d,0x4A,0x51,//19310x0e,0xA5,0x46,//19320x56,0xd4,0xBA,//19330x05,0xAd,0x4e,//19340x02,0xB6,0x44,//19350x39,0x37,0x38,//19360x09,0x2e,0x4B,//19370x7C,0x96,0xBf,//19380x0C,0x95,0x53,//19390x0d,0x4A,0x48,//19400x6d,0xA5,0x3B,//19410x0B,0x55,0x4f,//19420x05,0x6A,0x45,//19430x4A,0xAd,0xB9,//19440x02,0x5d,0x4d,//19450x09,0x2d,0x42,//19460x2C,0x95,0xB6,//19470x0A,0x95,0x4A,//19480x7B,0x4A,0xBd,//19490x06,0xCA,0x51,//19500x0B,0x55,0x46,//19510x55,0x5A,0xBB,//19520x04,0xdA,0x4e,//19530x0A,0x5B,0x43,//19540x35,0x2B,0xB8,//19550x05,0x2B,0x4C,//19560x8A,0x95,0x3f,//19570x0e,0x95,0x52,//19580x06,0xAA,0x48,//19590x7A,0xd5,0x3C,//19600x0A,0xB5,0x4f,//19610x04,0xB6,0x45,//19620x4A,0x57,0x39,//19630x0A,0x57,0x4d,//19640x05,0x26,0x42,//19650x3e,0x93,0x35,//19660x0d,0x95,0x49,//19670x75,0xAA,0xBe,//19680x05,0x6A,0x51,//19690x09,0x6d,0x46,//19700x54,0xAe,0xBB,//19710x04,0xAd,0x4f,//19720x0A,0x4d,0x43,//19730x4d,0x26,0xB7,//19740x0d,0x25,0x4B,//19750x8d,0x52,0xBf,//19760x0B,0x54,0x52,//19770x0B,0x6A,0x47,//19780x69,0x6d,0x3C,//19790x09,0x5B,0x50,//19800x04,0x9B,0x45,//19810x4A,0x4B,0xB9,//19820x0A,0x4B,0x4d,//19830xAB,0x25,0xC2,//19840x06,0xA5,0x54,//19850x06,0xd4,0x49,//19860x6A,0xdA,0x3d,//19870x0A,0xB6,0x51,//19880x09,0x37,0x46,//19890x54,0x97,0xBB,//19900x04,0x97,0x4f,//19910x06,0x4B,0x44,//19920x36,0xA5,0x37,//19930x0e,0xA5,0x4A,//19940x86,0xB2,0xBf,//19950x05,0xAC,0x53,//19960x0A,0xB6,0x47,//19970x59,0x36,0xBC,//19980x09,0x2e,0x50,//19992940x0C,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};voidWriteCommandLCD(ucharudat){rs=0;rw=0;delay_50us(1);P0=udat;e=1;delay_50us(5);e=0;delay_50us(1);}voidWriteDataLCD(uchardat){rs=1;rw=0;delay_50us(1);P0=dat;e=1;delay_50us(5);e=0;delay_50us(1);}voidLCDInit(void){delay_50ms(3);WriteCommandLCD(0x30);delay_50us(2);WriteCommandLCD(0x30);delay_50us(3);WriteCommandLCD(0x0f);delay_50us(2);WriteCommandLCD(0x01);delay_50us(180);WriteCommandLCD(0x06);delay_50us(10);}voidLCDSendWord(unsignedchar*p){while(*p>0){WriteDataLCD(*p);p++;}}voidLCDTestWord(biti,unsignedcharword){if(i==0){WriteCommandLCD(word);}else{WriteDataLCD(word);}}voidDisplayYear(void){year=ReadDs1302(0x8d);LCDTestWord(0,0x81);LCDTestWord(1,(year/16)+0x30);LCDTestWord(1,year%16+0x30);LCDTestWord(0,0x82);LCDSendWord("年");DisplayLunarYearD();}voidDisplayMonth(void){month=ReadDs1302(0x89);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("月");DisplayLunarYearD();}voidDisplayWeek(void){week=ReadDs1302(0x8b);LCDTestWord(0,0x90);LCDSendWord("星期");LCDTestWord(0,0x92);//LCDTestWord(1,week+0x30);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("一");}}voidDisplayDay(void){day=ReadDs1302(0x87);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("日");DisplayLunarYearD();}voidDisplayHour(void){hour=ReadDs1302(0x85);LCDTestWord(0,0x88);LCDTestWord(1,(hour/16)+0x30);LCDTestWord(1,hour%16+0x30);}voidDisplayMin(void){min=ReadDs1302(0x83);LCDTestWord(0,0x89);//LCDTestWord(1,0x3a);LCDSendWord("点");LCDTestWord(1,(min/16)+0x30);LCDTestWord(1,min%16+0x30);LCDSendWord("分");}voidDisplaySec(void){unsignedchari=0;unsignedinta=0,b=0,c=0;sec=ReadDs1302(0x81);LCDTestWord(0,0x8c);LCDTestWord(1,(sec/16)+0x30);LCDTestWord(1,sec%16+0x30);}codeunsignedcharDayCode1[9]={0x00,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};codeunsignedintDayCode2[3]={0x111,0x130,0x14e};//计算公历日离当年元旦的天数,为了减少运算,用了两个表DayCode1[9],DayCode2[3]//如果公历月在九月或前,天数会少于0xff,用表DayCode1[9],在九月后,天数大于0xff,用表DayCode2[3]//如输入公历日为8月10日,则公历日离元旦天数为DayCode1[8-1]+10-1,如输入公历日为11月10日,则公历日离元旦天数为DayCode2[11-10]+10-1/*读取数据表中农历月的大月或小月,如果该月为大返回1,为小返回0*/bitGetMoonDay(unsignedcharLunarMonth,unsignedintTableAddr){unsignedchartemp;switch(LunarMonth)//LunarMonth指向农历月份{case1:{temp=YearCode[TableAddr]&0x08;//1月,对应年份表里第一字节的BIT3位,如果是1,则月大,如果是0,则月小if(temp==0)return(0);//为0,月小elsereturn(1);//为1,月大}case2:{temp=YearCode[TableAddr]&0x04;//2月,对应年份表里第一字节的BIT2位,如果是1,则月大,如果是0,则月小if(temp==0)return(0);//为0,月小elsereturn(1);//为1,月大}case3:{temp=YearCode[TableAddr]&0x02;//3月,对应第一字节的BIT1位,如果是1,则月大,如果是0,则月小if(temp==0)return(0);//为0,月小elsereturn(1);//为1,月大}case4:{temp=YearCode[TableAddr]&0x01;//1月,对应第一字节的BIT0位,如果是1,则月大,如果是0,则月小if(temp==0)return(0);elsereturn(1);}case5:{temp=YearCode[TableAddr+1]&0x80;//5月,对应第二字节的BIT7位,如果是1,则月大,如果是0,则月小if(temp==0)return(0);elsereturn(1);}case6:{temp=YearCode[TableAddr+1]&0x40;//6月,对应第二字节的BIT6位,如果是1,则月大,如果是0,则月小if(temp==0)return(0);elsereturn(1);}case7:{temp=YearCode[TableAddr+1]&0x20;//7月,对应第二字节的BIT5位,如果是1,则月大,如果是0,则月小if(temp==0)return(0);elsereturn(1);}case8:{temp=YearCode[TableAddr+1]&0x10;//8月,对应第二字节的BIT4位,如果是1,则月大,如果是0,则月小if(temp==0)return(0);elsereturn(1);}case9:{temp=YearCode[TableAddr+1]&0x08;//9月,对应第二字节的BIT3位,如果是1,则月大,如果是0,则月小if(temp==0)return(0);elsereturn(1);}case10:{temp=YearCode[TableAddr+1]&0x04;//10月,对应第二字节的BIT2位,如果是1,则月大,如果是0,则月小if(temp==0)return(0);elsereturn(1);}case11:{temp=YearCode[TableAddr+1]&0x02;//11月,对应第二字节的BIT1位,如果是1,则月大,如果是0,则月小if(temp==0)return(0);elsereturn(1);}case12:{temp=YearCode[TableAddr+1]&0x01;//12月,对应第二字节的BIT0位,如果是1,则月大,如果是0,则月小if(temp==0)return(0);elsereturn(1);}case13:{temp=YearCode[TableAddr+2]&0x80;//13月,对应第三字节的BIT7位,如果是1,则月大,如果是0,则月小if(temp==0)return(0);elsereturn(1);}}}voidConversion(bitcenbit,unsignedcharyear,unsignedcharmonth,unsignedcharday){unsignedchartemp1,temp2,temp3,MonthP;//temp3,temp4分别表示春节距元旦的天数,公历日离元旦的天数unsignedinttemp4,TableAddr;bitflag2,flag_y;temp1=year/16;//BCD->hex先把数据转换为十六进制高位temp2=year%16;//低位year=temp1*10+temp2;//把年数据转换成10进制temp1=month/16;//月份高位temp2=month%16;//月份低位month=temp1*10+temp2;//把月数据转换成10进制temp1=day/16;//日期高位temp2=day%16;//日期低位day=temp1*10+temp2;//把日数据转换成16进制//如果是21世纪TableAddr=(year+0x64-1)*0x03;//定位数据表地址year对应的年份表中的地址是(year+99)*3如2010年其地址是327LCDTestWord(0,0x80);LCDSendWord("20");temp1=YearCode[TableAddr+2]&0x60;//取当年春节所在的公历月份年份表中第三字节BIT6-5表示春节的公历月份temp1=_cror_(temp1,5);//循环右移5位,得到春节所在的公历月份temp2=YearCode[TableAddr+2]&0x1f;//取当年春节所在的公历日年份表中第三字节BIT4-0表示当年春节所在的公历日if(temp1==0x01)//计算当年春年离当年元旦的天数,春节只会在公历1月或2月temp3=temp2-1;//假如春节在公历1月,则元旦离春节的天数为temp2-1天elsetemp3=temp2+0x1f-1;//假如春节在公历2月,则无理离春节的天数为temp2+0x1f-1天if(month<10)temp4=DayCode1[month-1]+day-1;//0到8月某日距元旦的天数elsetemp4=DayCode2[month-10]+day-1;//9月开始的某一天距元旦的天数if((month>0x02)&&(year%0x04==0))//如果公历月大于2月并且该年的2月为闰月,天数加1temp4+=1;//计算机出公历日距元旦的天数和春节距元旦的天数,则是为了比较公历日是在春节前还是春节后//如果temp3>temp4则公历日在春节之前if(temp4>=temp3)//公历日在春节后或就是春节当日使用下面代码进行运算{temp4-=temp3;//公历日离春节的天数因为公历日在春节后所以为temp4-temp3month=0x01;MonthP=0x01;//LunarMonth为月份指向,公历日在春节前或就是春节当日LunarMonth指向首月flag2=GetMoonDay(MonthP,TableAddr);//检查该农历月为大小还是小月,大月返回1,小月返回0flag_y=0;if(flag2==0)//GetMoonDay()函数返回的是0{temp1=0x1d;}//小月29天else//GetMoonDay()函数返回的是1{temp1=0x1e;}//大月30天temp2=YearCode[TableAddr]&0xf0;//年份数据表中第1字节BIT7-4为闰月,为0则这年无闰月,如为1,表示有闰月temp2=_cror_(temp2,4);//从数据表中取该年的闰月月份,如为0,则该年无闰月BIT3-0表示阴历1到4月的大小1为大0为小while(temp4>=temp1){temp4-=temp1;MonthP+=1;if(month==temp2){ flag_y=~flag_y;if(flag_y==0){ month+=1;}}else{ month+=1;}flag2=GetMoonDay(MonthP,TableAddr);if(flag2==0){ temp1=0x1d;}else{ temp1=0x1e;}}day=temp4+1;}else{//公历日在春节前使用下面代码进行运算temp3-=temp4;//公历日离春节的天数因为公历日在春节前所以为temp3-temp4if(year==0x00){year=0x63;cenbit=1;}elseyear-=1;TableAddr-=0x03;month=0x0c;temp2=YearCode[TableAddr]&0xf0;//格式第一字节BIT7-4位表示闰月月份,为0,则无闰月,BIT3-0对应阴历第1-4月的大小,temp2=_cror_(temp2,4);if(temp2==0){MonthP=0x0c; }else{MonthP=0x0d; }/*MonthP为月份指向,如果当年有闰月,一年有十三个月,月指向13,无闰月指向12*/flag_y=0;flag2=GetMoonDay(MonthP,TableAddr);if(flag2==0)temp1=0x1d;elsetemp1=0x1e;while(temp3>temp1){temp3-=temp1;MonthP-=1;if(flag_y==0)month-=1;if(month==temp2)flag_y=~flag_y;flag2=GetMoonDay(MonthP,TableAddr);if(flag2==0)temp1=0x1d;elsetemp1=0x1e;}day=temp1-temp3+1;}c_moon=cenbit;temp1=year/10;temp1=_crol_(temp1,4);temp2=year%10;LunarYear=temp1|temp2;temp1=month/10;temp1=_crol_(temp1,4);temp2=month%10;LunarMonth=temp1|temp2;temp1=day/10;temp1=_crol_(temp1,4);temp2=day%10;LunarDay=temp1|temp2;}voidDisplayLunarYearD(void){ucharLunarYearD,ReYear;//农历年份的十进制数和取模后的余数if(cen==0x19){cenbit=1;}if(cen==0x20){cenbit=0;}Conversion(cenbit,year,month,day);//将公历日期转换成农历LCDTestWord(0,0x94);//显示在LCD的0X94位置上LCDTestWord(1,LunarYear/16+0x30);//农历年十位LCDTestWord(1,LunarYear%16+0x30);//农历年个位LCDTestWord(1,'-');//用-隔开LCDTestWord(1,LunarMonth/16+0x30);//农历月十位LCDTestWord(1,LunarMonth%16+0x30);//农历月个位LCDTestWord(1,'-');LCDTestWord(1,LunarDay/16+0x30);//农历日十位LCDTestWord(1,LunarDay%16+0x30);//农历日个位LunarYearD=(LunarYear/16)*10+LunarYear%16;//农历年转换成10进制数ReYear=LunarYearD%12;//农历年模12,取余运算switch(ReYear){case0:LCDTestWord(0,0x93);LCDSendWord("龙");break;//余0即整除农历龙年case1:LCDTestWord(0,0x93);LCDSendWord("蛇");break;//蛇年case2:LCDTestWord(0,0x93);LCDSendWord("马");break;case3:LCDTestWord(0,0x93);LCDSendWord("羊");break;case4:LCDTestWord(0,0x93);LCDSendWord("猴");break;case5:LCDTestWord(0,0x93);LCDSendWord("鸡");break;case6:LCDTestWord(0,0x93);LCDSendWord("狗");break;case7:LCDTestWord(0,0x93);LCDSendWord("猪");break;case8:LCDTestWord(0,0x93);LCDSendWord("鼠");break;case9:LCDTestWord(0,0x93);LCDSendWord("牛");break;case10:LCDTestWord(0,0x93);LCDSendWord("虎");break;case11:LCDTestWord(0,0x93);LCDSendWord("兔");break;}}/***************节假日提示********************/voidHolidays(void){ucharnext;LCDTestWord(0,0x98);if(next==0){if(LunarMonth==0x01&&LunarDay==0x01){LCDSendWord("春节快乐!");}if(LunarMonth==0x01&&LunarDay==0x15){LCDSendWord("元宵节快乐!");}if(LunarMonth==0x04&&LunarDay==0x18){LCDSendWord("爸爸的生日!");}if(LunarMonth==0x05&&LunarDay==0x05){LCDSendWord("端午节快乐!");}if(LunarMonth==0x07&&LunarDay==0x07){LCDSendWord("中国情人节快乐!");}if(LunarMonth==0x08&&LunarDay==0x15){LCDSendWord("中秋节快乐!");}if(LunarMonth==0x08&&LunarDay==0x25){LCDSendWord("嘿嘿,我又长大了");}if(LunarMonth==0x09&&LunarDay==0x09){LCDSendWord("重阳节快乐!");}if(LunarMonth==0x09&&LunarDay==0x30){LCDSendWord("妈妈的生日!");}if(LunarMonth==0x12&&LunarDay==0x08){LCDSendWord("腊八节!");}if(LunarMonth==0x12&&LunarDay==0x15){LCDSendWord("过小年啦!");}if(LunarMonth==0x12&&LunarDay==0x29){LCDSendWord("还有一天新年啦!");}if(LunarMonth==0x12&&LunarDay==0x30){LCDSendWord("今天就到新年夜了");}//以上是农历节日,以下是公历节日if(month==0x01&&day==0x01){LCDSendWord("元旦节快乐!");}if(month==0x02&&day==0x10){LCDSendWord("世界气象日!");}if(month==0x02&&day==0x14){LCDSendWord("情人节快乐!");}if(month==0x03&&day==0x12){LCDSendWord("中国植树节!");}if(month==0x04&&day==0x01){LCDSendWord("愚人节快乐!");}if(month==0x04&&day==0x05){LCDSendWord("中国清明节!");}if(month==0x04&&day==0x22){LCDSendWord("世界地球日!");}if(month==0x05&&day==0x01){LCDSendWord("国际劳动节!");}if(month==0x05&&day==0x04){LCDSendWord("中国青年节!");}if(month==0x05&&day==0x12){LCDSendWord("世界护士节!");}if(month==0x06&&day==0x01){LCDSendWord("国际儿童节!");}if(month==0x06&&day==0x05){LCDSendWord("世界环境日!");}if(month==0x06&&day==0x06){LCDSendWord("国际爱眼日!");}if(month==0x06&&day==0x25){LCDSendWord("世界土地日!");}if(month==0x06&&day==0x26){LCDSendWord("国际禁毒日!");}if(month==0x07&&day==0x01){LCDSendWord("香港回归纪念日!");}if(month==0x08&&day==0x01){LCDSendWord("中国建军节!");}if(month==0x09&&day==0x10){LCDSendWord("中国教师节快乐!");}if(month==0x09&&day==0x18){LCDSendWord("九一八事件纪念日");}if(month==0x09&&day==0x19){LCDSendWord("西北民族大学校庆");}if(month==0x10&&day==0x01){LCDSendWord("中国国庆节!");}if(month==0x10&&day==0x09){LCDSendWord("世界邮政日!");}if(month==0x10&&day==0x10){LCDSendWord("辛亥革命纪念日!");}if(month==0x12&&day==0x20){LCDSendWord("澳门回归纪念日!");}if(month==0x12&&day==0x24){LCDSendWord("平安夜快乐!");}if(month==0x12&&day==0x25){LCDSendWord("圣诞节快乐!");}}}voidPingRunNian(void){ucharyear;{year=ReadDs1302(0x8d);if((year%4==0&&year%100!=0)||year%400==0){LCDTestWord(0,0x8e);LCDSendWord("闰");LCDTestWord(0,0x8f);LCDSendWord("年");}else{LCDTestWord(0,0x8e);LCDSendWord("平");LCDTestWord(0,0x8f);LCDSendWord("年");}}}vo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 证券从业资格证经济学对证券影响试题及答案
- 项目管理敏捷实践的考查要点试题及答案
- 注册会计师应试自信心提升试题及答案
- 项目管理稳步推进方法试题及答案
- 项目管理专业资格考试考核机制试题及答案
- 理财师如何进行资本运作的决策试题及答案
- 公共场地改造方案范本
- 2025年特许金融分析师考试职业规划试题及答案
- 新建果园施肥方案范本
- 证券从业资格证考试实战技巧试题及答案
- 2025广东省能源集团西北(甘肃)有限公司招聘18人笔试参考题库附带答案详解
- 面粉代理合同协议
- 2024年5月26日河南省事业单位联考《职业能力测试》真题及答案
- 基金从业人员资格历年真题答案2024
- 寻甸城乡投资开发集团有限公司笔试信息
- 2025年江苏扬州水利建筑工程有限责任公司招聘笔试参考题库含答案解析
- 上海市松江区2022-2023学年四年级下学期期中数学试卷(带答案)
- 2025年中考英语考点单选题100道及答案
- 2025年贵州国企:贵州茅台酒股份有限公司招聘笔试参考题库含答案解析
- 桩基行业企业宣传
- 2025届名校学术联盟高三下学期模拟冲刺政治试题及答案
评论
0/150
提交评论