基于单片机带温度显示的电子万历设计毕业设计.doc

上传人:仙人指路1688 文档编号:4148497 上传时间:2023-04-07 格式:DOC 页数:77 大小:708KB
返回 下载 相关 举报
基于单片机带温度显示的电子万历设计毕业设计.doc_第1页
第1页 / 共77页
基于单片机带温度显示的电子万历设计毕业设计.doc_第2页
第2页 / 共77页
基于单片机带温度显示的电子万历设计毕业设计.doc_第3页
第3页 / 共77页
基于单片机带温度显示的电子万历设计毕业设计.doc_第4页
第4页 / 共77页
基于单片机带温度显示的电子万历设计毕业设计.doc_第5页
第5页 / 共77页
点击查看更多>>
资源描述

《基于单片机带温度显示的电子万历设计毕业设计.doc》由会员分享,可在线阅读,更多相关《基于单片机带温度显示的电子万历设计毕业设计.doc(77页珍藏版)》请在三一办公上搜索。

1、毕业设计基于单片机带温度显示的电子万年历设计摘 要单片机应用技术飞速发展,纵观我们现在生活的各个领域,从导弹的导航装置,到飞机上各种仪表的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据处理,以及我们生活中广泛使用的各种智能IC 卡、电子宠物等,这些都离不开单片机。单片机是集CPU ,RAM ,ROM ,定时,计数和多种接口于一体的微控制器。它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。本设计着重要描述的就是基于AT89S52的单片机的电子万年历。本文首先描述系统硬件工作原理,随后说明了本系统所应用的各硬件接口技术(既芯片驱动程序)和各个接口模块的功能及工作过

2、程。本设计的主导思想是软硬件相结合来进行各功能模块的编写。电子万年历以硬件C语言为主体进行软件设计,增加了程序的可读性和可移植性。系统通过LCD液晶输出显示数据,可以显示当前时间、公农历日期、星期、温度,并附有以峰鸣器为提示的闹铃功能。关键词:单片机 电子万年历 公农历 接口模块 C语言AbstractMCU rapid development of applied technology, we now live Looking at the various fields, from the missiles navigation devices, to the various instrum

3、ents on the aircraft control, computer network communications and data transmission, industrial automation to the process of real-time control and data Processing, and we live in the extensive use of the smart IC cards, electronic pets, these are inseparable from the SCM. SCM is set CPU, RAM, ROM, t

4、iming, counting on one interface and a variety of microcontrollers.Its small size, low cost, feature strong, smart widely used in industry and industrial automation.This design is going to describing the calendar based on AT89S52. System hardware of main body is described first, Follow the function,

5、 principle of work and hardware interface (that means the chips drives) are introduced. The designs main ideas is that composes soft and hardware to achieve the design.The calendar is designed with hardware C language as the Realization tool, which increased procedure readability and transplanting.

6、The system shows the output by LCD1602, which can demonstrate the current time, the lunar calendar date, the week, the temperature and the system, can alter people with a small sounder.Keywords: MCU Electronic calendar Lunar calendar Interface module C Language.目 录摘 要IABSTRACTII目 录III引 言11 系统方案设计21.

7、1 单片机芯片的选择方案21.2 显示模块选择方案31.3 时钟芯片的选择方案31.4 温度传感器的选择方案41.5 电路设计最终方案42 系统设计说明52.1 硬件模块图52.2 系统原理52.3 系统的软件流程图63 系统单元模块设计73.1 主控模块(AT89S52模块)73.2 DS1302时钟模块93.2.1 DS1302简介93.2.2 DS1302结构与工作原理103.2.3 控制命令字节与寄存器113.2.4 DS1302电路设计图163.3 公历与农历、星期转换模块163.3.1 概述163.3.2 基本原理173.3.3 程序流程图183.4 DS18B20温度模块203.

8、4.1 概述203.4.2 DS18B20的工作原理203.4.3 DS18B20与单片机的接口设计253.4.4 DS18B20程序设计方案263.5 整点报时模块293.5.1 概述293.5.2 设计原理293.5.3 整点报时电路设计图293.6 时间可调模块303.6.1 键盘扫描原理303.6.2 按键说明303.6.3 软件设计思路313.7 LCD1602显示模块313.7.1 概述313.7.2 结构与工作原理313.7.3 LCD1602电路设计图343.8 电源部分35结 束 语36参 考 文 献37致 谢38附 录- 1 -引 言近年来,随着我国科技的不断发展,我国经济

