《基于单片机的万年历系统的设计_毕业设计(39页).doc》由会员分享,可在线阅读,更多相关《基于单片机的万年历系统的设计_毕业设计(39页).doc(39页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-基于单片机的万年历系统的设计_毕业设计-第 36 页摘 要万年历设计是采用数字电路实现对.时,分,秒.数字显示的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,但是所有这些,都是以钟表数字化为基础的。因此,研究万年历及扩大其应用,有着非常现实的意义。本课题基
2、于单片机设计的万年历设计,用AT89C51来完成电路的控制,用DS1302完成时钟的显示部分。本设计涉及到了单片机与外围器件的串行、并行通信原理和INT0,INT1中断原理,定时器计数器原理,键盘原理,液晶显示原理等。关键词:单片机;万年历;液晶技术;AbstractCALENDAR digital circuit design is right. Hours, minutes and seconds. Figures show that the timing devices, widely used in individual households, stations, terminals
3、offices and other public places, become an indispensable necessity in daily life, due to the number of integrated circuits the development and extensive application of quartz crystal oscillators, making digital clock accuracy, far more than old-fashioned clocks and watches, clock digital production
4、and life to people brings great convenience, but also greatly expanded the original chime clocks. Such as regular auto-alarm, schedule automatic rang the bell, the time automatic control, regular radio, automatic closed-circuit from lights, oven timer switch, on-off power equipment, and even a varie
5、ty of regular electrical automatically enabled and so on, but all these are based on clocks and watches digitization basis. Therefore, the study calendar and expand its application, has a very practical significance. The topic of perpetual calendar design based on single chip design, with the AT89C5
6、1 to complete the circuit control the clock with the completion of the display part of the DS1302. This design relates to the MCU and peripheral devices, serial, parallel communication principles and INT0, INT1 interrupt principle, the timer counter principle, keyboard theory, liquid crystal display
7、 rationale. Keywords: SCM; calendar; liquid crystal technology;目录1 系统总体设计11.1 引言11.2 系统整体设计思路11.3 设计方案选择21.4 功能介绍21.5 工作原理31.6 本章小结32 系统硬件电路设计42.1单片机最小系统硬件的电路设计42.1.1 单片机电路设计42.1.2 时钟电路设计62.1.3 复位电路设计72.2 时钟电路的设计82.2.1 DS1302的性能特性82.2.2 DS1302数据操作原理92.3 独立式键盘设计112.4 显示电路的设计113系统软件设计143.1阳历程序143.2 时间
8、调整程序143.3 阴历程序163.4 万年历总体流程图183.5 万年历总程序(见附录)194 设计总结20参考文献21附 录22致 谢451 系统总体设计1.1 引言随着电子技术的不断发展,单片机技术在设计中所体现在出来的优势越来越明显,它不仅是电子信息类专业的一个重要部分,而且在其它类专业工程中也是不可缺少的。广泛地应用于家电、工业过程控制、仪器仪表、智能武器、航空和空间飞行器等领域发展更是迅速,已成为新一代一些电子设备不可缺少的核心部件。目前世界上单片机年产量已达十多亿片,通常是当年微处理器产量的4-5倍以上。用最少的芯片就能实现最强大的功能。可以想见,这是将来电子产品的主流方向,它将
9、无可置疑地一步步取代其它同类产品,其数量之大和应用面之广,是其它任何类型的计算机所无法比拟的1。单片机是应工业测控需要而诞生的。它把计算机最基本的功能电路,如CPU、程序存储器、数据存储器、I/O接口、定时、计数器、中断系统等集成到一块芯片上,形成单片形态的计算机。单片机通常以最小系统运行,在家用电器中和常用的智能仪器仪表中常常可以“单片”工作,同时单片机在我们日常生活中也经常见到,如电子表、舞厅里的一些灯光的控制、一些招牌灯光的控制、工厂一些自动控制等。将来只要有自动控制方面的都会离不开单片机的开发和使用,对于现代的自动化控制起着举足轻重的作用。为了顺应形势发展的需要,我们学习了单片机课程,
10、此次用液晶显示万年历和时间设置以及显示测温度的数据对单片机的学习起到了很好的巩固作用,尤其是对汇编语言程序的设计。 1.2 系统整体设计思路此设计即在数码管上显示年、月、日、时、分、秒、星期和阴历月、日,以及在显示农历时间时,能表明是否为闰年。原理框图如图1-1所示。电路一般包括以下几个部分:时钟电路模块、键盘扫描、单片机最小系统和显示电路等部分2。对于各部分:为使时钟走时与标准时间一致,校时电路是必不可少的,键盘用来校正液晶上显示的时间。单片机通过输出各种电脉冲信号来驱动控制各部分正常工作。(3)单片机发送的信号经过显示电路在数码管上显示出来。图1-1 电子万年历电路系统构成框图Figure
11、 1-1 Constitute a block diagram of electronic circuitry Calendar1.3 设计方案选择方案一 用EDA技术及VHDL语言控制来实现显示及测温度,且显示也可以用数码管,但设计电路复杂,不易实现。此外,对于VHDL语言也不够了解,故不采用此方案。方案二 主控芯片使用51系列AT89C52单片机,时钟芯片采用美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟DS1320。采用DS1320作为计时芯片,可以做到计时准确。更重要的是,DS1320可以在很小电流的后备电源(2.55.5 V电源,在2.5V时耗电小于300nA)下继
12、续计时,而且DS1320可以变成编程选择多种充电电流来对后备电源进行慢速充电,可以保证后备电源基本不耗电,显示模块采用普通的共阳LED数码管,键输入采用查询法实现功能调整,用汇编语言编程来控制单片机让它在数码管上显示数据及文字3。由于单片机结构简单、控制功能强、可靠性高、体积小、价格低等优点,综合上述方案的选择与比较,选择方案二。也主要是由于电器元件的熟悉程度以及市场的供求关系。在方案二中,大部分的电器元件我们较熟悉并且更容易获得。1.4 功能介绍此设计即在数码管上显示年、月、日、时、分、秒、星期和阴历月、日,以及在显示农历时间时,能表明是否为闰年。本次设计主要用单片机控制程序让它在数码管上显
13、示年、月、日、时、分、秒及星期,时、分、秒的计数结果经过数据处理可直接送数码管显示。当计时发生误差的时候可以用校时电路进行校正。时计数器计满24小时后自动向日计数器进一,日计数器由平年、闰年的28/30/31对大、小月和二月的判断应与当月相应的日期相一致,当日计数器计满时,向月计数器进位,月计数器计满12月向年计数器进位,当年计数器计满100时所以计数器清零。设计采用的是年、月、日和时、分、秒、星期以及温度同时显示。1.5 工作原理设计的电路主要由四大模块构成:单片机最小系统模块、时钟电路模块、键盘扫描模块和显示电路模块。由单片机控制的万年历以及时间显示,当时间及秒计数计满60时就向分进位,分
14、计数器计满60分后向时计数器进位,小时计数器按“24翻1”规律计数。时、分、秒的计数结果经过数据处理可直接送数码管显示。当计时发生误差的时候可以用校时电路进行校正。时计数器计满24小时后自动向日计数器进一,日计数器由平年、闰年的28/30/31对大、小月和二月的判断应与当月相应的日期相一致,当日计数器计满时,向月计数器进位,月计数器计满12月向年计数器进位,当年计数器计满100时所以计数器清零。设计采用的是年、月、日和时、分、秒、星期显示,所以在单片机通过对数据处理进行同时在数码管上显示。1.6 本章小结本章主要介绍了万年历系统整体设计思路、设计方案选择、功能介绍和工作原理等,使对整个系统有个
15、大致的了解,明白以后的设计方案和原理,为下面的硬件和软件设计埋下伏笔。2 系统硬件电路设计2.1单片机最小系统硬件的电路设计2.1.1 单片机电路设计(1)AT89C51的简介AT89C51是一种低功耗,高性能的CMOS8位微处理器,内部有8K字节的闪速PEROM ,该芯片采用ATMEL公司高密度、非挥发性存储器工艺制成且与工业标准的MCS-51系列的引脚及指令兼容,FLASH系列存储器为快速擦写存贮器。相对于MCS-51系列芯片而言,其特点如下 :1、可擦写1000次2、全静态操作:0Hz.24MHz3、32根可编程I/O口线4、内部RAM为256字节5、两个16位的定时/计数器6、5个中断
16、源AT89C51有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,2个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89C51可以按照常规方法进行编程,也可以在线编程。(2)AT89C51芯片的管脚、引线与功能AT89C51芯片图如图2-1所示。端口引脚信号介绍:P00P07 :P0口8位双向口线 P10P17 :P1口8位双向口线P20P27 :P2口8位双向口线 P30P37 :P3口8位双向口线其它引脚信号介绍:操作限程序存储器;而当信号为高电平时,则对ROM的读操作是从内部程序存储器开始,并可延至外部程序存储器。ALE地址定在外部访问程序存储
17、器控制信号:当信号为低电平时,对ROM的读锁存控制信号:在系统扩展时,ALE用于控制把P0口输出低8位地址锁存起来,以实现低位地址和数据的隔离。此外由于ALE是以晶振六分之一的固定频率输出的正脉冲,因此可作为外部时钟或外部定时脉冲作用4。以实现外部ROM单元的外部程序存储器读选取通信号:在读外部ROM时有效(低电平),读操作。XTAL1和XTAL2外接晶体引线端:当使用芯片内部时钟时,此二引线端用于外接石英晶体和微调电容;当使用外部时钟时,用于拉外部的时钟脉冲信号。RST复位信号:当输入的复位信号延续2个机器周期以上高电平时即为有效,用以完成单片机的复位初始化操作。VSS:地线 VCC:+5V
18、电源P3口的第二功能如表2-1:表2-1 P3口第二功能表Table 2-1 P3 I second menu引脚号第二功能P3.0RXD(串行输入)P3.1TXD(串行输出)P3.2INT0(外部中断0)P3.3INT0(外部中断0)P3.4T0(定时器0外部输入)P3.5T1(定时器1外部输入)P3.6WR(外部数据存储器写选通)P3.7RD(外部数据存储器读选通)(3)AT89C51的总线结构AT89C51的管脚除了电源、复位、时钟接入、用户I/O口部分P3外,其余管脚都是为实现系统扩展而设置的。这些管脚构成了三总线形式,即:(1)地址总线(AB):地址总线宽度为16位,因此,其外部存储
19、器直接地址外围为64K字节。16位地址总线由P0经地址锁存器提供低8位地址(A0A7);P2口直接提供高8位地址(A8A15)。(2)数据总线(DB):数据总线宽度为8位,由P0口提供。(3)控制总线 (CB):由部分P3口的第二功能状态和4根独立控制线RESET、ALE、组成。AT89C51结构框图如图2-2所示。图2-1 AT89C51芯片图Figure 2-1 AT89C51 chip diagram图2-2 AT89C51结构图Figure 2-2 AT89C51 Structure2.1.2时钟电路设计时钟电路用于产生单片机工作所需要的时钟信号,而时序所研究的是指令执行中各信号之间的
20、相互关系。单片机本身就如一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格地作。(1)时钟信号的产生单片机内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,其输出端为引脚XTAL2。而在芯片的外部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器。电容器C1和C2的作用是稳定频率和快速起振,电容值的范围在5pF30pF,典型值为30pF。晶振的频率通常选择两种6MHz和12MHz。只要在单片机的XTAL1和XTAL2引脚外接晶体振荡器就构成了自激振荡器并在单片机内部产生时钟脉冲信号。(2)时钟振荡电路如图2-3所示:2.
21、1.3 复位电路设计复位电路是使单片机的CPU或系统中的其他部件处于某一确定的初始状态,并从这上状态开始工作。(1)单片机常见的复位电路通常单片机复位电路有两种:上电复位电路,按键复位电路。上电复位电路:上电复位是单片机上电时复位操作,保证单片机上电后立即进入规定的复位状态。它利用的是电容充电的原理来实现的。按键复位电路:它不仅具有上电复位电路的功能,同时它的操作比上电复位电路的操作要简单的多。如果要实现复位的话,只要按下RESET键即可。它主要是利用电阻的分压来实现的6。在此设计中,采用的按键复位电路。按键复位电路如图2-4所示。(2)复位电路工作原理上电复位要求接通电源后,单片机自动实现复
22、位操作。上电瞬间RESET引脚获得高电平,随着电容的充电,RERST引脚的高电平将逐渐下降。RERST引脚的高电平只要能保持足够的时间(2个机器周期),单片机就可以进行复位操作。上电与按键均有效的复位电路不仅在上电时可以自动复位,而且在单片机运行期间,利用按键也可以完成复位操作。图2-4 复位电路图因此本设计选用第二种上电复位与按键均有效的各单位电路。2.2 时钟电路的设计2.2.1 DS1302的性能特性 实时时钟,可对秒、分、时、日、周、月以及带闰年补偿的年进行计数;用于高速数据暂存的318位RAM; 最少引脚的串行I/O; 2.55.5V工作范围; 2.5V时耗电小于300nA; 用于时
23、钟或RAM数据读/写的单字节或多字节(脉冲方式)数据传送方式; 简单的三线接口; 可选的慢速充电(至Vcc1)的能力。DS1302时钟芯片包括实时时钟/日历和31字节的静态RAM。它经过一个简单的串行接口与微处理器通信。实时时钟/日历提供秒、分、时、日、周、月和年等信息。对于小于31天的月和月末的日期自动进行调整,还包括闰年校正的功能。时钟的运行可以采用24时或带AM(上午)/PM(下午)的12时格式。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多字节的时钟信号或RAM数据。DS1302有主电源/后备电源双电源引脚:Vcc1在单电源与电池供电的系统中提供低电源,并提供低功率的电池
24、备份,Vcc2在双电源系统中提供主电源。在这种运行方式中,Vcc1连接到后备电源,以便在没有主电源的情况下能保存时间信息和数据。DS1302由Vcc1或Vcc2中较大者供电。当Vcc2 (Vcc1+0.2V)时,Vcc2给DS1302供电;当Vcc2=2.5V之前,RST脚必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。表2-2所列为各脚的功能。 表2-2 DS1302引脚功能Table 2-2 DS1302 pin function引脚号引脚名称功能1Vcc2主电源2,3X1,X2振荡源,外接32768HZ晶振4GND地线5RST复位/片选线6I/O串行数据输入/输出端(双
25、向)7SCLK串行数据输入端8VCC1后备电源DS1302的控制字如图2-5所示,控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。位6如果为0,则表示存取日历时钟数据;为1则表示存址。最低有效位(位0)如果为0,则表示要进行操作。控制字节总是从最低位开始输入/输出7 6 5 4 3 2 1 01RAMCKA4A3A2A1A0RAMK图2-5 DS1302的控制字Figure 2-5 DS1302 to control word 为了提高对32个地址寻址能力(地址/命令位15=逻辑1),可以把时钟/日历或RAM寄存器规定为多字节(burst)方式。位6规定
26、时钟或RAM,而位0规定读或写。在时钟/日历寄存器中的地址931或RAM寄存器中的地址31不能存储数据。再多字节方式中,读或写从地址0的位0开始。必须按数据传送的次序写最先的8个寄存器。但是,当以多种字节方式写RAM时,为了传送数据不必写所有的31字节。否则是否写了全部的31字节,所写的每一字节都将传送至RAM。DS1302共有12个寄存器,其中有7个寄存器于日历、时钟相关,存放的数据位为BCD码形式。其日历、时间寄存器及其控制字如表2-3所列,其中奇数为读操作,偶数为写操作。表2-3 内部寄存器地址和内容Table 2-3 addresses and contents of internal
27、 registers寄存器名命令字节取值范围寄存器内容秒寄存器写读76543210分寄存器80H81H0059CH10SECSEC时寄存器82H83H0059010MINMIN日期寄存器84H85H0023或011212/24010A/PHRHR月份寄存器86H87H0128、29、30、310010DATEDATE周寄存器88H89H011200010MMONTH年寄存器8AH8BH010700000DAY8CH8DH009910YEARYEAR始终暂停:秒寄存器的为7定义位时钟暂停位。当它为1时,DS1302停止震荡,进入低功耗的备份方式,通常在对DS1302进行写操作时(如进入时钟调整程
28、序),停止震荡。当它为0时,始终将开始启动。AM-PM/12-24时方式:时寄存器的位7定义为12或24时方式选择位。他为高电平时,选择12时方式。在此方式下,位5是AM/PM位,高电平时表示PM,低电平表示AM。在24时方式下,位5为第二个10时位(2023h)。 DS1302的晶振选用32768Hz,电容推荐值为6pF。因为振荡频率较低,也可以不接电容,对计时精度影响不大。2.3 独立式键盘设计实现键盘控制的方法有多种,它可以用FPGA来进行控制,也可以用单片机来进行控制。在本系统中,我们采用了单片机来进行控制,因为单片机可以很好的解决键抖动。由若干个按键组成一个键盘,其电路结构可分为独立
29、式键盘和矩阵式键盘两种。 独立式键盘每个键单独占用一根I/O口线,每根I/O口线上的按键工作状态不会影响其他I/O口线上的状态,矩阵式键盘按键排列为行列式矩阵结构,也称行列式键盘结构。4行4列共16个键,只占用8根I/O口线,键数目较多,可节省口线。此设计的是3行3列共9个键。键盘的工作方式可分为编程控制方式和中断控制方式。CPU在一个工作周期内,利用完成其他任务的空余时间,调用键盘扫描子程序,经程序查询,若无键操作,则返回;若有键操作,则进而判断是哪个键,并执行相应的键处理程序。这种方式为编程扫描方式。由于单片机在正常应用过程中,可能会经常进行键操作,因而编程控制方式使CPU经常处于工作状态
30、, 在进行本次设计中,涉及到了启动/关闭、调时、调分、调秒,调年,月,日,星期,等很多功能个功能,采用了3行3列键进行功能设置可以完成任务设置8。但是,由于此显示部分用到了移位寄存器,采用独立式键盘设计即可完成任务且矩阵键盘编程比较困难,故本设计采用了独立式键盘设计。2.4 显示电路的设计显示部分采用普通的共阳数码管显示,采用动态扫描,以减少硬件电路。考虑到一次扫描19位数码管显示时会出现闪烁情况,设计时19个数码管分3排同时扫描,第一排6个数码管分为千年、百年、十年、年、十月、月,第二排6位数码管分别为十时、时、十分、分、十秒、秒,第三排7位数码管分别为星期、阴历十月、阴历月、阴历十日、阴历
31、日、十日、日。显示时采用串行口输出段码,用3片74LS164来驱动3排数码管,这样扫描一次只需7ms。74LS164内部为8个D触发器,用以实现数据的串行移位。74LS164的特性如表2-4所示。单片机以串行口方式0(移位寄存器方式)输出数据,3片74LS164作为3排共阳数码管的串/并转换显示接口。74LS164为TTL单向8位移位寄存器,可以实现串行输入,并行输出。其中A、B(第1、2脚)为串行数据输入端,两个引脚按逻辑“与”运算规律输入信号,只有一个输入信号时可并接,共同作为输入脚。CP(第8脚)为时钟输入端,可连接到串行口的TXD端。每一个时钟信号的上升沿加到CP端时,移位寄存器移一位
32、。8个时钟脉冲过后,8位二进制数全部移入74LS164中。MR脚(第9脚)为复位端,当该脚为低电平时,移位寄存器各位复0;只有当它为高电平时,时钟脉冲才起作用。Q1Q8(第36和第1013引脚)并行输出端分别接数码管的h、g、f、e、d、c、b、a各段对应的引脚上(因为串行口从低位开始传送)。在给出了8个脉冲后,最后进入74LS164的第一字节数据到达了最高位。再来一个脉冲,第一个脉冲就会从最高位移出,进入下个74LS164的第一位。3片74LS164首尾相串,而随后的第二字节的数据则进入了第一片74LS164.这样,当第三次8个脉冲完成后,首次送出的数据被送到了最下面的164(第三片)中,其
33、他数据依次出现在第二、第一片74LS164中,实现了数据在74LS164中的串行输入、并行输出。表2-4 74LS164特性表Table 2-4 74LS164 Characteristics操作模式输入输出复位MRABQ0Q1Q7移位LXXLQ0Q6HLLLQ0Q6HLHLQ0Q6HHLLQ0Q6 HHHHQ0Q6在方式0状态下,串行口为同步移位寄存器方式,其波特率是固定的,为fosc/12;数据由RXD(P3.0)端输入或输出,同步移位脉冲由TXD(P3.1)端输出;发送、接收数据时,低位在先。因此,根据本章节下面提供的硬件电路图,在编写程序时,查共阳数码管的段码的二进制数据应该将正常的共
34、阳数码管09的二进制按位反序排序,例如原来的二进制11000000(C0H),要改为00000011(03H),就能使数码管正常显示。2.5 本章小结本章主要通过对万年历的硬件的各个单元进行进行设计,主要包括最小系统硬件的电路设计、时钟电路的设计、独立式键盘设计、显示电路的设计等四个部分,详细说明了万年历的硬件设计电路,下一章将主要讲述万年历的软件部分,软件和硬件相结合,构成了整个万年历系统。3系统软件设计3.1阳历程序因为使用了 时钟芯片DS1302,阳历系统只需从DS1302各个寄存器中读出年、周、月、日、时、分、秒等数据,再处理即可。在首次对DS1302进行操作前,必须对它进行初始化,然
35、后从DS1302中读出数据,再经过处理后,送给显示缓冲单元。阳历程序流程图3-1。图3-1 阳历程序流程图Figure 3-1 Flow chart of the solar calendar 3.2 时间调整程序调整时间用2个调整按钮(注:电路图中画有3个按钮,另一个按钮读者可用于减1操作键),1个作为移位、控制用,另外1个作为加调整用,分别定义为控制按钮、加按钮。在调整时间过程中,要调整的位与其他位应该有区别,所以增加了闪烁功能,即调整的位一直在闪烁,直到调整到下一位。闪烁原理就让要调整的位每隔一定时间熄灭一次,比如50ms。利用定时器时,当达到50ms溢出时,就送给该位熄灭符,在下一次溢
36、出时,再送正常显示的值,不断交替,直到该位结束,此时送正常显示值给该位,再进入下一位调整闪烁程序。时间调整程序流程图3-2所示。图3-2 时间调整程序流程图Figure 3-2 Flow chart of time to adjust表3-1 2004年的阴历与阳历对应关系表Table 3-1 lunar calendar and the Gregorian in 2004, the corresponding relationship月份123456789101112闰2月大小小大大大小大小大小大小大小天数1000101010101二进制293030302930293029302930十六进
37、制4252213.3 阴历程序阴历程序的实现是要靠阳历日期来推算的。要根据阳历来推算阴历日期,首先要设计计算法。推算方法是,根据阳历当前日期在一年中的天数来计算阴历日期。阳历一个月不是30天就是31天(2月除外,闰年2月为29天,平年2月为28天)。阴历一年有12个月或13个月(含闰年),一个月为30天或29天。如果把一个只有29天的月称为小月,用1为标志,把30天的月称为大月,用0为标志,那么12位二进制就能表示一年12个月的大小。如果有闰月,则把闰月的月份作为一字节的高4位,低4位表示闰月的大小,大月为0,小月为1,这样,一字节就包含了所有的闰月信息,阴历春节和阳历元旦相差的天数也用一字节
38、表示。总共用4字节就可以存储一年中任何一天阳历与阴历对应关系的有关数据,例如2004年的阴历与阳历对应关系如表3-1所列。 2004年的春节和元旦相差21天,这样2004年的信息表示为:21,42H,52H,21H。其中表示12个月大小信息的字节,第4位和第7位不用。第一字节位十进制,其他的都为十六进制。按此方法,50年的阳历和阴历对应关系表总共使用200字节。2000-2050年的关系表:35,15H,51H,00H(2000) 23,11H,52H,41H(2001) 42,12H,65H,00H(2002)31,11H,32H,00H(2003) 21,42H,52H,21H(2004)
39、 39,52H,25H,00H(2005)28,25H,04H,71H(2006) 48,66H,42H,00H(2007) 37,33H,22H,00H(2008)25,15H,24H,51H(2009) 44,05H,52H,00H(2010) 33,22H,65H,00H(2011)22,21H,25H,41H(2012) 40,24H,52H,00H(2013) 30,52H,42H,91H(2014)49,55H,05H,00H(2015) 38,26H,44H,00H(2016) 27,53H,50H,60H(2017)46,53H,24H,00H(2018) 35,25H,54H
40、,00H(2019) 24,41H,52H,41H(2020)42,45H,25H,00H(2021) 31,24H,52H,00H(2022) 21,51H,12H,21H(2023)40,55H,11H,00H(2024) 28,26H,21H,61H(2025) 47,26H,61H,00H(2026)36,13H,31H,00H(2027) 25,05H,31H,51H(2028) 43,12H,54H,00H(2029)33,51H,25H,00H(2030) 22,42H,25H,31H(2031) 41,32H,22H,00H(2032)30,55H,02H,71H(2033)
41、49,55H,22H,00H(2034) 38,26H,62H,00H(2035)27,13H,64H,60H(2036) 45,13H,32H,00H(2037) 34,12H,55H,00H(2038)23,10H,53H,51H(2039) 42,22H,45H,00H(2040) 31,52H,22H,00H(2041)21,52H,44H,21H(2042) 40,55H,44H,00H(2043) 29,26H,50H,71H(2044)47,26H,64H,00H(2045) 36,25H,32H,00H(2046) 25,23H,32H,50H(2047)44,44H,55H,
42、00H(2048) 32,24H,45H,00H(2049) 22,55H,11H,30H(2050)有了算法和数据之后 ,就可以设计软件了。先要根据当前阳历的日期,算出阳历为该年中的第几天。图3-3所示为计算阳历中任何一天在该年中为第几天的程序流程图。图3-3 计算阳历天数程序流程图Figure 3-3 Flow chart for calculating the solar calendar days计算出当前阳历日期为该年中的第几天后,再减去阳历该年春节和元旦的日差,如果够减,则相减的结果就是阴历在该年的总第几天了,根据该数据就可以推算出具体的当前阴历日期;如果不够减,则表示当前阴历年为
43、阳历年的前一天。在这种情况下,根据实际,当前阴历日期会处于阴历11月或12月,此时春节和元旦的日差减去前面计算出的当前阳历日期在阳历年为第几天的数据,其结果表示当前阴历日期离春节的天数。计算出的阳历天数为该年的第几天,存放在寄存器R2和R3中。计算出天数后,如果大于#FFH,则把#FFH存放在R2中,余值存放在R3中。也就是说,在用寄存器R2和R3表示的天数信息中,R2充当主寄存器,数据先存满R2,再存R3.在整个转换程序中,这里面的数据不能被覆盖。计算出阳历总天数后,就可以根据它来推算阴历日期。推算方法是,先用总天数减去春节和元旦的日差,如果结果为1,则该天正好是春节(因为春节在元旦之后,在
44、计算春节和元旦的日差时,假设元旦为0天,春节为n天,则日差为n,而前面计算的阳历总天数是该天在该年中的第几天,是以元旦为1而得到的,与计算春节和元旦日差的这种方法相比,其数值少了1,所以要在原来本应该以0作为该天就是春节的依据的基础上加1,即以1作为该天是春节的标志);如果结果小于1,则阴历应该是阳历的前一年;如果结果大于1,说明阳历和阴历为同一年。再根据查表所得的该年的阴历的闰月和大小月的信息,就可以推算出该天的阴历日期了。图3-4所示为由总天数推算出阴历日期的程序流程图。图3-4 推算阴历日期的程序流程图Figure 3-4 Flow chart of the projected date
45、 of the lunar calendar3.4 万年历总体流程图万年历流程如图3-5所示。流程图分析:开始既当日加一天,同时星期也就相应的加1,看星期是否加到7,若加到了7,就返回到1,若没有就返回到时钟状态,当日加到相应的最大数时,月分就相应的加1,看月份是否加到了13, 若没有到13,就一直等待,若到了13就返回1,且年份就加1,当年份到2099时就清到2005年,若没有,就一直等待,直到2099为止10。图3-5 万年历流程图Figure 3-5 Flowchart Calendar3.5 万年历总程序(见附录)3.6 本章小结本章主要通过对万年历软件的各个单元进行进行设计,主要包括阴历程序、时间调整程序、阳历程序、万年历总体流程图等五个部分,详细说明了万年历的软件设计电路,上一