多功能万年历的设计(2011).doc

上传人:灯火****19 文档编号:136883680 上传时间:2020-07-03 格式:DOC 页数:43 大小:236KB
返回 下载 相关 举报
多功能万年历的设计(2011).doc_第1页
第1页 / 共43页
多功能万年历的设计(2011).doc_第2页
第2页 / 共43页
多功能万年历的设计(2011).doc_第3页
第3页 / 共43页
多功能万年历的设计(2011).doc_第4页
第4页 / 共43页
多功能万年历的设计(2011).doc_第5页
第5页 / 共43页
点击查看更多>>
资源描述

《多功能万年历的设计(2011).doc》由会员分享,可在线阅读,更多相关《多功能万年历的设计(2011).doc(43页珍藏版)》请在金锄头文库上搜索。

1、多功能万年历的设计电子万年历主要采用时钟芯片DSl302设计。通过LCDl602显示年、月、日、星期、时、分、秒和阴历月、日,并且能标明是否为闰月。此外还具有调时功能。一、方案实现 1阳历程序设计因为使用了时钟芯片Dsl302,阳历程序只需从I)S1302各寄存器中读出年、周、月、日、小时、分、秒等数据,再处理即可。在首次对DSl302进行操作之前,必须对它初始化,然后从DSl302中读出数据,再经过处理后,送给显示缓冲单元。 2阴历程序设计阴历程序的实现是要靠阳历时间来推算的。要根据阳历来推算阴历日期,首先要设计算法。推算方法是,根据阳历当前时期在一年中的天数来计算阴历日期。阳历一个月不是3

2、0天就是31天(2月除外,闰年2月为29天,平年2月为28天)。阴历一年是12个月或是13个月(含闰年),一个月为30天或29天。如果把一个只有29天的月称为小月,用1为标志,把30天的月称为大月,用0为标志,那么12位二进制就能表示一年12个月的大小。如果有闰月则把闰月的月份作为一个字节的高4位,低4位表示闰月的大小。大月为0,小月为1,这样一个字节就包含了所有闰月信息。阴历春节和阳历元旦相差的天数也用一个字节表示。总共用4个字节就可以存储一年中任何一天阳历和阴历的对应关系的有关数据。例如2006年的阴历和阳历对应关系如表1所示。表1 2006年的阴历和阳历对应关系表 2006年的春节和元旦

3、差28天,这样2006年的信息表示为:28,25 H,04H,71 H。其中表示12个月大小信息的字节,第4位和第7位不用。第1个字节为十进制,其他的都为十六进制。按此方法,50年的阳历和阴历对应关系总共使用200个字节,如下所示。 20002050年的关系表: 3515H,51H,00H(2000)23,11H,52H,41H(2001)42,12H,65H,00H(2002) 311lH32H,00H(2003)21,42H,52H,21H(2004)39,52H,25H,00H(2005) 2825H。04H,7lH(2006)48,66H,42H,00H(2007) 37,33H,22

4、H,00H(2008) 2515H24H,51H(2009)44,25H,52H,00H(2010)33,22H,65H,00H(2011) 22。2lH,25H,41H(2012)40,24H,52H,00H(2013)30,52H,42H,91H(2014) 4955H05H,00H(2015)38,26H,44H,00H(2016)27,53H,50H,60H(2017) 4653H,24H,00H(2018)35,25H,54H,00H(2019)24,41H,52H,41H(2020) 4245H,25H,00H(2021)31,24H,52H,00H(2022)21,51H,12H

5、,21H(2023) 4055H11H。00H(2024)28,26H,21H,61H(2025)47,26H,61H,00H(2026) 3613H。31H,00H(2027)25,05H,31H,51H(2028)43,12H,54H,00H(2029) 335lH,25H,00H(2030)22,42H,25H,31H(2031)41,32H,22H,00H(2032) 3055H。02H,71H(2033)49,55H,22H,00H(2034)38,26H,62H,00H(2035) 2713H,64H,60H(2036)45,13H,32H,00H(2037)34,12H,55H,

6、00H(2038) 2310H,53H,5lH(2039)42,22H,45H,00H(2040) 31,52H,22H,00H(2041) 2152H。44H,21H(2042)40,55H,44H,00H(2043)29,26H,50H,71H(2044) 4726H,64H,00H(2045)36,25H,32H,00H(2046)25,23H,32H,50H(2047) 4444H,55H,00H(2048)32,24H,45H,00H(2049)22,55H,11H,30H(2050)有了算法和数据以后,就可以设计软件了。先要根据当前阳历的日期,算出阳历为该年中的第几天。图1为计算阳

