已閱讀5頁,還剩38頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
多功能萬年歷的設計電子萬年歷主要采用時鐘芯片DSl302設計。通過LCDl602顯示年、月、日、星期、時、分、秒和陰歷月、日,并且能標明是否為閏月。此外還具有調時功能。一、方案實現(xiàn) 1陽歷程序設計因為使用了時鐘芯片Dsl302,陽歷程序只需從I)S1302各寄存器中讀出年、周、月、日、小時、分、秒等數(shù)據(jù),再處理即可。在首次對DSl302進行操作之前,必須對它初始化,然后從DSl302中讀出數(shù)據(jù),再經過處理后,送給顯示緩沖單元。 2陰歷程序設計陰歷程序的實現(xiàn)是要靠陽歷時間來推算的。要根據(jù)陽歷來推算陰歷日期,首先要設計算法。推算方法是,根據(jù)陽歷當前時期在一年中的天數(shù)來計算陰歷日期。陽歷一個月不是30天就是31天(2月除外,閏年2月為29天,平年2月為28天)。陰歷一年是12個月或是13個月(含閏年),一個月為30天或29天。如果把一個只有29天的月稱為小月,用1為標志,把30天的月稱為大月,用0為標志,那么12位二進制就能表示一年12個月的大小。如果有閏月則把閏月的月份作為一個字節(jié)的高4位,低4位表示閏月的大小。大月為0,小月為1,這樣一個字節(jié)就包含了所有閏月信息。陰歷春節(jié)和陽歷元旦相差的天數(shù)也用一個字節(jié)表示??偣灿?個字節(jié)就可以存儲一年中任何一天陽歷和陰歷的對應關系的有關數(shù)據(jù)。例如2006年的陰歷和陽歷對應關系如表1所示。表1 2006年的陰歷和陽歷對應關系表 2006年的春節(jié)和元旦差28天,這樣2006年的信息表示為:28,25 H,04H,71 H。其中表示12個月大小信息的字節(jié),第4位和第7位不用。第1個字節(jié)為十進制,其他的都為十六進制。按此方法,50年的陽歷和陰歷對應關系總共使用200個字節(jié),如下所示。 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,22H,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,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,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)有了算法和數(shù)據(jù)以后,就可以設計軟件了。先要根據(jù)當前陽歷的日期,算出陽歷為該年中的第幾天。圖1為計算陽歷任何一天在該年中為第幾天的程序流程圖。計算出當前陽歷日期為該年中的第幾天后,再減去陽歷該年春節(jié)和元旦的日差。如果夠減則相減的結果就是陰歷在該年中的第幾天了。根據(jù)該數(shù)據(jù)就可以推算出具體的當前陰歷日期。圖1 計算陽歷天數(shù)程序流程圖如果不夠減,則表示當前陰歷年為陽歷的前一年。這種情況下,當前陰歷日期會處于陰歷11月或12月。此時春節(jié)和元旦日差減去前面計算出的當前陽歷日期在陽歷年為第幾天的數(shù)據(jù),其結果表示當前陰歷日期離春節(jié)的天數(shù)。計算出的陽歷天數(shù)為該年的第幾天,存放在寄存器R2和R3中。計算出天數(shù)后,如果大于FFH,則把FFH存放在R2中,余值存放在R3中。也就是說在用寄存器R2和R3表示的天數(shù)信息中,R2充當主寄存器,數(shù)據(jù)先存滿R2,再存R3。在整個轉換過程中,這里面的數(shù)據(jù)不能被覆蓋。 計算出陽歷總天數(shù)后,就可以用它來推算陰歷日期。推算方法是,先用總天數(shù)減去春節(jié)和元旦的日差,如果結果為1,則該天正好是春節(jié)(因為春節(jié)在元旦之后,在計算春節(jié)和元旦日差時,假設元旦為0天,春節(jié)為n天,則日差為n。而前面計算的陽歷總天數(shù)是該天在該年中的第幾天,是以元旦為1而得到的,與計算春節(jié)和元旦日差的這種方法相比,其數(shù)值少了1,所以要在原來應該以0作為該天就是春節(jié)的依據(jù)的基礎上加1,所以以1作為該天是春節(jié)的標志);如果結果小于l,則陰歷為陽歷的前一年;如果結果大于1,說明陽歷和陰歷為同一年。再根據(jù)查表所得的該年的陰歷的閏月和大小月的信息,就可以推算出該天的陰歷日期了。圖2為由總天數(shù)推算出陰歷日期的程序流程圖。圖2推算陰歷日期程序流程圖 3調時設計 程序共設置了6個按鍵,采用查詢方式的獨立式鍵盤,分別為年加1、月加1、天數(shù)加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;uchar time=0,temp_yun;uchar code week_dis=7123456;uchar code lookdis=0123456789;uchar data display=2000.00.00 0;/LCD第一行顯示緩存數(shù)組uchar data xiaohui=00:00:00 00.00;/LCD第二行顯示緩存數(shù)組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,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,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,0x02,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,0x00,22,0x55,0x11,0x30;/2000-2005年的數(shù)據(jù)表#include chu_li.c#include ds1302.c#include lcd1602.c#include 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); /* / 查是否是閏月 /*uchar check_yun() uchar temp; temp=temp_yun; temp=temp4; 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_shu30) /天數(shù)是否大于30, /大于30則減去一月的天數(shù) if(temp_shang&0x40)=0x40)/月小減去29 tian_shu=tian_shu-29; xiaohui11=0; xiaohui12=2; /減去了第一個月的天數(shù),則為二月 else/月大減去30 tian_shu=tian_shu-30; xiaohui11=0; xiaohui12=2; else if(tian_shu29)/天數(shù)等于30 if(temp_shang&0x40)=0x40)/月小減去29 tian_shu=tian_shu-29; xiaohui11=0; xiaohui12=2; else/月大減去30 tian_shu=tian_shu-30; xiaohui11=0; xiaohui12=2; if(tian_shu=0)/天數(shù)等于0,就是前一個月的最后一天 tian_shu=30; flag=0x01; xiaohui11=0; xiaohui12=1; /*減去二月的天數(shù)* if(tian_shu30) /天數(shù)是否大于30, /大于30則減去二月的天數(shù) if(temp_shang&0x20)=0x20) /月小減去29 tian_shu=tian_shu-29; xiaohui11=0; xiaohui12=3; yue=0x03; /標志位,表示為三月 else /月大減去30 tian_shu=tian_shu-30; xiaohui11=0; xiaohui12=3; yue=0x03; else if(tian_shu29)&(flag!=0x01)/flag標志位,flag=0x01為上一個月的最后天 /不能再去減其他月的天數(shù) if(temp_shang&0x20)=0x20)/月小減去29 tian_shu=tian_shu-29; xiaohui11=0; xiaohui12=3; yue=0x03; else /月大減去30 tian_shu=tian_shu-30; xiaohui11=0; xiaohui12=3; if(tian_shu=0) /天數(shù)等于0,就是前一個月的最后一天 tian_shu=30; flag=0x01; xiaohui11=0; xiaohui12=2; /*減去閏二月的天數(shù)* if(temp=0x02)&(yue=0x03)/2月為閏月,標志位yue為0x03 yun_lamp=0;/閏月指示燈亮 xiaohui11=0; xiaohui12=2; if(tian_shu30) 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;/閏月結束了,指示燈滅 else if(tian_shu29)&(flag!=0x01)/天數(shù)等于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=0x01; xiaohui11=0; xiaohui12=2; /*減去三月的天數(shù)* if(tian_shu30) 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_shu29)&(flag!=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; /*減去閏三月的天數(shù)* if(temp=0x03)&(yue=0x04) yun_lamp=0; xiaohui11=0; xiaohui12=3; if(tian_shu30) 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; else if(tian_shu29)&(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=0; xiaohui12=3; /*減去四月的天數(shù)* if(tian_shu30) 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_shu29)&(flag!=0x01) 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; if(tian_shu=0) tian_shu=30; flag=0x01; xiaohui11=0; xiaohui12=4; /*減去閏四月的天數(shù)* if(temp=0x04)&(yue=0x05) yun_lamp=0; xiaohui11=0; xiaohui12=4; if(tian_shu30) 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_shu29)&(flag!=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; /*減去五月的天數(shù)* if(tian_shu30) 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_shu29)&(flag!=0x01) if(temp_shang&0x02)=0x02) tian_shu=tian_shu-29; xiaohui11=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; /*減去閏五月的天數(shù)* if(temp=0x05)&(yue=0x06) yun_lamp=0; xiaohui11=0; xiaohui12=5; if(tian_shu30) 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_shu29)&(flag!=0x01) 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; if(tian_shu=0) tian_shu=30; flag=0x01; xiaohui11=0; xiaohui12=5; /*減去六月的天數(shù)* if(tian_shu30) if(temp_shang&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_shu29)&(flag!=0x01) if(temp_shang&0x01)=0x01) tian_shu=tian_shu-29; xiaohui11=0; xiaohui12=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; /*減去閏六月的天數(shù)* if(temp=0x06)&(yue=0x07) yun_lamp=0; xiaohui11=0; xiaohui12=6; if(tian_shu30) 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_shu29)&(flag!=0x01) if(temp_yun&0x0f)=0x01) tian_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; /*減去七月的天數(shù)* if(tian_shu30) 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_shu29)&(flag!=0x01) 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; if(tian_shu=0) tian_shu=30; flag=0x01; xiaohui11=0; xiaohui12=7; /*減去閏七月的天數(shù)* if(temp=0x07)&(yue=0x08) yun_lamp=0; xiaohui11=0; xiaohui12=7; if(tian_shu30) 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_shu29)&(flag!=0x01) 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; if(tian_shu=0) tian_shu=30; flag=0x01; xiaohui11=0; xiaohui12=7; /*減去八月的天數(shù)* if(tian_shu30) if(temp_xia&0x20)=0x20) tian_shu=tian_shu-29; xiaohui11=0; xiaohui12=9; yue=0x09; else tian_shu=tian_shu-30; xiaohui11=0; xiaohui12=9; yue=0x09; else if(tian_shu29)&(flag!=0x01) if(temp_xia&0x20)=0x20) tian_shu=tian_shu-29; xiaohui11=0; xiaohui12=9; yue=0x09; else tian_shu=tian_shu-30; xiaohui11=0; xiaohui12=9; if(tian_shu=0) tian_shu=30; flag=0x01; xiaohui11=0; xiaohui12=8; /*減去閏八月的天數(shù)* if(temp=0x08)&(yue=0x09) yun_lamp=0; xiaohui11=0; xiaohui12=8; if(tian_shu30) 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;y
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人教版八年級物理下冊《7.3重力》同步測試題含答案
- 蘇教版一年級上學期語文教案
- 浙江省2024年初中學業(yè)水平考試模擬試卷數(shù)學附答案
- 可持續(xù)發(fā)展視角下的綠色餐飲營銷
- 高一化學鞏固練習:配制一定物質的量濃度的溶液基礎
- 2024高中地理第2章區(qū)域可持續(xù)發(fā)展第3節(jié)流域綜合治理與開發(fā)-以田納西河流域為例學案湘教版必修3
- 2024高中語文第5單元莊子蚜第4課尊生練習含解析新人教版選修先秦諸子蚜
- 2024高中語文第六單元文無定格貴在鮮活第30課自主賞析子路曾皙冉有公西華侍坐課時作業(yè)含解析新人教版選修中國古代詩歌散文欣賞
- 2024高考化學一輪復習專練34金屬的腐蝕與防護含解析新人教版
- 2024高考化學一輪復習第一部分考點22化學反應速率及其影響因素強化訓練含解析
- 常用靜脈藥物溶媒的選擇
- 當代西方文學理論知到智慧樹章節(jié)測試課后答案2024年秋武漢科技大學
- 2024年預制混凝土制品購銷協(xié)議3篇
- 2024-2030年中國高端私人會所市場競爭格局及投資經營管理分析報告
- GA/T 1003-2024銀行自助服務亭技術規(guī)范
- 《消防設備操作使用》培訓
- 新交際英語(2024)一年級上冊Unit 1~6全冊教案
- 2024年度跨境電商平臺運營與孵化合同
- 2024年電動汽車充電消費者研究報告-2024-11-新能源
- 湖北省黃岡高級中學2025屆物理高一第一學期期末考試試題含解析
- 氧氣吸入法操作并發(fā)癥預防及處理規(guī)范草稿
評論
0/150
提交評論