万年历单片机_第1页
万年历单片机_第2页
万年历单片机_第3页
万年历单片机_第4页
万年历单片机_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

.z单片机万年历设计报告题目:基于51单片机万年历设计院〔系〕:机械与电子工程学院班级:09应用电子技术2班学生名:指导教师:时间:2011--.z目录摘要1第一章绪论3第二章设计要求与方案论证42.1设计要求42.1.1根本要求4发挥局部42.2系统根本方案选择和论证52.2.1芯片的选择52.2.2显示模块选择方案和论证52.2.3时钟信号的选择方案和论证62.3电路设计最终方案决定6第三章系统的硬件设计与实现73.1万年历电路设计框图73.2系统硬件概述73.3硬件电路构造的设计83.3.1单片机主控制模块的设计83.3.2显示模块的设计8时间调整电路的设计103.3.4主控芯片原理及其说明103.3.5复位电路的选择13第四章系统的软件设计14第五章系统调试165.1软件调试165.2硬件调试165.3实物调试16结论17设备选择18参考文献18附录19-.z摘要万年历是对年、月、日、周、时、分、秒,数字显示及到时提醒的计时装置,广泛用于个人家庭,车站,码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的开展和石英晶体振荡器的广泛应用,使得万年历的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便。最常见的数字钟通常使用单片机模块控制,一种用单片机原理实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。本次设计就是通过用单片机为主控制,通过电路仿真而实现。首先使用Proteus7Professional软件进展绘制硬件电路图,用keil软件进展编程与调试,最终生成he*文件,传入单片机内部,从而实现仿真效果。此次设计的万年历具有显示年、月、日、周、时、分、秒及对各日期与时间的调整、校正功能。整个时钟通过简易的键盘来实现各个功能,界面简洁、直观、易于操作。关键词:万年历、仿真、单片机、Proteus7Professional、keilAbstractCalendaristheyear,month,day,week,hours,minutes,seconds,digitaldisplayandtoremindthetimingdevice,widelyusedforpersonalfamily,stations,terminalsandotherpublicplaces,theofficehasbeeessentialdailynecessitiesoflife

,becausethedevelopmentofdigitalintegratedcircuitsandthee*tensiveapplicationofquartzcrystaloscillators,makingPrecisionofcalendar,farmorethanold-fashionedclocks,digitalwatchesandlivingtothepeoplehasbroughtgreatconvenience.

Themostmonsinglechipmodulestypicallyusedigitalclockcontrol,atheorywithasinglechiptoachievethehours,minutes,seconds,timingdevices,paredwiththemechanicalclockhasahigheraccuracyandintuitive,andnomechanicaldevices,withmoremore

longlife,ithasbeenwidelyused.

Thedesignisbyusingamicrocontroller-basedcontrol,achievedthroughcircuitsimulation.

Proteus7Professionalsoftwareisthefirsttousethehardwarecircuitdiagramdrawnusingkeilsoftwareprogramminganddebuggingtheresultinghe*file,theininginternalmicrocontroller,inordertoachievesimulationresults.

Thedesignofthecalendarwithshowsyear,month,day,week,hours,minutes,secondsanddateandtimeofeachadjustment,calibration.

