多功能萬年歷的設計_第1頁
多功能萬年歷的設計_第2頁
多功能萬年歷的設計_第3頁
多功能萬年歷的設計_第4頁
多功能萬年歷的設計_第5頁
已閱讀5頁,還剩38頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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<reg51.h>#include<intrins.h>#include<absacc.h>#define uchar unsigned char#define uint unsigned intsbit yun_lamp=P07;/閏月

10、指示燈uchar year,month,week,day,hour,mintue,second;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,0

11、x00,23,0x11,0x52,0x41,42,0x12,0x65,0x00, 31,0x11,0x32,0x00,21,0x42,0x52,0x21,39,0x52,0x25,0x00, 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,

12、0x53,0x50,0x60, 46,0x53,0x24,0x00,35,0x25,0x54,0x00,24,0x41,0x52,0x41, 42,0x45,0x25,0x00,31,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,0

13、x02,0x71,49,0x55,0x22,0x00,38,0x26,0x62,0x00, 27,0x13,0x64,0x60,45,0x13,0x32,0x00,34,0x12,0x55,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,0x0

14、0,22,0x55,0x11,0x30;/2000-2005年的數據表#include "chu_li.c"#include "ds1302.c"#include "lcd1602.c"#include "key_board.c"void main() TMOD=0x01; /定時器初始化 TH0=0x3c; TL0=0xb0; IE=0x82; init_lcd1602();/初始化顯示器 init_ds1302();/初始化DS1302 while(1) ds1302(); display1602();geng