9、发展的支柱产业电子产业获得长足发展,近年来各种电子产品琳琅满目,随处可见,随着电子产品的更新速度的加快,各种功能强大,款式新颖的电子产品不断问世。日历时钟便是这一发展趋势中的代表,各种功能的日历应有尽有,且功能不断更新。日历时钟的研究也成为大多数相关专业的学生以及研究人员先研究的对象。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、定时启闭电路、定时开关烘箱、通断动力设备,甚至各种定时电气的自动启用等。因此,研究日历时钟及扩大其应用,有着非常现实的意义。日历是采用数字电路实现对.时,分,秒.数字显示的计时装置,广泛用于个人家庭,车站,码头办公室等公共场所,成为人们日常生活中不可少的

10、必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用使得时钟的精度远远超过老式钟表, 时钟的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。市场上有许多电子钟的专用芯片如:LM8363、LM8365 等,但它们功能单一,电路连接复杂,不便于调试制作!但是考虑到用单片机配合时钟芯片,可制成功能任意的日历时钟,而且可以做到硬件简单、成本低廉。所以本系统采用了以广泛使用的单片机AT89S52 技术为核心,配合时钟芯片DS1302。软硬件结合,使硬件部分大为简化,提高了系统稳定性,并采用LCD 显示电路、键盘电路,使人机交互简便易行。本方案设计出的日历时钟可以显示时间、设

11、置闹铃功能,重点研究实现了单片机时钟芯片这种模式的日历,在很多场合都能用到,也可以把此设计装在镜框中或其它工艺品中,以便更加实用。1 系统方案设计 1.1 单片机芯片的选择方案方案一: 采用89C51芯片作为硬件核心,采用Flash ROM,内部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术, 当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。方案二:采用AT89S52,片内ROM全都采用Flash ROM;能以3V的超底压工作;同时也与

12、MCS-51系列单片机完全该芯片内部存储器为8KB ROM 存储空间,同样具有89C51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏。综上所述,选择采用AT89S52作为主控制系统更适合设计。AT89S52 单片机是一种低功耗高性能的CMOS8位微控制器,内置8KB可在线编程闪存。该器件采用Atmel公司的高密度非易失性存储技术生产,其指令与工业标准 的80C51指令集兼容。片内程序存储器允许重复在线编程,允许程序存储器在系统内通过SPI串行口改写或用同用的非易失性存储器改写。通过把通用

13、的8位 CPU与可在线下载的Flash集成在一个芯片上,AT89S52便成为一个高效的微型计算机。它的应用范围广,可用于解决复杂的控制问题,且成本较低。 AT89S52的主要特性如下:1、兼容MCS51产品2、8K字节可擦写1000次的在线可编程ISP 闪存3、4.0V到5.5V的工作电源范围4、全静态工作:0Hz 24MHz5、3级程序存储器加密6、256字节内部RAM7、32条可编程I/O线8、3个16位定时器/计数器9、8个中断源10、UART串行通道11、低功耗空闲方式和掉电方式12、通过中断终止掉电方式13、看门狗定时器14、双数据指针15、灵活的在线编程(字节和页模式) 1.2 显

14、示模块选择方案方案一:采用LED数码管动态扫描,虽然LED数码管价格适中,对于显示数字也比较合适,然而需要显示多位数字和字母时,编程就会变得很复杂,而且占用的单片机口线多。方案二:采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以也不用此种作为显示.方案三:采用LCD液晶显示屏, LCD液晶显示屏尽管价格比较贵,但它的显示功能强大,可显示大量字符,显示多样,清晰可见, ,需要的接口线少。所以综合考虑,采用方案三的LCD液晶显示屏作为显示更适合本设计。 1.3 时钟芯片的选择方案方案一:直接采用单片机定时计数器

