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