舒玉坤
(湖北師范大學(xué) 物理與電子科學(xué)學(xué)院,湖北 黃石 435002)
稱重技術(shù)作為一種計(jì)量手段,廣泛應(yīng)用于各種場合,有利于生產(chǎn)自動(dòng)化,有利于提高勞動(dòng)生產(chǎn)效率[1]。在眾多的微型控制器中,51單片機(jī)尤其是STC89C52單片機(jī)以其操作簡單、功能豐富、編程語言通俗易懂等優(yōu)勢(shì)得到廣泛的應(yīng)用,在物聯(lián)網(wǎng)、智能終端產(chǎn)品的開發(fā)中也有著舉足輕重的地位,而PC機(jī)發(fā)展快,功能強(qiáng)大,將二者借助WiFi互聯(lián),可實(shí)現(xiàn)遠(yuǎn)程終端控制,充分發(fā)揮各自的優(yōu)勢(shì)[2~3]。
本設(shè)計(jì)主要由STC89C52單片機(jī)、壓力檢測傳輸模塊、LCD1602液晶顯示模塊、按鍵模塊、無線傳輸模塊等組成。以單片機(jī)作為核心進(jìn)行邏輯控制,壓力檢測模塊對(duì)壓力進(jìn)行檢測,由于檢測出來的信號(hào)比較微小,所以將檢測后的信息經(jīng)過運(yùn)算放大電路處理后發(fā)送至數(shù)模轉(zhuǎn)換芯片,經(jīng)過整合處理和AD采集后送給單片機(jī),再將數(shù)據(jù)整理分析后傳輸?shù)揭壕э@示模塊并將所測得的數(shù)據(jù)顯示出來,同時(shí)用無線傳輸模塊傳輸?shù)诫娔X或手機(jī)上。系統(tǒng)設(shè)計(jì)如圖1.

圖1 系統(tǒng)設(shè)計(jì)
Altium Designer是原Protel軟件開發(fā)商Altium公司推出的電子電路開發(fā)系統(tǒng)。本設(shè)計(jì)是基于單片機(jī)壓力計(jì)的設(shè)計(jì)與實(shí)現(xiàn),其中最為核心的是微處理器STC89C52,它是一種帶8K字節(jié)FLASH存儲(chǔ)器的低電壓、高性能CMOS 8位微處理器,俗稱單片機(jī)。使用C語言進(jìn)行開發(fā),所采用的開發(fā)平臺(tái)Keil5,兼容了多種功能,包括項(xiàng)目的編輯、程序的調(diào)試、編譯、微處理器讀寫文件(hex文件)的生成等[4~5]。
在硬件中使用到的核心是微處理器芯片STC89C52,本系統(tǒng)采用最小系統(tǒng)作為核心,再輔助其他檢測元件進(jìn)行數(shù)據(jù)的采集,借助顯示單元實(shí)現(xiàn)人機(jī)交互,借助其他的電路元件邏輯控制。根據(jù)壓力計(jì)所需要的功能進(jìn)行分析,最終確定硬件模塊的組成,包括LCD1602液晶顯示模塊、壓力檢測傳輸模塊、STC89C52單片機(jī)、無線傳輸模塊。壓力數(shù)據(jù)采集單元需要將采集的數(shù)據(jù)傳輸給單片機(jī)顯示,且通過模塊無線傳輸?shù)絇C機(jī),通過PC機(jī)的串口接收后,在PC機(jī)上顯示[6]。
常用的傳感器有兩種,一種是壓電傳感器,又稱自發(fā)電式傳感器,一種是電阻應(yīng)變式傳感器,它利用電阻應(yīng)變效應(yīng),將各種力學(xué)量轉(zhuǎn)換為電信號(hào)。通過對(duì)壓力傳感器與電阻應(yīng)變式傳感器比較分析,選擇電阻應(yīng)變式傳感器。稱重范圍0~5 kg,誤差不大于±0.005 kg,量程為5 kg,精度為0.01%.
壓力檢測模塊分為壓力傳感器部分和放大采樣傳輸部分,利用電阻應(yīng)變效應(yīng),將力學(xué)量轉(zhuǎn)換為電信號(hào)[7]。此傳感器滿量程時(shí),輸出的電壓信號(hào)5 mV,對(duì)單片機(jī)來說太微小了,所以需要先對(duì)其進(jìn)行放大,而HX711則具備此功能,它內(nèi)部的A輸入通道,可以將模擬輸入信號(hào)放大128倍,然后采樣輸出24 bit AD轉(zhuǎn)換值,單片機(jī)可以根據(jù)指定時(shí)序?qū)?4 bit數(shù)據(jù)讀出。HX711內(nèi)部的穩(wěn)壓電源,可以直接向外部傳感器和芯片內(nèi)的A/D 轉(zhuǎn)換器提供電源,芯片內(nèi)的時(shí)鐘振蕩器有上電自動(dòng)復(fù)位功能[8],24 bit HX711驅(qū)動(dòng)程序如下:
sbit ADDO = P1^3;
sbit ADSK = P0^1;
unsigned long ReadCount(void)
{ unsigned long Count;
unsigned char i;
ADSK=0; //使能AD(PD_SCK 置低)
Count=0;
while(ADDO); //AD轉(zhuǎn)換未結(jié)束等待,否則開始讀取
for (i=0;i<24;i++)
{
ADSK=1;
Count = Count<<1; //下降沿時(shí)Count左移一位
ADSK=0;
If (ADDO) Count++;
}
ASDK=1;
Count=Count^0x800000; //第25個(gè)脈沖下降沿轉(zhuǎn)換數(shù)據(jù)
ADSK=0;
return(Count);
}
HX711與傳感器、電阻、電容、接線原理如圖2.