15、提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。采用此种方案虽然减少芯片的使用,节约成本,但是,实现的时间误差较大。方案二:采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高,位的RAM做为数据暂存区,工作电压2.5V5.5V范围内,2.5V时耗电小于300nA.综上所述,为显示时间更准确,实现功能更多,本设计采用DS1302时钟芯片提供时钟。 1.4 温度传感器的选择方案方案一:使用热敏电阻作为传感器,用热敏电阻与一个相应阻值电阻相串联分压,利用热敏电阻阻值随温度变化而变化的特性,采集这两

16、个电阻变化的分压值,并进行A/D转换。此设计方案需用A/D转换电路,增加硬件成本而且热敏电阻的感温特性曲线并不是严格线性的,会产生较大的测量误差。方案二:采用数字式温度传感器DS18B20,此类传感器为数字式传感器而且仅需要一条数据线进行数据传输,易于与单片机连接,可以去除A/D模块,降低硬件成本,简化系统电路。另外,数字式温度传感器还具有测量精度高、测量范围广等优点。为提高测量精度,降低成本,所以本设计采用数字式温度传感器DS18B20测量温度。 1.5 电路设计最终方案综上各方案所述,对此次作品的方案选定: 采用AT89S52作为主控制系统; DS1302提供时钟;数字式温度传感器;LCD

17、液晶显示屏作为显示模块。2 系统设计说明2.1 硬件模块图系统的硬件模块图如图2.1所示。DS1302时钟模块(89S52)主控模块键盘输入电路显示电路峰鸣器闹铃模块DS18B20温度模块图2.1 系统硬件模块图模块说明:1、DS1302时钟模块可以输出其当前日期、时间及星期2、键盘输入电路可以调整日期,时间及公农历的转换3、DS18B20温度模块可以测量当前室内的温度4、峰鸣器闹铃模块可以做整点报时5、显示电路则显示当前的系统运行情况 2.2 系统原理本系统是由AT89S52单片机为控制核心;时钟电路由DS1302提供,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能;温度的采

18、集由DS18B20构成;LCD1602用来显示数据;键盘输入电路可以调整日期,时间及公农历的转换。通过用C语言1编程,从DS1302寄存器中读取年、月、日、周日、时、分、秒等数据信息;从DS18B20寄存器中读取温度信息,再编程将以上信息送到LCD1602显示出来。同时,通过键扫描,编程实现调整日期,时间及公农历的转换。2.3 系统的软件流程图系统的软件流程图如图2.2所示。 开始初始化读、写日期、时间和温度分离日期时间温度显示值键扫描子程序显示子程序闹铃子程序结束图2.2 软件流程图3 系统单元模块设计 3.1 主控模块(AT89S52模块)目前,在我国比较流行的就是美国ATMEL公司的89

19、C51它是一种带Flash ROM的单片机,事实上,89C51目前正在用89S52代替。本系统就是以AT89S52作为主控芯片。图3.1 AT89S52封装图AT89S52采用40Pin封装的双列直接DIP结构,图4.1是它的封装图,40个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用。现在我们对这些引脚的功能加以说明:1、Pin20:接地脚。2、Pin40:正电源脚,正常工作或对片内EPROM烧写程序时,接+5V电源。3、Pin19:时钟XTAL1脚,片内振荡电路的输入端。4、Pin18:时钟XTAL2脚,片内振荡电路的输出端。时钟有两

20、种方式,一种是片内时钟振荡方式,但需在18和19脚外接石英晶体(2-12MHz)和振荡电容,振荡电容的值一般取10p-30p。另外一种是外部时钟方式,即将XTAL1接地,外部时钟信号从XTAL2脚输入。输入输出(I/O)引脚:Pin32-Pin39为P0.0-P0.7输入输出脚,Pin1-Pin8为P1.0-P1.7输入输出脚,Pin21-Pin28为P2.0-P2.7输入输出脚,Pin10-Pin17为P3.0-P3.7输入输出脚,这些输入输出脚的功能阐述如下:P0口(32脚39脚):是双向8位三态I/O口,在外接存储器时,与地址总线的低8位及数据总线复用,能以吸收电流的方式驱动8个TTL负

