利用華邦四位機(jī)實(shí)現(xiàn)帶農(nóng)歷24節(jié)氣萬年歷的低成本設(shè)計(jì)
[摘要]: 本文描述了一種利用華邦四位機(jī)來設(shè)計(jì)帶有農(nóng)歷24節(jié)氣的萬年歷的設(shè)計(jì)方法,同時(shí)對(duì)于其中軟件的算法和硬件的電路設(shè)計(jì)進(jìn)行了計(jì)算和分析。
[關(guān)鍵字]:節(jié)氣, 列表法, 微處理器, 單片機(jī), 算法
在當(dāng)前的產(chǎn)品設(shè)計(jì)中,人們?cè)谧非螽a(chǎn)品高性能的同時(shí),也在追求產(chǎn)品的低成本。這就對(duì)開發(fā)工程師提出了更高的要求。
對(duì)于萬年歷的產(chǎn)品市場上已經(jīng)有了很多,但是帶有農(nóng)歷24節(jié)氣,同時(shí)用LED數(shù)碼管顯示的萬年歷在市場上的銷售價(jià)明顯偏高,究其原因是因?yàn)槿绻麑⑥r(nóng)歷24節(jié)氣設(shè)計(jì)加入其中,就要增加軟件程序,這樣就會(huì)使相應(yīng)的程序存貯空間加大,自然硬件成本就會(huì)隨之增加。所以,最好可以找到一種既可以實(shí)現(xiàn)其功能,又可以節(jié)約成本的單片機(jī)來實(shí)現(xiàn)。
以下就是豐寶電子科技公司開發(fā)部門研發(fā)出的一種只是利用的華邦的四位機(jī)就可以實(shí)現(xiàn)的帶有農(nóng)歷24節(jié)氣的萬年歷的產(chǎn)品設(shè)計(jì)思路,由于用的是4位機(jī),它的ROM空間和RAM空間比起8位機(jī)就少得多,這樣對(duì)軟件的設(shè)計(jì)提出了更高的要求,要求能夠找到適合4位機(jī)上使用的簡易算法。
對(duì)于陽歷農(nóng)歷的算法比較簡單,而且規(guī)律很容易找到。這里就不再贅述。我們這里重點(diǎn)討論一下對(duì)于農(nóng)歷中二十四個(gè)節(jié)氣的算法。還考慮到單片機(jī)的性能情況和萬年歷的使用壽命,我們?cè)O(shè)計(jì)的是有限年(如50年)萬年歷,因此這里我們的算法也是按著50年為年限來設(shè)計(jì)。
一、萬年歷農(nóng)歷節(jié)氣算法:
為了便于考察50年的無規(guī)律的農(nóng)歷節(jié)氣分布時(shí)間,我們利用C語言在計(jì)算機(jī)中,實(shí)現(xiàn)了50年(2000~2049年)的陽歷和農(nóng)歷節(jié)氣分布時(shí)間表。由于數(shù)據(jù)龐大,所以僅僅列出其中部分陽歷年對(duì)應(yīng)的前6個(gè)節(jié)氣日期,簡表見表1。
這張復(fù)雜冗長的節(jié)氣表中,每年的節(jié)氣具體日期雖然都在一定的范圍內(nèi)變動(dòng),但是變動(dòng)的趨勢(shì)毫無規(guī)律可尋,每個(gè)月的具體節(jié)氣日期有時(shí)候推前一兩天,有時(shí)候推后一兩天。
但是,從這張復(fù)雜的表格中的眾多數(shù)據(jù)中,我們發(fā)現(xiàn)這樣一個(gè)規(guī)律:雖然,這些節(jié)氣的日期變化趨勢(shì)無法獲得,但是,這些日期的變化總是在3天之內(nèi)變化的。
表格1、陽歷年中農(nóng)歷節(jié)氣日期表
年月 |
1 |
2 |
3 |
4~12 |
2000 |
6 21 |
4 19 |
5 20 |
上半月節(jié)氣日期 下半月節(jié)氣日期 |
⋯⋯ |
⋯⋯ | |||
2043 |
5 20 |
4 19 |
6 21 |
上半月節(jié)氣日期 下半月節(jié)氣日期 |
2044 |
6 20 |
4 19 |
5 20 |
上半月節(jié)氣日期 下半月節(jié)氣日期 |
2045 |
5 20 |
3 18 |
5 20 |
上半月節(jié)氣日期 下半月節(jié)氣日期 |
⋯⋯ |
⋯⋯ | |||
2049 |
5 19 |
3 18 |
5 20 |
上半月節(jié)氣日期 下半月節(jié)氣日期 |
例如:每年的第一個(gè)節(jié)氣(小寒)出現(xiàn)的1月的5日,6日兩天中的某一天;每年的第二個(gè)節(jié)氣(大寒)出現(xiàn)在1月的20日,21日,19日三天中的某一天。
這樣,我們只要固定每個(gè)節(jié)氣的基本日期,然后專門針對(duì)這兩三天編制一個(gè)相對(duì)日期的表格就可以了??紤]到最多變化范圍是3天,所以這個(gè)相對(duì)日期可以取值為1、0和-1。
我們選定的基本日期如下:
一月到三月的節(jié)氣基本日期: 6/20 、4/19、 6/21;
四月到六月的節(jié)氣基本日期: 5/20 、6/21、 6/21;
六月到九月的節(jié)氣基本日期: 7/23 、8/23、 8/23;
十月到十二月的節(jié)氣基本日期:8/24 、8/22、 7/22;
根據(jù)以上的思想,我們得到了下面的表格2。
并且,仔細(xì)觀察表2,我們還可以得到以下關(guān)于節(jié)氣日期相對(duì)值的規(guī)律性結(jié)論:
1、 只有以下四個(gè)節(jié)氣(2、12、19、22)同時(shí)出現(xiàn)三個(gè)相對(duì)值(1,-1和0)的情況。
2、 其它的20個(gè)節(jié)氣中僅僅出現(xiàn)了0和-1這兩個(gè)相對(duì)值。
3、 在有三個(gè)相對(duì)值的四個(gè)節(jié)氣(2、12、19、22)中,2044年以前,出現(xiàn)的非零相對(duì)值都是1;而2044年以及2044年以后,出現(xiàn)的非零相對(duì)值都是-1;
表格2、陽歷年中農(nóng)歷節(jié)氣日期固定日期和相對(duì)值表
陰歷 節(jié)氣 |
1 2 |
3 4 |
5 6 |
7~23 8-24 |
陽歷 年月 |
1 |
2 |
3 |
4~12 |
基本 日期 |
6 20 |
4 19 |
6 21 |
上半月節(jié)氣日期固定值 下半月節(jié)氣日期固定值 |
2000 |
0 1 |
0 0 |
-1 -1 |
上半月節(jié)氣日期相對(duì)值 下半月節(jié)氣日期相對(duì)值 |
⋯⋯ |
⋯⋯ | |||
2043 |
-1 0 |
0 0 |
0 0 |
上半月節(jié)氣日期相對(duì)值 下半月節(jié)氣日期相對(duì)值 |
2044 |
0 0 |
0 0 |
-1 -1 |
上半月節(jié)氣日期相對(duì)值 下半月節(jié)氣日期相對(duì)值 |
2045 |
-1 0 |
-1 -1 |
-1 -1 |
上半月節(jié)氣日期相對(duì)值 下半月節(jié)氣日期相對(duì)值 |
⋯⋯ |
⋯⋯ | |||
2049 |
-1 -1 |
-1 -1 |
-1 -1 |
上半月節(jié)氣日期 下半月節(jié)氣日期 |
也就是說在50年內(nèi),大寒(2)、夏至(12)、寒露(19)和小雪(22)這四個(gè)節(jié)氣日期變化相對(duì)較多,一共有3天,它們的日期相對(duì)值可能需要使用三個(gè)狀態(tài)值來表示。
下面是以上三條農(nóng)歷節(jié)氣日期規(guī)律的相對(duì)值分布簡圖。
圖1、農(nóng)歷節(jié)氣日期相對(duì)值分布簡圖
根據(jù)表格2和圖1所示意的農(nóng)歷節(jié)氣日期排布規(guī)律和形式,我們就可以構(gòu)造一個(gè)表格,并且結(jié)合相應(yīng)的算法來計(jì)算某個(gè)陽歷日期所對(duì)應(yīng)的陰歷節(jié)氣了。
利用上節(jié)分析結(jié)果,我們?cè)O(shè)想使用最少的字節(jié)來編制一個(gè)表格,使得它包含了50年內(nèi)的所有相對(duì)值分布信息。由于一年包含農(nóng)歷的24個(gè)節(jié)氣,也就是說共有24個(gè)日期相對(duì)值狀態(tài)量。
為了能夠盡量減少存儲(chǔ)空間,我們使用一個(gè)位來代表一個(gè)農(nóng)歷的節(jié)氣日期相對(duì)值。這樣1年的24個(gè)節(jié)氣就可以用24個(gè)位來表示,也就是3個(gè)字節(jié)(每個(gè)字節(jié)8個(gè)位)表示。
由于農(nóng)歷節(jié)氣日期相對(duì)值最多有三種狀態(tài):-1、0和1,而一個(gè)位僅僅有2種狀態(tài):0和1,為了能夠把3種狀態(tài)融合進(jìn)兩種狀態(tài)中 ,我們根據(jù)上節(jié)中節(jié)氣日期相對(duì)值的規(guī)律性結(jié)論,采取了具有條件的二值狀態(tài)來表示三值狀態(tài),制定了如下的編碼規(guī)則:
表格3、位狀態(tài)編碼規(guī)則
位值 |
節(jié)氣日期相對(duì)值 |
備注 |
0 |
0 |
適合于表格的50年所有節(jié)氣 |
1 |
1 |
適合于2044年以前的2、12、19、22四個(gè)節(jié)氣 |
-1 |
2044年和其后的2、12、19、22四個(gè)節(jié)氣 以及其它20個(gè)節(jié)氣 |
利用以上的規(guī)則我們就可以對(duì)于50年的24個(gè)節(jié)氣進(jìn)行編碼,得到如下的編碼表:
表格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 |
由此看出,使用這種編碼的方式對(duì)農(nóng)歷日期相對(duì)值進(jìn)行編碼方法,一年的24個(gè)節(jié)氣的日期只需要3個(gè)字節(jié)表示就可以明確表示了。50年的節(jié)氣表,只需要150個(gè)字節(jié)的存儲(chǔ)空間。年份越多,這種編碼發(fā)方式能夠節(jié)約的存儲(chǔ)空間越大,優(yōu)勢(shì)越明顯。
二、萬年歷的硬件實(shí)現(xiàn)
我們使用的單片機(jī)是華邦公司的四位機(jī)。這種單片機(jī)的結(jié)構(gòu)跟8位機(jī)的類似,雖然它的功能不如8位單片機(jī)。但是,它具有結(jié)構(gòu)簡單、成本低的優(yōu)勢(shì),同時(shí)還包括了普通單片機(jī)的基本功能。它包含了128個(gè)字節(jié)的RAM,2k的ROM,定時(shí)器,外部中斷,內(nèi)部中斷,此外,還有省電功能和驅(qū)動(dòng)LED的功能。下圖就是利用華邦四位機(jī)W741E260實(shí)現(xiàn)萬年歷功能的原理框圖,
其中,對(duì)于陽歷日期,農(nóng)歷日期的顯示,是利用LED數(shù)碼顯示來實(shí)現(xiàn),而對(duì)于二十四節(jié)氣則是利用24個(gè)發(fā)光二極管,在制做外觀模具時(shí),可以將二十四節(jié)氣標(biāo)志在外觀模具上,如果到了相對(duì)應(yīng)的節(jié)氣,相應(yīng)的發(fā)光二極管就會(huì)點(diǎn)亮。
利用了此方案實(shí)現(xiàn) ,就用一個(gè)華邦的4位機(jī),硬件成本就可以大大降低。
三、萬年歷的軟件實(shí)現(xiàn)
由于萬年歷的其它的功能程序已經(jīng)占用了較大的存儲(chǔ)空間。所以能夠用于農(nóng)歷節(jié)氣查詢的程序的空間不大,僅僅有0.5k的容量。也就是說表格和查表程序一共只有0.5k的空間,表格占用的空間越大,可寫程序的空間就越小。
如果使用把50年農(nóng)歷24節(jié)氣日期表格1,僅僅表格就需要使用50
c語言相關(guān)文章:c語言教程
評(píng)論