|
我參考這個(gè)界面用ESP-12F模塊聯(lián)網(wǎng),用ARDUINO拼湊了一個(gè)程序,但是農(nóng)歷遲了一天,不明白是怎么計(jì)算的不好查錯(cuò),特意百度了一下,找到下面的介紹,特意貼出來(lái)大家一起學(xué)習(xí)。
公歷是全世界通用的歷法以地球繞太陽(yáng)的一周為一年一年365 天分為12 個(gè)月1 3 5 7 8 10 12 月為
31 天2 月為28 天其余月份為30 天事實(shí)上地球繞太陽(yáng)一周共365 天5 小時(shí)48 分46 秒比公歷一年多出5 小時(shí)48
分46 秒為使年誤差不累積公歷年用閏年法來(lái)消除年誤差 由于每年多出5 小時(shí)48 分46 秒每4 年累計(jì)多出23
小時(shí)15 分4 秒接近1 天天文學(xué)家就規(guī)定每4 年有一個(gè)閏年把2 月由28 天改為29 天凡是公歷年代能被4 整除
的那一年就是閏年但是這樣一來(lái)每4 年又少了44 分56 秒為了更準(zhǔn)確地計(jì)時(shí)天文學(xué)家又規(guī)定凡能被100 整除
的年份只有能被400 整除才是閏年即每400 年要減掉3 個(gè)閏年經(jīng)過(guò)這樣處理后實(shí)際上每400 年的誤差只有2 小時(shí)
53 分20 秒已相當(dāng)準(zhǔn)確了
農(nóng)歷與公歷不同農(nóng)歷把月亮繞地球一周作為一月因?yàn)樵铝晾@地球一周不是一整天所以農(nóng)歷把月分為大月和小
月大月30 天小月29 天通過(guò)設(shè)置大小月使農(nóng)歷日始終與月亮與地球的位置相對(duì)應(yīng)為了使農(nóng)歷的年份與公歷年
相對(duì)應(yīng)農(nóng)歷通過(guò)設(shè)置閏月的辦法使它的平均年長(zhǎng)度與公歷年相等農(nóng)歷是中國(guó)傳統(tǒng)文化的代表之一并與農(nóng)業(yè)生產(chǎn)聯(lián)
系密切中國(guó)人民特別是廣大農(nóng)民十分熟悉并喜愛(ài)農(nóng)歷
公歷與農(nóng)歷是我國(guó)目前并存的兩種歷法各有其固有的規(guī)律農(nóng)歷與月球的運(yùn)行相對(duì)應(yīng)其影響因素多它的大小
月和閏月與天體運(yùn)行有關(guān)計(jì)算十分復(fù)雜且每年都不一致因此要用單片機(jī)實(shí)現(xiàn)公歷與農(nóng)歷的轉(zhuǎn)換用查表法是最方
便實(shí)用的辦法
51 系列單片機(jī)因其在功能上能滿足大部份對(duì)速度要求不高的應(yīng)用場(chǎng)合的要求且價(jià)格低廉開(kāi)發(fā)工具普及程度高
是目前應(yīng)用最多的單片機(jī)之一本文介紹一種用51 單片機(jī)實(shí)現(xiàn)從1901 年到2099 年2199 年公歷日到農(nóng)歷日及星期
的轉(zhuǎn)換方法并向讀者提供完整的51C程序
二 基本原理
實(shí)現(xiàn)公歷與農(nóng)歷的轉(zhuǎn)換一般采用查表法按日查表是速度最快的方法但51 單片機(jī)尋址能力有限不可能采用
按日查表的方法除按日查外我們可以通過(guò)按月查表和按年查表的方法再通過(guò)適當(dāng)?shù)挠?jì)算來(lái)確定公歷日所對(duì)應(yīng)的
農(nóng)歷日期本文采用的是按年查表法最大限度地減少表格所占的程序空間
對(duì)于農(nóng)歷月來(lái)說(shuō)大月為30 天小月為29 天這是固定不變的這樣我們就可用1 個(gè)BIT 位來(lái)表示大小月信
息農(nóng)歷一年如有閏月為13 個(gè)月否則是12 個(gè)月所以一年需要用13 個(gè)BIT 閏月在農(nóng)歷年中所在的月份并不固定
大部分閏月分布在農(nóng)歷2 8 月但也有少量年份在9 月以后所以要表示閏月的信息至少要4BIT 在這里我們用4BIT
的值來(lái)表示閏月的月份值為0 表示本年沒(méi)有閏月有了以上信息還不足以判斷公歷日對(duì)應(yīng)的農(nóng)歷日因?yàn)檫需要一
個(gè)參照日我們選用農(nóng)歷正月初一所對(duì)應(yīng)的公歷日期作參照日公歷日最大為31 日需要5BIT 來(lái)表示而春節(jié)所在的
月份不是1 月就是2 月用1BIT 就夠了考慮到表達(dá)方便我們用2BIT 來(lái)表示春節(jié)月2BIT 的值直接表示月份這
樣一年的農(nóng)歷信息只用3 個(gè)字節(jié)就全部包括了
計(jì)算公歷日對(duì)應(yīng)的農(nóng)歷日期的方法先計(jì)算出公歷日離當(dāng)年元旦的天數(shù)然后查表取得當(dāng)年的春節(jié)日期計(jì)算出春
節(jié)離元旦的天數(shù)二者相減即可算出公歷日離春節(jié)的天數(shù)以后只要根據(jù)大小月和閏月信息減一月天數(shù)調(diào)整一月農(nóng)
歷月份即可推算出公歷日所對(duì)應(yīng)的農(nóng)歷日期如公歷日不到春節(jié)日期農(nóng)歷年要比公歷年小一年農(nóng)歷大小月取前一
年的信息農(nóng)歷月從12 月向前推算
公歷日是非常有規(guī)律的所以公歷日所對(duì)應(yīng)的星期天可以通過(guò)計(jì)算直接得到理論上公元0 年1 月1 日為星期日
只要求得公歷日離公元0 年1 月1 日的日子數(shù)除7 后的余數(shù)就是星期天為了簡(jiǎn)化計(jì)算采用月校正法根據(jù)公歷的
年月日可直接計(jì)算出星期天其算法是日期年份所過(guò)閏年數(shù)月校正數(shù)之和除7 的余數(shù)就是星期天但如果是在
閏年又不到3 月份上述之和要減一天再除7 其1 12 月的校正數(shù)據(jù)為6 2 2 5 0 3 5 1 4 6 2 4 在
本程序中采用1 個(gè)字節(jié)表示年份閏年數(shù)也只計(jì)算1900 年以后的閏年數(shù)所以實(shí)際校正數(shù)據(jù)也和上述數(shù)據(jù)不同
公歷年對(duì)應(yīng)的農(nóng)歷數(shù)據(jù),每年三字節(jié),
格式第一字節(jié)BIT7-4 位表示閏月月份,值為0 為無(wú)閏月,BIT3-0 對(duì)應(yīng)農(nóng)歷第1-4 月的大小
第二字節(jié)BIT7-0 對(duì)應(yīng)農(nóng)歷第5-12 月大小,第三字節(jié)BIT7 表示農(nóng)歷第13 個(gè)月大小
月份對(duì)應(yīng)的位為1 表示本農(nóng)歷月大(30 天),為0 表示小(29 天)
第三字節(jié)BIT6-5 表示春節(jié)的公歷月份,BIT4-0 表示春節(jié)的公歷日期 |
|