21、载。P1口(1脚8脚):是8位准双向I/O口。由于这种借口输出没有高阻状态,输入也不能锁存,故不是真正的双向I/O口。P1口能驱动(吸收或输出电流)4个TTL负载。P2口(21脚28脚):是8位准双向I/O口。访问外部存储器时,它可以作为高8位地址总线送出高8位地址。P2可以驱动(吸收或输出电流)4个TTL负载。P3口(10脚17脚):是8位准双向I/O口,P3口能驱动(吸收或输出电流)4个TTL负载。P3口除了作为一般的准双向通用I/O口使用外,每个引脚还有第二功能。P3口的8条线都定义有第二功能6,如表4.1所列。表3.1 P3口的第二功能表引脚第二功能P3.0RXD(串行口输入端)P3.

22、1TXD(串行口输出端)P3.2INT0(外部中断0请求输入端,低电平有效)P3.3INT1(外部中断0请求输入端,低电平有效)P3.4T0(定时器/计数器0的技数脉冲输入端)P3.5T1(定时器/计数器0的技数脉冲输入端)P3.6WR(片外数据存储器写选通信号输出端,低电平有效)P3.7RD(片外数据存储器写选通信号输出端,低电平有效) Pin9:RESET/Vpd复位信号复用脚,当单片机通电,时钟电路开始工作,在RESET引脚上出现24个时钟周期以上的高电平,系统即初始复位。初始化后,程序计数器PC指向0000H,P0-P3输出口全部为高电平,堆栈指钟写入07H,其它专用寄存器被清“0”。

23、RESET由高电平下降为低电平后,系统即从0000H地址开始执行程序。然而,初始复位不改变RAM(包括工作寄存器R0-R7)的状态,单片机复位后的状态如下:P0P3=FFH,各口可用于输出,也可用于输入;SP=07H,第一个入栈内容将写入08H单元;IP、IE和PCON的有效位为0,各中断源处于低优先级且均被关断,串行通讯的波 特率不加倍;PSW=00H,当前工作寄存器为0组。 Pin30:ALE/PROG当访问外部程序器时,ALE(地址锁存)的输出用于锁存地址的低位字节。而访问内部程序存储器时,ALE端将有一个1/6时钟频率的正脉冲信号,这个信号可以用于识别单片机是否工作,也可以当作一个时钟

24、向外输出。更有一个特点,当访问外部程序存储器,ALE会跳过一个脉冲。如果单片机是EPROM,在编程其间,PROG将用于输入编程脉冲。Pin29:PESN当访问外部程序存储器时,此脚输出负脉冲选通信号,PC的16位地址数据将出现在P0和P2口上,外部程序存储器则把指令数据放到P0口上,由CPU读入并执行。Pin31:EA/Vpp程序存储器的内外部选通线,8051和8751单片机,内置有4kB的程序存储器,当EA为高电平并且程序地址小于4kB时,读取内部程序存储器指令数据,而超过4kB地址则读取外部指令数据。如EA为低电平,则不管地址大小,一律读取外部程序存储器指令。显然,对内部无程序存储器的80

25、31,EA端必须接地。3.2 DS1302时钟模块3.2.1 DS1302简介DS1302是DALLAS公司推出的涓流充电时钟芯片内含有一个实时时钟/日历和31字节静态RAM。通过简单的串行接口与单片机进行通信,实时时钟/日历电路提供秒分时日月年的信息,每月的天数和闰年的天数可自动调整。时钟操作可通过AM/PM指示决定采用24或12小时格式。DS1302与单片机之间能简单地采用同步串行的方式进行通信,仅需用到三个口线。1.RES复位,2.I/O数据线,3.SCLK串行时钟。时钟/RAM的读/写数据以一个字节或多达31个字节的字符组方式通信。DS1302工作时功耗很低,保持数据和时钟信息时功率小

26、于1mW。DS1302是由DS1202改进而来,增加了以下特性:双电源管脚用于主电源和备份电源供应,Vcc1为可编程涓流充电电源,附加七个字节存储器,备份电源可由大容量电容(1F)替代。它广泛应用于电话传真便携式仪器以及电池供电的仪器仪表等产品领域。主要性能如下:1、时钟具有能计算2100年之前的秒,分,时,日,星期,月,年的能力,还有闰年调整的能力。2、31*8位暂存数据存储RAM3、串行I/O口方式使得管脚数量最少4、宽范围工作电压:2.0V5.5V5、工作电流:2.0V时,小于300nA6、读/写时钟或RAM时,有两种传送方式:单字节传送和多字节传送(字符组方式)7、8脚DIP封装或可选