圖2 HX711接線原理圖
不同的傳感器有不同的稱重范圍,為了有效保護(hù)傳感器,提高系統(tǒng)的安全性,在系統(tǒng)中設(shè)計(jì)了報(bào)警指示電路。報(bào)警指示電路由三極管8550、蜂鳴器、電阻等實(shí)現(xiàn),通過單片機(jī)I/O口控制8550,當(dāng)單片機(jī)的I/O口輸出低電平時(shí),8550導(dǎo)通,蜂鳴器通電發(fā)出報(bào)警聲,當(dāng)單片機(jī)I/O口輸出高電平時(shí),8550截止,蜂鳴器停止報(bào)警。
按鍵輸入電路用來在電子稱測量過程中輸入單價(jià)值,按鍵輸入電路采用4*4矩陣鍵盤,采用“行掃描法”實(shí)現(xiàn)。首先確定鍵盤是否有按鍵,將Y0-Y3置低電平,然后檢測列線的狀態(tài)。一個(gè)列的電平表示在鍵盤按下了一個(gè)鍵,而關(guān)閉的鍵位于四個(gè)按鈕中的一個(gè)按鈕上,在這個(gè)按鈕上,低電平線跨越了四行。如果所有的列線都是高電平,鍵盤就沒有按鍵了。系統(tǒng)開機(jī)檢測托盤重量,并將托盤重量清零,即每次開機(jī)后檢測托盤重量,程序自動(dòng)將托盤重量保存在一個(gè)變量中,稱量過程中每次都將獲得的重量減去托盤重量,而得到所要稱量物體的真正的重量。在正確輸入了單價(jià)之后,按下計(jì)算按鍵,將會(huì)計(jì)算出金額,并在液晶顯示器上顯示出重量、單價(jià)、總價(jià)。
在硬件設(shè)備的開發(fā)中,借助無線傳輸模塊實(shí)現(xiàn)單片機(jī)與PC計(jì)算機(jī)的數(shù)據(jù)通訊,而在使用的過程中需要借助處理芯片串口實(shí)現(xiàn)數(shù)據(jù)的收發(fā),該無線傳輸模塊內(nèi)嵌了IEEE802.11b.g.n協(xié)議棧和能夠進(jìn)行數(shù)據(jù)網(wǎng)絡(luò)傳輸?shù)膮f(xié)議,即TCP/IP協(xié)議棧。在設(shè)計(jì)中,采用無線模塊,實(shí)現(xiàn)數(shù)據(jù)的收發(fā)[9~11]。無線傳輸模塊的STATE是連接狀態(tài)引腳,未使用該引腳。RXD為串口輸入引腳,需與單片機(jī)模塊TXD引腳相連;TXD為串口輸出腳,需與單片機(jī)RXD引腳相連。GND和VCC分別為地引腳和電源引腳。EN為空引腳,不使用。
在Protues仿真軟件中,使用Virtual Terminal(虛擬終端),此模塊的協(xié)議與本文使用的協(xié)議一致,所以能在Virtual Terminal上顯示出所需要傳輸給計(jì)算機(jī)的數(shù)據(jù)[12]。
該單片機(jī)壓力計(jì),以程序的布局、構(gòu)架和實(shí)現(xiàn)的方式進(jìn)行程序的編寫,進(jìn)而實(shí)現(xiàn)相關(guān)的功能。在程序語言的選擇上,可供選擇的語言有C語言和匯編語言,開發(fā)中選用了較為簡便的C語言進(jìn)行程序框架的設(shè)計(jì)和邏輯語言的編輯[13]。
分析元器件后繪制原理圖,再根據(jù)原理圖,分析需要用STC89C52的哪些寄存器,逐步完成寄存器的調(diào)用,完成傳感器程序的邏輯開發(fā),完成環(huán)境參數(shù)數(shù)據(jù)的采集,在main()主函數(shù)中執(zhí)行和調(diào)用,達(dá)到預(yù)期的功能。在控制硬件所需要的程序開發(fā)中,將所需要的功能一一實(shí)現(xiàn)后,再統(tǒng)一調(diào)試,避免程序中出現(xiàn)錯(cuò)誤現(xiàn)象。而實(shí)現(xiàn)數(shù)據(jù)的發(fā)送環(huán)節(jié),借助串口調(diào)試軟件,檢測數(shù)據(jù)是否通過串口發(fā)送出去。按照C51開發(fā)的邏輯將程序編譯后,轉(zhuǎn)換為單片機(jī)可執(zhí)行的hex文件,再通過串口進(jìn)行程序的燒錄,將所需要的驅(qū)動(dòng)安裝完成之后,借助仿真器(STC-ISP)將程序及時(shí)燒錄入芯片之中。
系統(tǒng)采用HX711壓力傳感器測量壓力,該模塊能夠在較短的時(shí)間內(nèi)進(jìn)行壓力數(shù)據(jù)的讀取,當(dāng)模塊接收到壓力數(shù)據(jù)后,把數(shù)據(jù)放入內(nèi)置的數(shù)據(jù)存儲(chǔ)單元,然后根據(jù)具體需求進(jìn)行數(shù)據(jù)的讀取。在將24 bit數(shù)據(jù)通過串口傳輸給單片機(jī),單片機(jī)內(nèi)部讀取數(shù)據(jù)時(shí),需要了解HX711傳輸數(shù)據(jù)的協(xié)議才能準(zhǔn)確無誤的獲得傳感器的數(shù)據(jù)。為此,需要了解HX711芯片數(shù)據(jù)傳輸?shù)臅r(shí)序圖,才能正確讀取數(shù)據(jù),串口通訊線由管腳PD_SCK和DOUT組成,其中PD_SCK為斷電和串口時(shí)鐘輸入,DOUT為數(shù)據(jù)輸出。HX711從復(fù)位狀態(tài)進(jìn)入正常工作狀態(tài),通道A和增益128會(huì)被自動(dòng)選擇作為第一次 A/D 轉(zhuǎn)換的輸入通道和增益,為了保證串口通訊正常進(jìn)行,PD_SCK應(yīng)在25~27之間。當(dāng) A/D 轉(zhuǎn)換器的輸入通道或增益改變時(shí),DOUT 在4個(gè)數(shù)據(jù)輸出周期后,從高電平變低電平達(dá)到穩(wěn)定,輸出有效數(shù)據(jù)[7~8]。HX711數(shù)據(jù)輸出時(shí)序如圖3.

