0 引言
在由單片機(jī)和PC 機(jī)構(gòu)成的檢測系統(tǒng)中,,通常會由多個單片機(jī)采集數(shù)據(jù)并將經(jīng)過A/D 轉(zhuǎn)換的數(shù)據(jù)通過串口送往上位PC 機(jī)進(jìn)行數(shù)據(jù)處理,。PIC 單片機(jī)A/D 轉(zhuǎn)換后的結(jié)果大多是8 位或10位的,8 位的A/D轉(zhuǎn)換不涉及該問題,。以10 位的數(shù)據(jù)為例,,在單片機(jī)內(nèi)進(jìn)行存儲時需要占用2 個8 位的字節(jié),低8 位和高2位分別存儲在2 個字節(jié)中,,但是用于存儲高位數(shù)據(jù)的8 位寬的RAM 單元中僅有2 位是有效數(shù)據(jù),。
單片機(jī)的存儲空間有限,以單片機(jī)為例,,RAM 數(shù)據(jù)存儲器按功能分為通用寄存器和特殊功能寄存器兩個部分,,除去特殊功能寄存器外,僅有368個8 位寬的RAM 單元,,單片機(jī)能夠存儲的數(shù)據(jù)量很有限,。假設(shè)將每次A/D 轉(zhuǎn)換的數(shù)據(jù)直接存儲,每個數(shù)據(jù)都要占用2 個字節(jié),,理想狀態(tài)下也只能存儲184個數(shù)據(jù); 假設(shè)需要存儲100個A/D 轉(zhuǎn)換的數(shù)據(jù),,就要占用200個字節(jié)的單元,這樣的存儲方式并未將單片機(jī)的存儲空間充分利用,,同時,,如果將A/D 轉(zhuǎn)換后的數(shù)據(jù)通過串口直接上傳,串口就要向上傳送200 幀的數(shù)據(jù),,有效傳輸速率比較低,,沒有充分利用數(shù)據(jù)幀中的數(shù)據(jù)位。為此,,本文提出如下方法將A/D 轉(zhuǎn)換后的數(shù)據(jù)先進(jìn)行處理后再存儲或上傳,。
1 程序設(shè)計思路
以10 位的A/D 轉(zhuǎn)換為例,,可以將A/D 轉(zhuǎn)換的結(jié)果暫存在a[size] 中,然后把數(shù)組a 中的數(shù)據(jù)一位一位地取出,,把低8 位和高8 位拆開分別存放,,低8 位存放在數(shù)組b 中,高8 位存放在數(shù)組c 中,,由于高8 位的數(shù)據(jù)中只有2 位是有效數(shù)據(jù),,我們可以把有效數(shù)據(jù)取出組合成一個新的數(shù)據(jù)存放,當(dāng)上傳數(shù)據(jù)后再用相反的方法解碼,,把數(shù)據(jù)恢復(fù)到原先的狀態(tài),。這樣對于10 位的A/D 轉(zhuǎn)換來說可以節(jié)省3/8 的空間,需要向上位機(jī)傳送的數(shù)據(jù)也會比較少,,數(shù)據(jù)傳輸時間僅為原來的5/8,。
2 采用C 語言編寫的程序
本文采用PIC16F877單片機(jī)進(jìn)行試驗。其中定義i,、h,、j、n,、m 為int8,,a[size] 為int16 的數(shù)組,用于暫存A/D 轉(zhuǎn)換的結(jié)果; b[number],、c[number],、d[number] 是int8 的數(shù)組。程序原文如下:
程序首先利用一個for 循環(huán)將A/D 轉(zhuǎn)換后的數(shù)據(jù)拆開,,將低8 位存放在數(shù)組b 中,,高2 位暫時存放在數(shù)組c 中。由于數(shù)組c 中的8 位二進(jìn)制數(shù)據(jù)都是僅有低2 位是有效數(shù)據(jù),,所以第二個for 循環(huán)將c[i],、c[i+1]、c[i+2],、c[i+3]中的2 位有效數(shù)據(jù)取出,,按照由低到高的順序重新組合成一個8 位的二進(jìn)制數(shù),放入數(shù)組d,,構(gòu)成一個新的數(shù)組,。這樣A/D 轉(zhuǎn)換結(jié)果由原來用數(shù)組a 表示變成了由數(shù)組b 表示低8 位、數(shù)組d 表示高2 位的狀態(tài),。
程序中的h,、j、n、m 用于記錄最后轉(zhuǎn)換的數(shù)據(jù)存儲在數(shù)組的位置,,在下一次轉(zhuǎn)換的時候,數(shù)據(jù)可以接在上一次的數(shù)據(jù)后面,,n 和j 在主程序中cONvert ( ) 被調(diào)用之前首先被賦值為0,。
3 結(jié)論
根據(jù)以上程序,我們可以按照類似的方法把12位的A/D 轉(zhuǎn)化結(jié)果進(jìn)行組合,,將12 位的A/D 轉(zhuǎn)換結(jié)果拆成低8 位和高4 位,,再將2 個高4 位重新組合成一個8 位的二進(jìn)制數(shù)存儲,這樣對于12 位的A/D 轉(zhuǎn)化結(jié)果可以節(jié)省1/4 存儲空間,,縮短1/4 傳輸時間,。
該程序的執(zhí)行時間僅為990us,相對于數(shù)據(jù)的傳輸時間是很小的,。在單片機(jī)空間小的情況下,,以程序的執(zhí)行時間來換取單片機(jī)的存儲空間是值得的。同時又能有效地縮短數(shù)據(jù)的上傳時間,,提高有效數(shù)據(jù)的傳輸速率,。但是在數(shù)據(jù)量較少的時候,比如只有1 個A/D 轉(zhuǎn)換的數(shù)據(jù),,這樣做反而會耗費時間,、降低效率。