27、的8脚SOIC封装8、简单的3线串行I/O接口9、与TTL/COMS兼容(VCC=5V时)10、可选工业级温度范围:-40oC+85oC3.2.2 DS1302结构与工作原理3.2.2.1 引脚及功能表1、DS1302的脚功能如表3.2所示,引脚如图3.2所示引脚号引脚名称功能1Vcc2主电源引脚2,3X1,X2振荡源,外接32.768KHz晶振4RST接地5GND复位/片选端6I/O串行数据输入/输出端(双向)7SCLK串行时钟输入端8Vcc1备用电源表3.2 引脚功能图3.2 DS1302的引脚图3.2.2.2 工作原理串行时钟芯片主要由寄存器、控制寄存器、振荡器、实时时钟以及RAM组成。

28、为了对任何数据传送进行初始化,需要将RST 置为高电平且将具有地址和控制信息的8位数据(控制字节)装入移位寄存器。数据在SCLK的上升沿串行输入,前8位指定访问地址,命令字装入移位寄存器后,在之后的时钟周期,读操作时输出数据,写操作时输入数据。时钟脉冲的个数在单字节方式下为8加8(8位地址加8位数据),在多字节突发模式方式下为8加最多可达248的数据。 3.2.3 控制命令字节与寄存器1、控制命令字节控制命令字节的格式如表3.3表3.3 控制命令字节的格式表D7 D6 D5 D4D3D2 D1D01RAM/CKA4A3A2A1A0RD/ W控制字节的最高有效位(位7)必须是逻辑1,如果它为0,

29、则不能把数据写入到DS1302中;位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。2、寄存器(1)历、时钟寄存器DS1302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据为BCD码形式。其日历、时间寄存器及其控制字如表3.5所示。寄存器的选择由命令字而定,日历,时钟各个寄存器与控制字对照表如表3.4所示。最后一位RD/W为0表示要进行写操作,为1表示进行读操作。表3.5为主要寄存器命令字、取值范围以及各位内容对照表。表3.4 日历、时钟寄存器与控

30、制字对照表寄存器名称D7D6D5D4D3D2D1D01RAM/CKA4A3A2A1A0 RD/W秒寄存器1000000分寄存器1000001小时寄存器1000010日寄存器1000011月寄存器1000100星期寄存器1000101年寄存器1000110写保护寄存器1000111慢充电寄存器1010000时钟突发寄存器1011111表3.5 DS1302的日历、时钟寄存器表寄存器名称命令字 取值范围各位内容写操作读操作765430秒寄存器80H81H0059CH10SECSEC分寄存器82H83H0059010MINMIN小时寄存器84H85H0112或002312/24010A/PHRHR日

31、寄存器86H87H0128,29,30,310010DATEDATE月寄存器88H89H011200010MMONTH星期寄存器8AH8BH01070000DAY年寄存器8CH8DH010910YEARYEAR写保护寄存器8EH8FHWP0000慢充电寄存器90H91HTCSTCSTCSTCSDSDSRSRS时钟突发寄存器BEHBFH特殊位的说明:CH:时钟暂停位。当此位设置为1时,振荡器停止,DS1302处于低功耗空闲状态,这时芯片消耗电流将小于100NA;当此位为0时,振荡器启动,时钟开始启动。12/24:12或24小时方式选择位。为1时选择12小时方式,在12小时方式下,位5是AM/PM

32、选择位,此位为1时表示PM。为0时选择24小时方式,在24小时方式下,位5是第2个小时位(2023时)。WP:写保护位。写保护寄存器的开始7位(06)置为0,在读操作时总是读出0。在对时钟或RAM进行写操作之前,位7(WP)必须为0,当它为高电平时,写保护位防止对任何其他寄存器进行写操作。TCS:控制慢充电的选择,为了防止偶然因素使DS1302工作,只有1010模式才能使慢速充电。DS:二极管选择位。如果DS为01,那么选择一个二极管;如果DS为10,则选择两个二极管;如果DS为11或00,那么充电器被禁止,与TCS无关。RS:选择连接在VCC2与VCC1之间的电阻,如果RS为00,那么充电器