15、xin(); 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=temp>>4; temp=(temp&0x0f)*10)+temp1; return(temp); /* / 查是否是閏月 /*uchar check_yun() uchar temp; temp=temp_yun

16、; temp=temp>>4; temp=temp&0x0f; return(temp);/*/ 農歷與公歷為同一年,計算農歷/*void new(uchar temp_shang,uchar temp_xia,uint tian_shu) uchar temp,flag,yue; temp=check_yun(); xiaohui11='0'/首先置01月,農歷月的高位 xiaohui12='1'/農歷月的低位 if(tian_shu>30) /天數是否大于30, /大于30則減去一月的天數 if(temp_shang&0x4

17、0)=0x40)/月小減去29 tian_shu=tian_shu-29; xiaohui11='0' xiaohui12='2' /減去了第一個月的天數,則為二月 else/月大減去30 tian_shu=tian_shu-30; xiaohui11='0' xiaohui12='2' else if(tian_shu>29)/天數等于30 if(temp_shang&0x40)=0x40)/月小減去29 tian_shu=tian_shu-29; xiaohui11='0' xiaohui12=&

18、#39;2' else/月大減去30 tian_shu=tian_shu-30; xiaohui11='0' xiaohui12='2' if(tian_shu=0)/天數等于0,就是前一個月的最后一天 tian_shu=30; flag=0x01; xiaohui11='0' xiaohui12='1' /*減去二月的天數* if(tian_shu>30) /天數是否大于30, /大于30則減去二月的天數 if(temp_shang&0x20)=0x20) /月小減去29 tian_shu=tian_shu

19、-29; xiaohui11='0' xiaohui12='3' yue=0x03; /標志位,表示為三月 else /月大減去30 tian_shu=tian_shu-30; xiaohui11='0' xiaohui12='3' yue=0x03; else if(tian_shu>29)&&(flag!=0x01)/flag標志位,flag=0x01為上一個月的最后天 /不能再去減其他月的天數 if(temp_shang&0x20)=0x20)/月小減去29 tian_shu=tian_shu-

20、29; xiaohui11='0' xiaohui12='3' yue=0x03; else /月大減去30 tian_shu=tian_shu-30; xiaohui11='0' xiaohui12='3' if(tian_shu=0) /天數等于0,就是前一個月的最后一天 tian_shu=30; flag=0x01; xiaohui11='0' xiaohui12='2' /*減去閏二月的天數* if(temp=0x02)&&(yue=0x03)/2月為閏月,標志位yue為0x

21、03 yun_lamp=0;/閏月指示燈亮 xiaohui11='0' xiaohui12='2' if(tian_shu>30) if(temp_yun&0x0f)=0x01)/月小減去29 tian_shu=tian_shu-29; xiaohui11='0' xiaohui12='3' yun_lamp=1; /閏月結束了,指示燈滅 else /月大減去30 tian_shu=tian_shu-30; xiaohui11='0' xiaohui12='3'yun_lamp=1;/

22、閏月結束了,指示燈滅 else if(tian_shu>29)&&(flag!=0x01)/天數等于30,并且不為某月的最后一天 if(temp_yun&0x0f)=0x01) tian_shu=tian_shu-29; xiaohui11='0' xiaohui12='3' yun_lamp=1; else tian_shu=tian_shu-30; xiaohui11='0' xiaohui12='3' yun_lamp=1; if(tian_shu=0) tian_shu=30; flag=0x

23、01; xiaohui11='0' xiaohui12='2' /*減去三月的天數* if(tian_shu>30) if(temp_shang&0x10)=0x10) tian_shu=tian_shu-29; xiaohui11='0' xiaohui12='4' yue=0x04; else tian_shu=tian_shu-30; xiaohui11='0' xiaohui12='4' yue=0x04; else if(tian_shu>29)&&(f

24、lag!=0x01) if(temp_shang&0x10)=0x10) tian_shu=tian_shu-29; xiaohui11='0' xiaohui12='4' yue=0x04; else /if(temp_shang&0x10)!=0x10) tian_shu=tian_shu-30; xiaohui11='0' xiaohui12='4' if(tian_shu=0) tian_shu=30; flag=0x01; xiaohui11='0' xiaohui12='3

25、9; /*減去閏三月的天數* if(temp=0x03)&&(yue=0x04) yun_lamp=0; xiaohui11='0' xiaohui12='3' if(tian_shu>30) if(temp_yun&0x0f)=0x01) tian_shu=tian_shu-29; xiaohui11='0' xiaohui12='4' yun_lamp=1; else tian_shu=tian_shu-30; xiaohui11='0' xiaohui12='4'

26、yun_lamp=1; else if(tian_shu>29)&&(flag!=0x01) if(temp_yun&0x0f)=0x01) tian_shu=tian_shu-29; xiaohui11='0' xiaohui12='4' yun_lamp=1; else tian_shu=tian_shu-30; xiaohui11='0' xiaohui12='4' yun_lamp=1; if(tian_shu=0) tian_shu=30; flag=0x01; xiaohui11='

27、;0' xiaohui12='3' /*減去四月的天數* if(tian_shu>30) if(temp_shang&0x04)=0x04) tian_shu=tian_shu-29; xiaohui11='0' xiaohui12='5' yue=0x05; else tian_shu=tian_shu-30; xiaohui11='0' xiaohui12='5' yue=0x05; else if(tian_shu>29)&&(flag!=0x01) if(temp

28、_shang&0x04)=0x04) tian_shu=tian_shu-29; xiaohui11='0' xiaohui12='5' yue=0x05; else tian_shu=tian_shu-30; xiaohui11='0' xiaohui12='5' if(tian_shu=0) tian_shu=30; flag=0x01; xiaohui11='0' xiaohui12='4' /*減去閏四月的天數* if(temp=0x04)&&(yue=0x05) y

29、un_lamp=0; xiaohui11='0' xiaohui12='4' if(tian_shu>30) if(temp_yun&0x0f)=0x01) tian_shu=tian_shu-29; xiaohui11='0' xiaohui12='5' yun_lamp=1; else tian_shu=tian_shu-30; xiaohui11='0' xiaohui12='5'yun_lamp=1; else if(tian_shu>29)&&(flag

30、!=0x01) if(temp_yun&0x0f)=0x01) tian_shu=tian_shu-29; xiaohui11='0' xiaohui12='5' yun_lamp=1; else tian_shu=tian_shu-30; xiaohui11='0' xiaohui12='5' yun_lamp=1; if(tian_shu=0) tian_shu=30; flag=0x01; xiaohui11='0' xiaohui12='4' /*減去五月的天數* if(tian_s

31、hu>30) if(temp_shang&0x02)=0x02) tian_shu=tian_shu-29; xiaohui11='0' xiaohui12='6' yue=0x06; else tian_shu=tian_shu-30; xiaohui11='0' xiaohui12='6' yue=0x06; else if(tian_shu>29)&&(flag!=0x01) if(temp_shang&0x02)=0x02) tian_shu=tian_shu-29; xiaoh

32、ui11='0' xiaohui12='6' yue=0x06; else if(temp_shang&0x02)!=0x02) tian_shu=tian_shu-30; xiaohui11='0' xiaohui12='6' if(tian_shu=0) tian_shu=30; flag=0x01; xiaohui11='0' xiaohui12='5' /*減去閏五月的天數* if(temp=0x05)&&(yue=0x06) yun_lamp=0; xiaohui1

33、1='0' xiaohui12='5' if(tian_shu>30) if(temp_yun&0x0f)=0x01) tian_shu=tian_shu-29; xiaohui11='0' xiaohui12='6' yun_lamp=1; else tian_shu=tian_shu-30; xiaohui11='0' xiaohui12='6'yun_lamp=1; else if(tian_shu>29)&&(flag!=0x01) if(temp_yun

34、&0x0f)=0x01) tian_shu=tian_shu-29; xiaohui11='0' xiaohui12='6' yun_lamp=1; else tian_shu=tian_shu-30; xiaohui11='0' xiaohui12='6' yun_lamp=1; if(tian_shu=0) tian_shu=30; flag=0x01; xiaohui11='0' xiaohui12='5' /*減去六月的天數* if(tian_shu>30) if(temp_s

35、hang&0x01)=0x01) tian_shu=tian_shu-29; xiaohui11='0' xiaohui12='7' yue=0x07; else tian_shu=tian_shu-30; xiaohui11='0' xiaohui12='7' yue=0x07; else if(tian_shu>29)&&(flag!=0x01) if(temp_shang&0x01)=0x01) tian_shu=tian_shu-29; xiaohui11='0' xi

36、aohui12='7' yue=0x07; else if(temp_shang&0x01)!=0x01) tian_shu=tian_shu-30; xiaohui11='0' xiaohui12='7' if(tian_shu=0) tian_shu=30; flag=0x01; xiaohui11='0' xiaohui12='6' /*減去閏六月的天數* if(temp=0x06)&&(yue=0x07) yun_lamp=0; xiaohui11='0' xiaoh

37、ui12='6' if(tian_shu>30) if(temp_yun&0x0f)=0x01) tian_shu=tian_shu-29; xiaohui11='0' xiaohui12='7' yun_lamp=1; else tian_shu=tian_shu-30; xiaohui11='0' xiaohui12='7'yun_lamp=1; else if(tian_shu>29)&&(flag!=0x01) if(temp_yun&0x0f)=0x01) ti

38、an_shu=tian_shu-29; xiaohui11='0' xiaohui12='7' yun_lamp=1; else if(temp_yun&0x0f)=0x00) tian_shu=tian_shu-30; xiaohui11='0' xiaohui12='7' yun_lamp=1; if(tian_shu=0) tian_shu=30; flag=0x01; xiaohui11='0' xiaohui12='6' /*減去七月的天數* if(tian_shu>30)

39、if(temp_xia&0x40)=0x40) tian_shu=tian_shu-29; xiaohui11='0' xiaohui12='8' yue=0x08; else tian_shu=tian_shu-30; xiaohui11='0' xiaohui12='8' yue=0x08; else if(tian_shu>29)&&(flag!=0x01) if(temp_xia&0x40)=0x40) tian_shu=tian_shu-29; xiaohui11='0

40、9; xiaohui12='8' yue=0x08; else tian_shu=tian_shu-30; xiaohui11='0' xiaohui12='8' if(tian_shu=0) tian_shu=30; flag=0x01; xiaohui11='0' xiaohui12='7' /*減去閏七月的天數* if(temp=0x07)&&(yue=0x08) yun_lamp=0; xiaohui11='0' xiaohui12='7' if(tian_s

41、hu>30) if(temp_yun&0x0f)=0x01) tian_shu=tian_shu-29; xiaohui11='0' xiaohui12='8' yun_lamp=1; else tian_shu=tian_shu-30; xiaohui11='0' xiaohui12='8'yun_lamp=1; else if(tian_shu>29)&&(flag!=0x01) if(temp_yun&0x0f)=0x01) tian_shu=tian_shu-29; xiaohu

42、i11='0' xiaohui12='8' yun_lamp=1; else tian_shu=tian_shu-30; xiaohui11='0' xiaohui12='8' yun_lamp=1; if(tian_shu=0) tian_shu=30; flag=0x01; xiaohui11='0' xiaohui12='7' /*減去八月的天數* if(tian_shu>30) if(temp_xia&0x20)=0x20) tian_shu=tian_shu-29; xiao

43、hui11='0' xiaohui12='9' yue=0x09; else tian_shu=tian_shu-30; xiaohui11='0' xiaohui12='9' yue=0x09; else if(tian_shu>29)&&(flag!=0x01) if(temp_xia&0x20)=0x20) tian_shu=tian_shu-29; xiaohui11='0' xiaohui12='9' yue=0x09; else tian_shu=tian_

44、shu-30; xiaohui11='0' xiaohui12='9' if(tian_shu=0) tian_shu=30; flag=0x01; xiaohui11='0' xiaohui12='8' /*減去閏八月的天數* if(temp=0x08)&&(yue=0x09) yun_lamp=0; xiaohui11='0' xiaohui12='8' if(tian_shu>30) if(temp_yun&0x0f)=0x01) tian_shu=tian_shu-29; xiaohui11='0' xiaohui12='9' yun_lamp=1; else tian_shu=tian_shu-30; xiaohui11='0' xiaohui12='9'yun_lamp=1; else if(tian_shu>29)&&(flag!=0x01) if(temp_yun&0x0f)=0x01) tian_shu=tian_shu-29; xiaohui1

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論