圖3 HX711數(shù)據(jù)輸出時(shí)序
AD數(shù)據(jù)的轉(zhuǎn)換已經(jīng)由HX711來完成,所以輸入到單片機(jī)的信號(hào)是24 bit的數(shù)字信號(hào),可以直接進(jìn)行調(diào)用。開中斷獲取經(jīng)過HX711放大和AD轉(zhuǎn)換后的數(shù)據(jù),數(shù)據(jù)無誤后關(guān)中斷,按鍵掃描,若去皮按鍵按下,則保存此時(shí)重量,輸出重量需要用實(shí)際重量減去保存的重量,若未按下,則輸出重量直接等于實(shí)際重量,再將輸出重量進(jìn)行顯示。
Windows Sockets 是 Microsoft Windows的網(wǎng)絡(luò)程序接口。套接字(Socket)是應(yīng)用層與TCP/IP協(xié)議族通信的中間抽象層,它把復(fù)雜的 TCP/IP協(xié)議族隱藏在Socket接口的背后,通過Socket函數(shù)調(diào)用符合指定協(xié)議的數(shù)據(jù),一個(gè)套接字只能與同一區(qū)域內(nèi)的套接字交換數(shù)據(jù)。TCP/IP提供了流式套接字(SOCK_STREAM)、數(shù)據(jù)報(bào)套接字(SOCK _DGRAM)、原始套接字(SOCK _RAW),不論什么套接字,實(shí)際網(wǎng)絡(luò)編程一般采用C/S模型按各自的時(shí)序調(diào)用[14]。
服務(wù)器調(diào)用socket()建立數(shù)據(jù)報(bào)套接字(s),通過bind()將套接字(s)與本地地址相連,recvfrom()/sendto()通過套接字(s)讀寫數(shù)據(jù),直到數(shù)據(jù)交換完成、最后通過closesocket()關(guān)閉套接字(s),結(jié)束服務(wù)。計(jì)算機(jī)客戶端依次調(diào)用socket()、connect(),向單片機(jī)服務(wù)器發(fā)送一個(gè)連接請(qǐng)求;單片機(jī)服務(wù)器監(jiān)聽到這個(gè)請(qǐng)求之后,就會(huì)調(diào)用accept()函數(shù)接收請(qǐng)求,如果accpet成功,則返回由內(nèi)核自動(dòng)生成的一個(gè)全新的描述字,至此服務(wù)器與客戶建立好連接;接下來就可以調(diào)用網(wǎng)絡(luò)I/O進(jìn)行讀寫操作,從而實(shí)現(xiàn)計(jì)算機(jī)與單片機(jī)不同進(jìn)程之間的通信。
計(jì)算機(jī)通過clientSocket = new Socket(HOST, PORT)連接單片機(jī),其中,HOST為單片機(jī)地址,PORT為單片機(jī)的端口。然后由 mReceiveThread = new ReceiveThread(clientSocket)、mReceiveThread.start()開啟接收數(shù)據(jù)線程,由于采用多線程通訊方式實(shí)時(shí)接收數(shù)據(jù),有效提高了其性能。計(jì)算機(jī)接收單片機(jī)數(shù)據(jù)如圖4.