33、被禁止,与TCS无关。选择的电阻如表3.6所示。表3.6 RS与所选电阻对照表RS位电阻器典型值00无无01R12 K10R24 K11R38 K由上所述,根据涓流充电寄存器的不同编程,可得到不同的充电电流。其充电电流具体计算公式如下: 公式3.1式中,5.0V为VCC2脚所接入的工作电压,VD为二极管正向压降0.7V, R为寄存器0和1位编码决定的电阻值,VE为VCC1脚所接入的电压。(2)RAM寄存器DS1302与RAM相关的寄存器分为两类,一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0HFDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄

34、存器,此方式下可一次性读写所有的RAM的31字节,命令控制字为FEH(写)、FFH(读)。RAM寄存器与控制字对照如表3.7。表3.7 RAM区寄存器与控制字对照表寄存器名称D7D6D5D4D3D2D1D01RAM/CKA4A3A2A1A0RD/ WRAM01000000RAM11000001RAM301111110RAM突发1111111(3)复位和时钟控制通过将RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供了终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS

35、1302进行操作。如果在传送过程中置RST为低电平,则会终止此次数据传送,并且I/O引脚变为高阻态。上电运行时,在VCC 2.5V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。(4)数据输入/输出数据输入是在输入写命令字的8个SCLK周之后,在接下来的8个SCLK周期中的每个脉冲的上升沿输入数据,数据从0位开始。如果有额外的SCLK周期,它们将被忽略。数据输出是在输出读命令字的8个SCLK周之后,在接下来的8个SCLK周期中的每个脉冲的下降沿输出数据,数据从0位开始。需要注意的是,第一个数据位在命令字节后的最后一位之后的第一个下降沿被输出。只要RST保持高电平,

36、如果有额外的SCLK周期,将重新发送数据字节,即多字节传送。时序图如图3.3所示。图3.3 时序图3.2.4 DS1302电路设计图图3.4 DS1302电路设计图3.3 公历与农历、星期转换模块3.3.1 概述公历是全世界通用的历法,以地球绕太阳的一周为一年。一年365 天分为12 个月,1、3、5、7、8、10、12 月为31 天,2 月为28 天,其余月份为30天。事实上地球绕太阳一周共365 天5 小时48 分46 秒,比公历一年多出5 小时48分46 秒,为使年误差不累积公历年用闰年法来消除年误差。由于每年多出5 小时48 分46 秒,每4 年累计多出23小时15 分4 秒,接近1

37、天。天文学家就规定每4 年有一个闰年把2 月由28 天改为29 天,凡是公历年代能被4 整除的那一年就是闰年。但是这样一来每4 年又少了44 分56 秒为了更准确地计时天文学家又规定凡能被100 整除的年份只有能被400 整除才是闰年,即每400 年要减掉3 个闰年,经过这样处理后实际上每400 年的误差只有2 小时53 分20 秒,已相当准确了。 农历与公历不同,农历把月亮绕地球一周作为一月。因为月亮绕地球一周不是一整天,所以农历把月分为大月和小月。大月30 天,小月29 天。通过设置大小月使农历日始终与月亮与地球的位置相对应。为了使农历的年份与公历年相对应,农历通过设置闰月的办法使它的平均

38、年长度与公历年相等。农历是中国传统文化的代表之一,并与农业生产联系密切,中国人民特别是广大农民十分熟悉并喜爱农历。公历与农历是我国目前并存的两种历法,各有其固有的规律。农历与月球的运行相对应其影响因素多,它的大小月和闰月与天体运行有关计算十分复杂,且每年都不一致。因此要用单片机实现公历与农历的转换用查表法是最方便实用的办法。51 系列单片机因其在功能上能满足大部份对速度要求不高的应用场合的要求且价格低廉开发工具普及程度高,是目前应用最多的单片机之一。本文介绍一种用51 单片机实现从1901 年到2099 年199 年公历日到农历日及星期的转换方法。3.3.2 基本原理我们可以通过按查表和按年查

