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