[摘要]: 本文描述了一種利用華邦四位機來設計帶有農曆24節氣的萬年曆的設計方法,同時對於其中軟體的算法和硬體的電路設計進行了計算和分析。
[關鍵字]:節氣, 列表法, 微處理器, 單片機, 算法
在當前的產品設計中,人們在追求產品高性能的同時,也在追求產品的低成本。這就對開發工程師提出了更高的要求。
對於萬年曆的產品市場上已經有了很多,但是帶有農曆24節氣,同時用LED數碼管顯示的萬年曆在市場上的銷售價明顯偏高,究其原因是因為如果將農曆24節氣設計加入其中,就要增加軟體程序,這樣就會使相應的程序存貯空間加大,自然硬體成本就會隨之增加。所以,最好可以找到一種既可以實現其功能,又可以節約成本的單片機來實現。
以下就是豐寶電子科技公司開發部門研發出的一種只是利用的華邦的四位機就可以實現的帶有農曆24節氣的萬年曆的產品設計思路,由於用的是4位機,它的ROM空間和RAM空間比起8位機就少得多,這樣對軟體的設計提出了更高的要求,要求能夠找到適合4位機上使用的簡易算法。
對於陽曆農曆的算法比較簡單,而且規律很容易找到。這裡就不再贅述。我們這裡重點討論一下對於農曆中二十四個節氣的算法。還考慮到單片機的性能情況和萬年曆的使用壽命,我們設計的是有限年(如50年)萬年曆,因此這裡我們的算法也是按著50年為年限來設計。
一、萬年曆農曆節氣算法:
為了便於考察50年的無規律的農曆節氣分布時間,我們利用C語言在計算機中,實現了50年(2000~2049年)的陽曆和農曆節氣分布時間表。由於數據龐大,所以僅僅列出其中部分陽曆年對應的前6個節氣日期,簡表見表1。
這張複雜冗長的節氣表中,每年的節氣具體日期雖然都在一定的範圍內變動,但是變動的趨勢毫無規律可尋,每個月的具體節氣日期有時候推前一兩天,有時候推後一兩天。
但是,從這張複雜的表格中的眾多數據中,我們發現這樣一個規律:雖然,這些節氣的日期變化趨勢無法獲得,但是,這些日期的變化總是在3天之內變化的。
表格1、陽曆年中農曆節氣日期表
年\月 | 1 | 2 | 3 | 4~12 |
2000 | 6 21 | 4 19 | 5 20 | 上半月節氣日期 下半月節氣日期 |
⋯⋯ | ⋯⋯ | |||
2043 | 5 20 | 4 19 | 6 21 | 上半月節氣日期 下半月節氣日期 |
2044 | 6 20 | 4 19 | 5 20 | 上半月節氣日期 下半月節氣日期 |
2045 | 5 20 | 3 18 | 5 20 | 上半月節氣日期 下半月節氣日期 |
⋯⋯ | ⋯⋯ | |||
2049 | 5 19 | 3 18 | 5 20 | 上半月節氣日期 下半月節氣日期 |
這樣,我們只要固定每個節氣的基本日期,然後專門針對這兩三天編制一個相對日期的表格就可以了。考慮到最多變化範圍是3天,所以這個相對日期可以取值為1、0和-1。
我們選定的基本日期如下:
一月到三月的節氣基本日期: 6/20 、4/19、 6/21;
四月到六月的節氣基本日期: 5/20 、6/21、 6/21;
六月到九月的節氣基本日期: 7/23 、8/23、 8/23;
十月到十二月的節氣基本日期:8/24 、8/22、 7/22;
根據以上的思想,我們得到了下面的表格2。
並且,仔細觀察表2,我們還可以得到以下關於節氣日期相對值的規律性結論:
1、 只有以下四個節氣(2、12、19、22)同時出現三個相對值(1,-1和0)的情況。
2、 其它的20個節氣中僅僅出現了0和-1這兩個相對值。
3、 在有三個相對值的四個節氣(2、12、19、22)中,2044年以前,出現的非零相對值都是1;而2044年以及2044年以後,出現的非零相對值都是-1;
表格2、陽曆年中農曆節氣日期固定日期和相對值表
陰曆 節氣 | 1 2 | 3 4 | 5 6 | 7~23 8-24 |
陽曆 年\月 | 1 | 2 | 3 | 4~12 |
基本 日期 | 6 20 | 4 19 | 6 21 | 上半月節氣日期固定值 下半月節氣日期固定值 |
2000 | 0 1 | 0 0 | -1 -1 | 上半月節氣日期相對值 下半月節氣日期相對值 |
⋯⋯ | ⋯⋯ | |||
2043 | -1 0 | 0 0 | 0 0 | 上半月節氣日期相對值 下半月節氣日期相對值 |
2044 | 0 0 | 0 0 | -1 -1 | 上半月節氣日期相對值 下半月節氣日期相對值 |
2045 | -1 0 | -1 -1 | -1 -1 | 上半月節氣日期相對值 下半月節氣日期相對值 |
⋯⋯ | ⋯⋯ | |||
2049 | -1 -1 | -1 -1 | -1 -1 | 上半月節氣日期 下半月節氣日期 |
也就是說在50年內,大寒(2)、夏至(12)、寒露(19)和小雪(22)這四個節氣日期變化相對較多,一共有3天,它們的日期相對值可能需要使用三個狀態值來表示。
下面是以上三條農曆節氣日期規律的相對值分布簡圖。
圖1、農曆節氣日期相對值分布簡圖
根據表格2和圖1所示意的農曆節氣日期排布規律和形式,我們就可以構造一個表格,並且結合相應的算法來計算某個陽曆日期所對應的陰曆節氣了。
利用上節分析結果,我們設想使用最少的字節來編制一個表格,使得它包含了50年內的所有相對值分布信息。由於一年包含農曆的24個節氣,也就是說共有24個日期相對值狀態量。
為了能夠儘量減少存儲空間,我們使用一個位來代表一個農曆的節氣日期相對值。這樣1年的24個節氣就可以用24個位來表示,也就是3個字節(每個字節8個位)表示。
由於農曆節氣日期相對值最多有三種狀態:-1、0和1,而一個位僅僅有2種狀態:0和1,為了能夠把3種狀態融合進兩種狀態中 ,我們根據上節中節氣日期相對值的規律性結論,採取了具有條件的二值狀態來表示三值狀態,制定了如下的編碼規則:
表格3、位狀態編碼規則
位值 | 節氣日期相對值 | 備註 |
0 | 0 | 適合於表格的50年所有節氣 |
1 | 1 | 適合於2044年以前的2、12、19、22四個節氣 |
-1 | 2044年和其後的2、12、19、22四個節氣 以及其它20個節氣 |
利用以上的規則我們就可以對於50年的24個節氣進行編碼,得到如下的編碼表:
表格4、最終的編碼表
年份 | LBA表值 |
2000 | 4E A6 99 |
2001 |
9C A2 98 |
2002 |
80 00 18 |
2003 | 00 10 24 |
⋯⋯ | ⋯⋯ |
2042 | 9E A2 98 |
2043 | 80 82 18 |
2044 | 0F EF FB |
2045 | BF E6 D9 |
2046 | 9E A6 98 |
2047 | 80 82 18 |
2048 | 0F FF FF |
2049 | FC EF D9 |
由此看出,使用這種編碼的方式對農曆日期相對值進行編碼方法,一年的24個節氣的日期只需要3個字節表示就可以明確表示了。50年的節氣表,只需要150個字節的存儲空間。年份越多,這種編碼發方式能夠節約的存儲空間越大,優勢越明顯。
二、萬年曆的硬體實現
我們使用的單片機是華邦公司的四位機。這種單片機的結構跟8位機的類似,雖然它的功能不如8位單片機。但是,它具有結構簡單、成本低的優勢,同時還包括了普通單片機的基本功能。它包含了128個字節的RAM,2k的ROM,定時器,外部中斷,內部中斷,此外,還有省電功能和驅動LED的功能。下圖就是利用華邦四位機W741E260實現萬年曆功能的原理框圖,
其中,對於陽曆日期,農曆日期的顯示,是利用LED數碼顯示來實現,而對於二十四節氣則是利用24個發光二極體,在製做外觀模具時,可以將二十四節氣標誌在外觀模具上,如果到了相對應的節氣,相應的發光二極體就會點亮。
利用了此方案實現 ,就用一個華邦的4位機,硬體成本就可以大大降低。
三、萬年曆的軟體實現
由於萬年曆的其它的功能程序已經佔用了較大的存儲空間。所以能夠用於農曆節氣查詢的程序的空間不大,僅僅有0.5k的容量。也就是說表格和查表程序一共只有0.5k的空間,表格佔用的空間越大,可寫程序的空間就越小。
如果使用把50年農曆24節氣日期表格1,僅僅表格就需要使用50