39、表的方法,再通过适当的计算,来确定公历日所对应的农历日期。本文采用的是按年查表法,最大限度地减少表格所占的空间。对于农历来说,大月为30天,小月为29天,这是固定不变的,这样我们就可用1个BIT(1位)表示大小月信息。农历一年,如有闰月为13个月,否则是12个月,所以一年需要用13个BIT,闰月在农历中所在的月份并不固定,大部分闰月在农历2-8月,但也有少量年份在9月以后。所以要表示闰月的信息,至少要4BIT,在这里我们用4BIT的值来表示闰月的月份。值为0表示本年没有闰月。有了以上信息,还不足以判断公历日对应的农历日,因为还需要个参照日,我们选用农历正月初一所对应的公历日期作参照日,公历日最

40、大为31日,需要5 BIT来表示,而春节所在的月份不是1月就是2月,用1 BIT就够了,考虑到表达方便,我们用2 BIT的值直接表示月份。这样一年的农历信息只用3个字节就全部包括了。每年对应的3字节数据格式说明如下:第一字节BIT74 位表示闰月月份,值为0为无闰月,BIT30 对应农历第14 月的大小。第二字节BIT7-0 对应农历第512 月大小。第三字节BIT7-7表示农历第13 个月大小,BIT6-5 表示春节的公历月份,BIT40 表示春节的公历日期。月份对应的位为1 表示本农历月大(30 天),为0 表示小(29 天)计算公历对应的农历日期的方法:先计算出公历日离当年元旦的天数,然

41、后查表取得当年的春节日期,计算出春节离元旦的天数,二者相减即可算出公历日离春节的天数,以后只要根据大小月和闰月信息,减月天数,调整农历月份,即可推算出公历日对应的农历日期。如果公历日不到春节日期,农历年要比公历年小一年,农历大小取前一年的信息。农历月从12月向前推算。公历日是非常有规律的,所以公历日所对应的星期天可以通过计算直接得到,理论上公元0年1月1日为星期日,只要求得公历日离公元0年1月1日的天数,除7后的余数就是星期天,为了简化计算,采用月校正法,根据公历的年月日可直接计算出星期天。其算法是:日期+年份+所过闰年数+月较正数之和除7 的余数就是星期天,但如果是在闰年又不到3 月份,上述

42、之和要减一天再除7。其1-12月的校正数为:6,2,2,5,0,3,5,1,4,6,2,4。年份和闰年数只计算1900年以后的年份和闰年数,实际校正数为:0,3,3,6,1,4,6,2,5,0,3,5。举例说明:用查表法得出公历2008年3月9日对应的农历及星期信息。1、查表得2008年的数据为0x09,0x2d,0x47(0000,1001;0010,1100;0100,0111)。该数据表示该年无闰月,农历月的2,3,5,6,8,11,12月为小月29天,1,4,7,9,10月为大月30天。该年春节在公历2月7日。2、 计算公历日(2008年3月9日)离当年元旦的天数:30+29+968。

43、3、 计算春节离元旦的天数:30+737。4、 算出公历日(2008年3月9日)离春节的天数:683731。5、 调整农历月份:因为31301,所以相对应的农历月份是2月,农历日是1+12。6、 计算星期(日期+年份+所过闰年数+月较正数之和除7再求余数):9+(20081900)+(20081900)/4+370综上所述,公历日2008年3月9日对应的是农历2008年2月2日星期天。3.3.3 程序流程图由于星期的计算很简单,这里只提供公农历转换程序设计流程图,如图3.5所示。子程序入口转换数据到HEX格式,方便运算根据公历年,定位数据表的地址从数据表中取得春节的公历日期,并通过计算公历日和春节离元旦的天数算出公历日离春节的天数,记为X农历年公历年减1,数据表地址减3,定位到前一年,取农历信息农历年公历年,取农历月信息公历日在春节以后 否 是 农历月加1,闰月标志F00(非闰月)农历月12,闰月标志F0(非闰月)F0取反取农历月天数Y农历月加1 是 否取农历月天数Y农历月闰月?F01? 是 否F

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号