Theclockthroughasimplekeyboardtorealizevariousfunctions,theinterfacesimple,intuitive,easytooperate.Keywords:calendar,simulation,singlechip,Proteus7Professional,keil第一章绪论20世纪末,单片机技术获得了飞速的开展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的开展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。时间对人们来说总是则珍贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。但是,一旦重要事情,一时的耽误可能酿成大祸。目前,单片机正朝着高性能和多品种方向开展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面开展。下面是单片机的主要开展趋势。单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。从前必须由模拟电路或数字电路实现的大局部功能,现在已能用单片机通过软件方法来实现了。这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。单片机模块中最常见的是万年历,万年历是一种用单片机原理实现年、月、日、周、时、分、秒,计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。万年历是采用单片机原理实现对年、月、日、周、时、分、秒,数字显示及到时提醒的计时装置,广泛用于个人家庭,车站,码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的开展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时播送、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为根底的。因此,研究数字时钟及扩大其应用,有着非常现实的意义。第二章设计要求与方案论证2.1设计要求根本要求〔1〕在不采用专用时钟模块的前提下,设计并制作万年历。〔2〕准确显示:时、分、秒〔24小时制〕〔3〕显示星期〔4〕显示公历〔5〕时间、日期、星期可调节〔6〕断电记忆功能发挥局部〔1〕闹钟功能〔2〕显示阴历〔3〕显示24节气〔4〕其他2.2系统根本方案选择和论证本时钟的设计具体有两种方法。一是通过单纯的数字电路来实现;二是使用单片机来控制实现。本次设计选取了较为简单的单片机控制;而选择这一方法后还要进展各个芯片的选择。以下是我在这次设计中所用的方案。芯片的选择方案一:采用AT89C51芯片,其为高性能CMOS8位单片机,该芯片内含有4kbytes的可反复擦写的只读程序存储器〔PEROM〕、128bytes的随机存取数据存储器〔RAM〕、32位可编程I/O口线、2个16位定时/计数器、6个中断源、可编程串行UART通道及低功耗空闲和掉电模式,但是由于AT89C51芯片可擦写的空间不够大,且中断源提供的较小,为防止运行过程中出现不必要的问题,我们不选用AT89C51。方案二:采用AT89C52芯片,它除了具备AT89C51的所有功能与部件外,其最大的优势就是AT89C52提供了8K字节可擦写Flash闪速存储器空间、8个中断源、及256*8字节内部存储器〔RAM〕,解决了我们对可反复擦写的Flash闪速存储器空间大小与中断源的不够问题的担忧。显示模块选择方案和论证方案一:采用LED数码管显示,显示较为清楚,且经济实惠,直观易懂,且在软件实现上也较容易,为实现其功能也比拟容易。方案二:采用LCD,电路比拟简单,虽然在软件设计上也相对简单,具有低功耗功能,但程序比拟繁琐,难以设计。因此,在设计中我采用的显示模块是LED数码管显示。时钟信号的选择方案和论证方案一:直接采用单片机定时计数器提供的秒信号,使用程序实现年、月、日、周、时、分、秒计数。采用此种方案可减少芯片的使用,节约本钱,实现的时间误差较小,在软件中比拟容易仿真,但程序设计较为复杂。方案二:采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进展计数,而且精度高,256位的RAM作为数据暂存区,工作电压2.5V~5.5V*围内,2.5V时耗电小于300nA。且硬件电路连接较为简单,程序设计容易实现。2.3电路设计最终方案决定综上各方案所述,并且经过我们队友的多番讨论,对此次万年历的方案选定为:采用AT89C52作为主控制系统;并由单片机定时计数器直接提供时钟的秒信号;LED数码管作为显示电路,来实现本次设计的所有功能。第三章系统的硬件设计与实现3.1万年历电路设计框图晶振电路开关调整时间局部单片机晶振电路开关调整时间局部单片机AT89C51四位数码管显示局部数码管段选局部四位数码管显示局部数码管段选局部复位电路复位电路三八译码器,扩展位选局部三八译码器,扩展位选局部图〔3-1〕电路设计框图3.2系统硬件概述本设计用AT89C51作为核心控制局部,具有在线编程功能,低功耗,能在3V超低压工作;时钟电路也由AT89C52单片机提供,减少芯片的使用,节约本钱,它可以对年、月、日、周、日、时、分、秒进展计时,具有闰年补偿功能。外接晶振电路与复位电路,74LS138作为位选扩展电路,P0口接七个开关作为时间调整局部,以两个四位数码管作为显示局部,开关控制显示时间与日期,P2口作为段选,P1口作为位选局部。具体框图如图〔3-1〕所示。3.3硬件电路构造的设计单片机主控制模块的设计此次单片机数字时钟的设计采用AT89C52为主控制芯片,并由其定时器提供时钟,利用LED数码管进展时间按显示。下列图为用Proteus软件画的总原理图:图〔3-3-1〕仿真总电路图显示模块的设计LED数码管分为共阴和共阳两种,以利用AT89C51的P2口作为LED显示的段选局部,以P1口的P1.0、P1.1、P1.2、三个口作为显示局部的位选,通过三八译码器扩展为八位的位选分别接在两个四位数码管的位选局部。详细电路图如〔3-3-2〕两图所示:图〔3-3-2〕时间显示图〔3-3-2〕月份显示时间调整电路的设计采用按键设计,独立式按键直接与单片机I/O口相连构成键盘,每个按键不会相互影响,按下时间/星期键两个四位数码管显示时间和星期,按下年/月/日键两个数码管显示日期,按下调整键可以对时间和日期进展调节,值加键表示加,值减键表示减,换位表示选择所要调节的位置,确认按键按下,时间调节完毕。所连线路和单片机接口仿真图如图3所示:图〔3-3-3〕按键电路主控芯片原理及其说明1主控制芯片AT89C52的原理及说明AT89C52是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含8kbytes的可反复擦写的只读程序存储器〔PEROM〕和蔼可亲256bytes的随机存取数据存储器〔RAM〕,器件采用ATMEL公司的高密度、非易失性存储技术生产,与标准MCS-51指令系统及8052产品引脚兼容,片内置通用8位中央处理器〔CPU〕和Flash存储单元,功能强大AT89C52单片机适合于许多较为复杂控制应用场合。图(3-3-4)AT89C52引脚2主要性能参数:与MCS-51产品指令和引脚完全兼容8k字节可重擦写Flash闪速存储器1000次擦写周期全静态操作:0Hz—24MHz三级加密程序存储器256×8字节内部RAM32个可编程I/O口线3个16位定时/计数器8个中断源可编程串行UART通道低功耗空闲和掉电模式3引脚功能Vcc(40):电源电压GND(20):接地P0口(32-39):P0口是一个8位双向I/O接口,也即地址/数据总线复用口。作为输出口用时,每位吸收电流的方式驱动8个TTL逻辑门电路,对端口P0写“1”P1口(1-8):P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动〔吸收或输出电流〕4个TTL逻辑门电路,对端口写“1”通过内部的上拉电阻把端口拉到高电平时,此时可作输入口。作为输入品使用时,因为内部存在上拉电阻,*个引脚被外部信号拉低时会输出一个电流。与AT89C51不同之处是,P1.0和P1.1还可以分别作为定时/计数器2的外部计数输入(P1.0/T2〕P2口(21-28):P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动〔吸收或输出电流〕4个TTL逻辑门电路,对端口P2写“1”P3口(10-17):P3是一组带有内部上拉电阻的8位双向I/O口,P3口输出缓冲级可驱动〔吸收或输出电流〕4个TTL逻辑门电路,对端口P3写“1”端口引脚第二功能P3.0R*D〔串行输入口〕P3.1T*D〔串行输出口〕P3.2INT0〔外中断0〕P3.3INT1〔外中断1〕P3.4T0〔定时/计数器0〕P3.5T1〔定时/计数器1〕P3.6WR〔外部数据存储器写通道〕P3.7RD〔外部数据存储器读通道〕表3-3-4P3口的第二功能RST(9):复位信号输入端。当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。ALE/PROG(30):地址锁存有效信号输出端。当片外程序存储器或数据存储器时,ALE〔地址锁存允许〕输出脉冲用于锁存地址的低8位字节,一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的,要注意的是:每当外部数据存储器时将跳过一个ALE脉冲。PSEN(29):程序存储允许输出端。是片外程序存储器的读选通信号,当AT89C52由外部程序存储器取指令〔或数据〕时,每个周期两次PSEN有效,即输出两个脉冲。在此期间,当外部数据存储器,将跳过两次PSEN信号。EA/VPP(31):外部允许。欲使CPU仅外部程序存储器〔地址为0000H—FFFFH〕,EA端必须保持低电平〔接地〕,需注意的是:如果加密位LB1被编程,复位时内部会锁EA端状态。如EA端为高电平〔接Vcc端〕,CPU则执行内部程序存储器中的指令。Flash存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。*TAL1(19):振荡器反相放大器的及内部时钟发生器的输入端。*TAL1(18):振荡器反相放大器的输出端。通过*TAL1、*TAL2外接晶振后,即可构成自激振荡器,驱动内部时钟发生器向主机提供时钟信号。4特殊功能存放器在AT89C52片内存储器中,80H-FFH共128个单元为特殊功能存放器〔SFR〕,其中包括B存放器、累加器、程序状态存放器〔PSW〕、定时/计数器控制、中断优级控制存放器〔IP〕、P3口锁存存放器、中断允许控制存放器〔IE〕、串行口控制存放器等。它们可运用来设置片内电路的运行方式,记录电路的运行状态,MCS-51单片机对特殊功能存放器采取与片内RAM统一编址的方法,可按字节地址直接寻址。在已有的根底上AT89C52与AT89C51相比还提供了两个定时/计数器。定时/计数器2的控制和状态位位于T2CON与T2MOD,该功能的数在自动装载的情况下可装入到存放器中,提高了效率。复位电路的选择目前为止,单片机复位电路主要有四种类型:〔1〕微分型复位电路;〔2〕积分型复位电路;〔3〕比拟器型复位电路:〔4〕看门狗型复位电路。方案一:采用手动复位,该方法线路简单。在系统运行过程中,有时可能需要对系统进展复位,以防止对硬件经常加电或断电而造成的伤害,我们可以采用手动复位的方式。如图3-3-5-1所示:图3-3-5-1手动上电复位电路方案二:阻容上电自动复位电路,这种电路线路也简单,它利用电容上电压不能突变而是按指数规律上升或下降的特性,产生所需要的复位脉冲。优点:使用最为普遍且本钱低廉的复位电路。如图3-3-5-2所示:图3-3-5-2自动复位电路总结:这两种方案对设计的影响其实差异不大,根据实验需要选择方案一可手动复位电路。第四章系统的软件设计定时中断恢复初值,保存定时中断恢复初值,保存N开场N开场清显示缓冲区中断50ms加1清显示缓冲区中断50ms加1初始化定时计数器Y秒单元清零,60秒到N秒加1初始化定时计数器Y秒单元清零,60秒到N秒加1NY赋时钟初值NY赋时钟初值秒单元清零,60分到分加1开定时器秒单元清零,60分到分加1开定时器NY调整时间NY调整时间分单元清零,24小时到时加1分单元清零,24小时到时加1Y数码管显示当前时钟值勤Y数码管显示当前时钟值勤时单元清零时单元清零堆栈返回堆栈返回图4-1程序框图系统程序采用C语言按模块化方式进展设计,然后通过KeilC51L软件开发平台将程序转变成十六进制程序语言,得到HE*文件,接着使用Proteous进展仿真,得出仿真结果。系统程序主要包括主程序,读出时钟子程序、计算时间子程序、键盘扫描子程序和显示数据刷新子程序。主程序流程图如图4-1所示。第五章系统调试5.1软件调试翻开程序调试软件keiluVision4,在里面新建一个工程,命名为:万年历.Uv2。接着新建文件,编写相应程序。编写好的各个程序进展编译与连接。但假设是在该过程中,看见我们编好的程序有错误,则就根据他相应的提示来修改错误,直到该程序能够正确编译为止。能够正常编译的程序说明没有什么问题了,此时我们在点击相关栏目,让它生成我们在硬件仿真时所需要的.HE*文件。到此步,我们的软件调试就完成了。5.2硬件调试翻开Proteus7Professional软件,按照方案所选的电路元件来设计整体电路,线把个芯片按一定的位置放好,然后对相应的对象进展连接,连接时需仔细,以免调试时发生错误。做好之后把编程所生成的。HE*文件加载到AT89C52中,运行仿真软件,查看运行效果。如果运行出错则就根据他相应的提示来修改错误,直到仿真成功为止。5.3实物调试〔1〕按照电路图在万能板上焊好电路〔2〕给电路通上电源,翻开总电源开关,LED显示是否通电;〔3〕电路板上分别有复位、日期、时间、调整、加、减、选位和确定按键,可以对时间和日期进展任意的调整;其中日期或时间按键按下,数码管分别显示日期和时间;调整按键按下表示对时间开场进展调整,通过选位来确定所要调整的位置,分别可以加和减,最后确定按键按下表示时间调整完成。〔4〕用两个四位数码管通过时间和日期按键来切换,可显示时间和日期。结论通过本次设计的制作,我较为全面地回忆了所学的硬件知识与软件知识。同时,单片机原理与应用及电子技术方面的相关知识,在这次设计中得到了较好地实践。在本次设计中我也学到了很多东西,比方说:我们更好地掌握了Proteus7Professional软件进展硬件原理图的绘制、利用KILE软件对我设计的程序的检查与生成.HE*文件及遇到问题怎么解决等。首先,在这次设计中,在我们遇到过很多我们自己不理解的问题及书本上或是我以前没有看见过的知识点。在面对这些问题时,我们首先采用的是上网搜寻的方法来查看别人是否和我们一样遇到过相类似的问题,并且查看一下别人是怎样解决这个问题的。当别人有了解决它问题的方法时,我们在根据别人的提示,想想自己的问题出在哪里,该怎么解决。当我们还是无法想到解决的方法是,我们就带着自己的问题到图书馆查阅资料,如果我们的问题还是没有解决,我们就带着问题去问我们的指导教师,让他帮我解决。采用这样的方法,我的很多问题都迎刃而解了!其次,就是在本次设计过程中,我不但努力解决自己遇到的问题,还积极帮助同学解决他们遇到的问题。这样一来,我的知识得到了进一步的稳固,同学的问题也得到了相应的解决,我到达的一举双收的效果,我为此而感到快乐。最后,让我们觉得这次设计的最大成果是:我们知道了将理论用到实际中时,会遇到很多的问题。因此,在此时我们一定要先沉着的找出问题出现的原因,在对症下药,来解决问题。我相信只要我们面对问题沉着、冷静,我们的问题都会被解决。设备选择本次实验所用设备如下表1所示:序号名称型号、规格数量1四位十进制数码管*DSM420361K22上拉电阻A103J13电阻1K9个、10K1个、100欧2个124电容20PF、100UF、10UF45按键电源按键1个、其它按键9个106晶振12M17三八译码器74LS13818单片机座19单片机89C52RC110蜂鸣器111NPN112发光二极管113带公共端的8电阻排RESPACK-82表1实验所用材料参考文献王静霞主编?单片机应用技术〔C语言版〕?电子工业杨欣、王玉凤?电子设计从零开场?清华大学边春远、王志强?MCS-51单片机应用开发实用子程序?人民邮电廖先芸?电子技术实践与实训?高等教育附录主程序:*include<reg52.h>*include<intrins.h>unsignedcharcodeduanma[]={0*3F,0*6,0*5B,0*4F,0*66,0*6D,0*7D,0*7,0*7F,0*6F,0*40};//共阴的数码管段选unsignedchardatatianshu[]={31,28,31,30,31,30,31,31,30,31,30,31};//每月的天数unsignedcharcodeweima[]={0*f8,0*f9,0*fa,0*fb,0*fc,0*fd,0*fe,0*ff};//位码,控制74hc138unsignedintbdatanian=2011;//初始化时间unsignedchardatajianzhi=16,yue=05,ri=05,zhou=00,shi=21,fen=59,miao=56;unsignedchartshi=21,tfen=00,tmiao=05,t,t1,t2,t3,nri,nyue; //初始化闹钟unsignedchardatahuanwei=0;unsignedcharbdatacishu=0,cishu1=0,cishu2=0,cishu3=0,temp[8]={0}; bitt_or_d=0;//控制显示时间还是日期标志,只有8个数码管所以只有分开显示了bittiaozheng=0;//记录调整按钮的状态bitkey_up=0;//按键抬起标志sbitP00=P0^0; //按键分配sbitP01=P0^1;sbitP02=P0^2;sbitP03=P0^3;sbitS=P1^3;sbitS1=P1^4;voiddelay();////////////////////主函数////////////////////////voidmain(){ P3=0*00; while(1) { voiddisplayt(); voidtdatet(); voiddisplayn(); void displayd(); voidnz(); //显示闹钟 voiddisplay();//显示temp的内容;voiddelay();//软件延时voiddis_time();//显示时间voidcount_week();//计算*年月日是星期几voiddis_date();//显示日期bitrunian(unsignedint);//判断闰年voidreadkey16();//16键盘扫描,键值保存在jianzhi中voidmanage_key();//给相应按键赋予动作 IE=0*82;//翻开定时器0中断 TMOD=1;//让定时器0工作在1方式 TH0=0*3C; TL0=0*1F;//时间常数50ms TR0=1; loop: count_week(); manage_key(); if(!t1) if(!t2) { if(t_or_d) dis_date();//显示日期 else dis_time();//显示星期和时间 } if(S==0) { t1=1; nz(); //显示闹钟 } else S=0; if(cishu1==50) t1=0;////////////////////////////////////////////////////////// if(S1==0) { t1=1; tdatet(); } //调试区 else t2=0;////////////////////////////////////////////////////////// gotoloop; }}///////////////////按键管理///////////////////////////////voidmanage_key(){readkey16();//读取键值 if(jianzhi==0) t_or_d=0;if(jianzhi==1) t_or_d=1; if(jianzhi==2) { if(t_or_d==0)//调整时间时才关闭定时器 TR0=0; tiaozheng=1; huanwei=0;} if(key_up)//按键抬起后才做一次动作{ delay(); if(key_up)///////////////////调整时间/闹钟/星期////////////////////////if(t_or_d==0&&tiaozheng==1)//在显示时间状态下调整时间{ if(jianzhi==15) { huanwei++;//在时、分、秒之间切换 if(huanwei==4) huanwei=0; }if(S==1&&tiaozheng==1) //在显示闹钟状态下调整闹钟 { t3=1; }if(huanwei==0&&S==1&&jianzhi==7) //响应闹钟时加调整 { tshi++; if(tshi>=24) tshi=0; }if(huanwei==0&&S==1&&jianzhi==11) //响应闹钟时减调整{ tshi--; if(tshi==0) tshi=24; } if(huanwei==1&&S==1&&jianzhi==7) //响应闹钟分加调整 { tfen++; if(tfen>=60) tfen=0; }if(huanwei==1&&S==1&&jianzhi==11) //响应闹钟分减调整 { tfen--; if(tfen==0) tfen=60; }if(huanwei==2&&S==1&&jianzhi==7) //响应闹钟秒加调整 { tmiao++; if(tmiao>=60) tmiao=0;} if(huanwei==2&&S==1&&jianzhi==11) //响应闹钟秒减调整 { tmiao--; if(tmiao==0) tmiao=60; }///////////////////调整时间////////////////////////////// if(!t3){ if(huanwei==0&&jianzhi==7)//响应时加调整 { shi++; if(shi>=24)shi=0; } if(huanwei==0&&jianzhi==11)//响应时减调整 { shi--; if(shi==0)shi=24; } if(huanwei==1&&jianzhi==7)//响应分加调整 { fen++; if(fen>=60)fen=0; }if(huanwei==1&&jianzhi==11)//响应分减调整 { fen--; if(fen==0)fen=60; } if(huanwei==2&&jianzhi==7)//响应秒加调整 { miao++; if(miao>=60)miao=0; } if(huanwei==2&&jianzhi==11)//响应秒减调整 { miao--; if(miao==0)miao=60; } if(huanwei==3&&jianzhi==7)//响应星期加调整 { zhou++; if(zhou>=7)zhou=1; } if(huanwei==3&&jianzhi==11)//响应星期减调整 { zhou--; if(zhou==0)zhou=7; } }}////////////////////////调整日期///////////////////////////// if(t_or_d==1&&tiaozheng==1) //在显示日期状态下调整日期 { if(jianzhi==15) { huanwei++; if(huanwei==3) huanwei=0; } if(huanwei==0&&jianzhi==7) //响应年加调整 nian++;if(huanwei==0&&jianzhi==11) //响应年减调整 nian--; if(huanwei==1&&jianzhi==7)//响应月加调整 { yue++; if(yue==13) yue=1; } if(huanwei==1&&jianzhi==11) //响应月减调整 { yue--; if(yue==0) yue=12; } if(huanwei==2&&jianzhi==7)//响应日加调整 { ri++; if(ri>tianshu[yue-1]) ri=1; } if(huanwei==2&&jianzhi==11) //响应日减调整 { ri--; if(ri>tianshu[yue-1]) ri=1; }} if(jianzhi==3) { TR0=1; tiaozheng=0; } jianzhi=16; }}/////////////////////计算*年月日是星期几///////////////////////voidcount_week(){ unsignedintweek=0; unsignedchari;if(runian(nian)) tianshu[1]=29; //闰年二月天数是29天 else tianshu[1]=28; //平年二月天数是28天if(nian==2011) { for(i=1;i<yue;i++) week=tianshu[i-1]%7+week; week=(week+5+ri)%7; } if(nian>2011) { for(i=0;i<nian-2011;i++) { if(runian(2011+i)) week=week+2; //闰年余两天 else week=week+1; //平年余一天 } for(i=1;i<yue;i++) week=tianshu[i-1]%7+week; week=(week+5+ri)%7; } if(nian<2011) { for(i=1;i<=2011-nian;i++) { if(runian(2011-i)) week=week+2;//闰年余两天 else week=week+1;//平年余一天 } week=6-(week+2)%7; for(i=1;i<yue;i++) week=tianshu[i-1]%7+week; week=(week+1+ri)%7; } if(week==0) week=7; zhou=week;/////////////////计算2011年的阴历////////////////////////////if(nian==2011){if(yue==1){if(ri<=3) //调试区 {nri=ri+26; nyue=yue+10; } else nri=ri-3; nyue=yue+11; } //调试区if(yue==2){if(ri<=2) {nri=ri+28; nyue=yue+10; } else nri=ri-2; //调试区 nyue=yue-1; }if(yue==3){if(ri<=4) {nri=ri+26; nyue=yue-2; } else //调试区 nri=ri-4; nyue=yue-1;}if(yue==4){if(ri<=2) {nri=ri+27; nyue=yue-2; } else nri=ri-2; //调试区 nyue=yue-1; }if(yue==5){if(ri<=2) {nri=ri+28; nyue=yue-2; } else nri=ri-2; nyue=yue-1; } //调试区if(yue==6){if(ri<=1) {nri=ri+29; nyue=yue-2; } else nri=ri-1; nyue=yue-1; } //调试区if(yue==7){if(ri<=30) {nri=ri; nyue=yue-1; } else nri=ri-30; nyue=yue; }if(yue==8){if(ri<=28) {nri=ri+1; nyue=yue-1; //调试区 } else nri=ri-28; nyue=yue; }if(yue==9){if(ri<=26) {nri=ri+3; nyue=yue-1; } else nri=ri-26; //调试区 nyue=yue; }if(yue==10){if(ri<=26) {nri=ri+4; nyue=yue-1; } else nri=ri-26; nyue=yue; }if(yue==11){if(ri<=24) {nri=ri+5; nyue=yue-1; //调试区 } else nri=ri-24; nyue=yue; }if(yue==12){if(ri<=24) {nri=ri+6; nyue=yue-1; } else nri=ri-24; nyue=yue; }}/////////////////////////////////////////////////////////}/////////////////////键盘扫描///////////////////voidreadkey16(){ unsignedchara,RL,i;P0=0*0f; delay();if(P0!=0*0f){ i=0;RL=0*ef;ZERO:P0=RL;if(!P00) { a=0;gotokeyval; }if(!P01) { a=4;gotokeyval; }if(!P02) { a=8;gotokeyval; }if(!P03) { a=12;gotokeyval; }i++;RL=_crol_(RL,1);gotoZERO;keyval: jianzhi=a+i; key_up=0; }else key_up=1;}///////////////////////显示///////////////////////////voiddis_date()//存储日期数据{temp[0]=nian/1000;temp[1]=nian%1000/100;temp[2]=nian%1000%100/10;temp[3]=nian%1000%100%10;temp[4]=yue/10;temp[5]=yue%10;temp[6]=ri/10; temp[7]=ri%10;displayd();} voiddis_time()//存储时间数据{temp[0]=shi/10;temp[1]=shi%10;temp[2]=fen/10;temp[3]=fen%10;temp[4]=miao/10;temp[5]=miao%10; temp[7]=zhou;temp[6]=10;display();}voidnz() //存储闹钟数据{temp[0]=tshi/10;temp[1]=tshi%10;temp[2]=tfen/10;temp[3]=tfen%10;temp[4]=tmiao/10;temp[5]=tmiao%10;displayn();} voiddisplayd()//显示日期程序{ unsignedchari; for(i=0;i<=7;i++) {

温馨提示

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

最新文档

评论

0/150

提交评论