利用華邦四位機實現帶農歷24節氣萬年歷的低成本設計
[摘要]: 本文描述了一種利用華邦四位機來設計帶有農歷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 |
上半月節氣日期 下半月節氣日期 |
例如:每年的第一個節氣(小寒)出現的1月的5日,6日兩天中的某一天;每年的第二個節氣(大寒)出現在1月的20日,21日,19日三天中的某一天。
這樣,我們只要固定每個節氣的基本日期,然后專門針對這兩三天編制一個相對日期的表格就可以了。考慮到最多變化范圍是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
c語言相關文章:c語言教程
評論