圖4 計(jì)算機(jī)接收單片機(jī)數(shù)據(jù)
完善電路布局,實(shí)現(xiàn)模塊與模塊之間電路的互聯(lián)互通,在程序上逐步完善所需要的功能,之后將功能進(jìn)行組合,全面檢測每一個(gè)環(huán)節(jié)、每一個(gè)功能的具體實(shí)現(xiàn),以測試的數(shù)據(jù)作為單片機(jī)壓力計(jì)的設(shè)計(jì)與實(shí)現(xiàn)成果分析的依據(jù)。所測試的數(shù)據(jù)也可作為后面需要完善的時(shí)候進(jìn)行參考的依據(jù),最終實(shí)現(xiàn)基于單片機(jī)壓力計(jì)的綜合功能。
以單片機(jī)作為核心的壓力計(jì)要進(jìn)行功能測試,常用的測試方法包括模塊仿真法、數(shù)據(jù)分析法、觀察法,為確保參數(shù)的有效讀取和操作的簡便,此處的檢測采用直接觀察法進(jìn)行功能的測試。測試的內(nèi)容是將程序按照功能分別燒錄,在將檢測到的數(shù)據(jù)逐步記錄,分析其中的數(shù)值是否是正常的,還需借助溫度的變化檢測校準(zhǔn)、減少傳感器檢測的數(shù)據(jù)帶來的誤差,將誤差達(dá)到最小,以確保硬件、軟件的正確性。
為確保設(shè)計(jì)完成后能夠有效穩(wěn)定地運(yùn)行,將硬件檢測確認(rèn)無誤后,把完整功能的程序燒錄單片機(jī)中,讓所有的功能運(yùn)行起來。運(yùn)行一周左右檢測運(yùn)行的可靠性,并每間隔24小時(shí)檢測一次各個(gè)環(huán)節(jié)各個(gè)功能是否達(dá)到預(yù)先的數(shù)據(jù)指標(biāo)。查看需要采集的參數(shù)有無誤差、報(bào)警模塊有無正常工作,多進(jìn)行幾次測量物體的更換,對(duì)數(shù)據(jù)進(jìn)行誤差分析等等。
壓電傳感器的不足之處主要表現(xiàn)在高內(nèi)阻、功率小,輸出的信號(hào)弱,電纜的分布電容及噪聲干擾也會(huì)影響輸出的特性。因此,對(duì)電路要求很高。本方案克服了這一弱點(diǎn),實(shí)現(xiàn)了一款具有多線程實(shí)時(shí)通訊功能的壓力計(jì),使傳統(tǒng)的電子測量儀器能在遠(yuǎn)程、功能、精度及自動(dòng)化水平等方面得以顯著提高,具有一定的實(shí)用性。