7、历任何一天在该年中为第几天的程序流程图。计算出当前阳历日期为该年中的第几天后,再减去阳历该年春节和元旦的日差。如果够减则相减的结果就是阴历在该年中的第几天了。根据该数据就可以推算出具体的当前阴历日期。图1 计算阳历天数程序流程图如果不够减,则表示当前阴历年为阳历的前一年。这种情况下,当前阴历日期会处于阴历11月或12月。此时春节和元旦日差减去前面计算出的当前阳历日期在阳历年为第几天的数据,其结果表示当前阴历日期离春节的天数。计算出的阳历天数为该年的第几天,存放在寄存器R2和R3中。计算出天数后,如果大于FFH,则把FFH存放在R2中,余值存放在R3中。也就是说在用寄存器R2和R3表示的天数信息

8、中,R2充当主寄存器,数据先存满R2,再存R3。在整个转换过程中,这里面的数据不能被覆盖。 计算出阳历总天数后,就可以用它来推算阴历日期。推算方法是,先用总天数减去春节和元旦的日差,如果结果为1,则该天正好是春节(因为春节在元旦之后,在计算春节和元旦日差时,假设元旦为0天,春节为n天,则日差为n。而前面计算的阳历总天数是该天在该年中的第几天,是以元旦为1而得到的,与计算春节和元旦日差的这种方法相比,其数值少了1,所以要在原来应该以0作为该天就是春节的依据的基础上加1,所以以1作为该天是春节的标志);如果结果小于l,则阴历为阳历的前一年;如果结果大于1,说明阳历和阴历为同一年。再根据查表所得的该

9、年的阴历的闰月和大小月的信息,就可以推算出该天的阴历日期了。图2为由总天数推算出阴历日期的程序流程图。图2推算阴历日期程序流程图 3调时设计 程序共设置了6个按键,采用查询方式的独立式键盘,分别为年加1、月加1、天数加1、 星期加l、小时加1、分钟加l。二、硬件电路设计 图3 电路设计原理图三、参考程序设计:#include#include#include#define uchar unsigned char#define uint unsigned intsbit yun_lamp=P07;/闰月指示灯uchar year,month,week,day,hour,mintue,second;

10、uchar time=0,temp_yun;uchar code week_dis=7123456;uchar code lookdis=0123456789;uchar data display=2000.00.00 0;/LCD第一行显示缓存数组uchar data xiaohui=00:00:00 00.00;/LCD第二行显示缓存数组uchar code date_data= 35,0x15,0x51,0x00,23,0x11,0x52,0x41,42,0x12,0x65,0x00, 31,0x11,0x32,0x00,21,0x42,0x52,0x21,39,0x52,0x25,0x

11、00, 28,0x25,0x04,0x71,48,0x66,0x42,0x00,37,0x33,0x22,0x00, 25,0x15,0x24,0x51,44,0x25,0x52,0x00,33,0x22,0x65,0x00, 22,0x21,0x25,0x41,40,0x24,0x52,0x00,30,0x52,0x42,0x91, 49,0x55,0x05,0x00,38,0x26,0x44,0x00,27,0x53,0x50,0x60, 46,0x53,0x24,0x00,35,0x25,0x54,0x00,24,0x41,0x52,0x41, 42,0x45,0x25,0x00,31,

12、0x24,0x52,0x00,21,0x51,0x12,0x21, 40,0x55,0x11,0x00,28,0x26,0x21,0x61,47,0x26,0x61,0x00, 36,0x13,0x31,0x00,25,0x05,0x31,0x51,43,0x12,0x54,0x00, 33,0x51,0x25,0x00,22,0x42,0x25,0x31,41,0x32,0x22,0x00, 30,0x55,0x02,0x71,49,0x55,0x22,0x00,38,0x26,0x62,0x00, 27,0x13,0x64,0x60,45,0x13,0x32,0x00,34,0x12,0x

13、55,0x00, 23,0x10,0x53,0x51,42,0x22,0x45,0x00,31,0x52,0x22,0x00, 21,0x52,0x44,0x21,40,0x55,0x44,0x00,29,0x26,0x50,0x71, 47,0x26,0x64,0x00,36,0x25,0x32,0x00,25,0x23,0x32,0x50, 44,0x44,0x55,0x00,32,0x24,0x45,0x00,22,0x55,0x11,0x30;/2000-2005年的数据表#include chu_li.c#include ds1302.c#include lcd1602.c#incl

14、ude key_board.cvoid main() TMOD=0x01; /定时器初始化 TH0=0x3c; TL0=0xb0; IE=0x82; init_lcd1602();/初始化显示器 init_ds1302();/初始化DS1302 while(1) ds1302(); display1602();gengxin(); display1602();key_scan(); void t0_time() interrupt 1 TH0=0x3c; TL0=0xb0; time+; if(time=15) time=0;/*/ BCD码转为十进制/*uint bcd_10(uint temp) uint temp1; temp1=temp&0x0f; temp=temp4; temp=(temp&0x0f)*10)+temp1; return(temp);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号