顧亞龍
(新疆醫(yī)科大學(xué)醫(yī)學(xué)工程技術(shù)學(xué)院,新疆烏魯木齊,830011)
現(xiàn)代社會(huì)生活中,越來(lái)越多的環(huán)境對(duì)溫度的恒定具有較高的要求。例如,泳池的水溫不能太低或太高,否則會(huì)引起人的不適;蔬菜大棚無(wú)論是在冬天還是夏天,室內(nèi)的溫度要保持在一定范圍之內(nèi),因?yàn)橹参锏纳L(zhǎng)受到環(huán)境溫度的影響。單片機(jī)和傳感器組成的測(cè)控系統(tǒng)可以完成對(duì)多種信號(hào)的采集和控制,被廣泛的應(yīng)用在工業(yè)、農(nóng)業(yè)、交通、醫(yī)療等行業(yè)[1-4]。51 單片機(jī)作為測(cè)控系統(tǒng)的核心,功能齊全、可靠性強(qiáng),一經(jīng)推出,就得到了極大的普及。本文設(shè)計(jì)的溫度監(jiān)測(cè)報(bào)警系統(tǒng),采用了市面上常見(jiàn)的芯片,結(jié)構(gòu)簡(jiǎn)單,成本低廉,可以同時(shí)監(jiān)測(cè)多個(gè)環(huán)境的溫度,應(yīng)用在多種場(chǎng)合,滿(mǎn)足絕大多數(shù)的溫度監(jiān)控需求。
系統(tǒng)以單片機(jī)為核心,單片機(jī)與溫度傳感器之間雙向通信。當(dāng)單片機(jī)向溫度傳感器發(fā)出溫度轉(zhuǎn)換命令后,DS18B20 溫度傳感器首先將測(cè)量到的環(huán)境溫度值進(jìn)行AD轉(zhuǎn)換,再將采集到的溫度通過(guò)總線發(fā)送給單片機(jī)。單片機(jī)執(zhí)行讀引腳操作,將總線上讀取到的溫度值保存并做運(yùn)算處理,傳送給LCD1602 液晶顯示器顯示。若溫度傳感器發(fā)送給單片機(jī)的溫度值超出了預(yù)定溫度范圍,則單片機(jī)向聲光報(bào)警電路發(fā)出信號(hào),此時(shí)聲光報(bào)警電路同時(shí)發(fā)出聲音和燈光報(bào)警。系統(tǒng)中電源分別向單片機(jī)、LCD1602 和聲光報(bào)警電路供電。系統(tǒng)的整體設(shè)計(jì)框圖如圖1 所示。
圖1 溫度監(jiān)測(cè)報(bào)警系統(tǒng)總體設(shè)計(jì)框圖
本文采用DS18B20 作為溫度傳感器。DS18B20 是DALLAS 公司生產(chǎn)的一種數(shù)字溫度傳感器,測(cè)量精度±0.5℃,可以直接將溫度轉(zhuǎn)化為數(shù)字信號(hào)傳送給單片機(jī),不用單獨(dú)設(shè)計(jì)AD 轉(zhuǎn)換電路[5]。
每個(gè)DS18B20 傳感器具有單獨(dú)的64 位ROM,因此,該溫度傳感器不僅可以和單片機(jī)組成單點(diǎn)測(cè)溫系統(tǒng)[6-7],還可以構(gòu)成多點(diǎn)測(cè)溫系統(tǒng)。單總線的優(yōu)點(diǎn)是結(jié)構(gòu)簡(jiǎn)單、成本低廉,節(jié)省單片機(jī)的IO 口資源,若要對(duì)系統(tǒng)進(jìn)行擴(kuò)展,可將新增的溫度傳感器掛接在總線上。單總線也有缺點(diǎn),數(shù)據(jù)和地址等信息的傳送都通過(guò)一條線路,帶寬低、負(fù)載重,數(shù)據(jù)傳送時(shí)對(duì)時(shí)序的要求較高,編程難度加大。本文中溫度采集電路設(shè)計(jì)如圖2 中所示。每個(gè)溫度傳感器被放置在不同的測(cè)溫區(qū),測(cè)量各個(gè)區(qū)域的溫度,單總線經(jīng)4.7kΩ 的上拉電阻接單片機(jī)的P1.7 引腳。電源同時(shí)對(duì)4 個(gè)溫度傳感器供電,傳感器的GND 端同時(shí)接地。
圖2 硬件電路圖
本文采用LCD1602 液晶顯示器顯示當(dāng)前的四個(gè)溫度傳感器采集的溫度值。該傳感器是最常見(jiàn)、并且市場(chǎng)普及率最高的字符型液晶顯示模塊。該顯示器每行可以顯示16 個(gè)字符,同時(shí)顯示兩行。LCD1602 的8 條數(shù)據(jù)線經(jīng)上拉電阻與單片機(jī)的P0 口相連接,當(dāng)單片機(jī)對(duì)顯示器寫(xiě)命令或需要顯示字符時(shí),命令字或字符的ASCII 碼通過(guò)8 條數(shù)據(jù)線被寫(xiě)入顯示器內(nèi)部的顯示數(shù)據(jù)RAM(DDRAM)??刂埔_RS 和EN 分別為寄存器選擇端和使能信號(hào)端,兩個(gè)引腳分別接單片機(jī)的P2.6 和P2.7 引腳。RS 和EN 引腳的不同信號(hào)組合可以控制顯示器的不同讀寫(xiě)狀態(tài),由于溫度轉(zhuǎn)換時(shí)設(shè)有延時(shí)程序,遠(yuǎn)大于顯示器內(nèi)部處理數(shù)據(jù)的時(shí)間長(zhǎng)度,所以不用檢測(cè)LCD1602 的讀忙標(biāo)志。單片機(jī)只向顯示器寫(xiě)數(shù)據(jù),不用讀取,因此RW 引腳接地,恒為低電平。
揚(yáng)聲器工作時(shí)需要的電流較大,而單片機(jī)驅(qū)動(dòng)能力最強(qiáng)的P0 口每個(gè)引腳最大只能提供3mA 左右的灌電流,或者400μA 的拉電流,無(wú)法驅(qū)動(dòng)揚(yáng)聲器工作。本文為了使單片機(jī)能夠驅(qū)動(dòng)揚(yáng)聲器,采用了三極管驅(qū)動(dòng)的方式。當(dāng)系統(tǒng)需要發(fā)出報(bào)警信號(hào)時(shí),單片機(jī)P3.6 發(fā)出低電平信號(hào),PNP 三接管發(fā)射結(jié)導(dǎo)通,被放大的電流經(jīng)集電極驅(qū)動(dòng)揚(yáng)聲器發(fā)出聲音報(bào)警信號(hào)。當(dāng)單片機(jī)復(fù)位重啟或不需要發(fā)出報(bào)警信號(hào)時(shí),P3.6 引腳為高電平,發(fā)射結(jié)兩側(cè)沒(méi)有電位差,基極無(wú)電流,通過(guò)揚(yáng)聲器的電流也為0。LED 的驅(qū)動(dòng)電流較小,單片機(jī)引腳的灌電流足以驅(qū)動(dòng)LED 發(fā)光,在揚(yáng)聲器工作的同時(shí),P3.5 發(fā)出高低電平信號(hào),使LED 斷續(xù)發(fā)光,產(chǎn)生燈光報(bào)警信號(hào),引起工作人員的注意。
除此之外,硬件電路還設(shè)有時(shí)鐘電路和復(fù)位電路,用于產(chǎn)生數(shù)字電路系統(tǒng)所需的時(shí)鐘信號(hào)和初始化系統(tǒng)所用,以滿(mǎn)足單片機(jī)系統(tǒng)工作的基本需求。
每個(gè)DS18B20 都有一個(gè)唯一的64 位ROM 碼,從而允許多只DS18B20 同時(shí)連接在一根總線上。若單片機(jī)要與總線上的某一只DS18B20 通信,必須要知道該溫度傳感器的ROM 碼,以識(shí)別“身份”。本文中的溫度監(jiān)測(cè)系統(tǒng)共有4只DS18B20,需要獲取每一只溫度傳感器的ROM 碼。
首先讓總線上的三個(gè)傳感器先與總線斷開(kāi),剩余一個(gè)溫度傳感器與單片機(jī)相連接。單片機(jī)與該DS18B20 初始化通信結(jié)束后,接著發(fā)送[33h](讀取ROM 指令),溫度傳感器會(huì)由低位到高位發(fā)送內(nèi)部64 位ROM 碼,單片機(jī)按位讀取后,存儲(chǔ)在內(nèi)部數(shù)據(jù)存儲(chǔ)器預(yù)定的8 個(gè)字節(jié)存儲(chǔ)單元中。分別讓剩余三個(gè)DS18B20 單獨(dú)與單片機(jī)相連,讀取ROM碼并存儲(chǔ)起來(lái)。系統(tǒng)工作時(shí),單片機(jī)要核對(duì)收到的ROM 碼,因此要將ROM 顯示出來(lái),以供編程時(shí)使用。最后,調(diào)用LCD1602 顯示子程序分別顯示已存儲(chǔ)的每個(gè)溫度傳感器的ROM 碼,并寫(xiě)入源程序中。
單片機(jī)在總線上依次與各個(gè)DS18B20 通信,獲取溫度值。首先在總線上發(fā)出初始化信號(hào),DS18B20 做出回應(yīng)。單片機(jī)再發(fā)送[55h](匹配ROM)指令,后跟64 位ROM碼,目的是與指定的溫度傳感器建立通信,其余的溫度傳感器不再對(duì)后面的指令做出回應(yīng)。單片機(jī)接著發(fā)送[44h](溫度轉(zhuǎn)換指令)。已經(jīng)建立通信的DS18B20 接收到溫度轉(zhuǎn)換指令以后,開(kāi)始溫度轉(zhuǎn)換,將轉(zhuǎn)換好的溫度保存在內(nèi)部暫存器的第0 和第1 字節(jié),此過(guò)程最長(zhǎng)需要750ms,單片機(jī)需要延時(shí)等待。再發(fā)出[BEh](讀暫存器指令),DS18B20將溫度值的補(bǔ)碼由低位至高位發(fā)送到總線上,單片機(jī)讀取總線上的數(shù)據(jù)后將之儲(chǔ)存在寄存器中。此后,單片機(jī)分別于各個(gè)DS18B20 建立通信,獲取4 個(gè)傳感器測(cè)量到的溫度值。溫度值經(jīng)過(guò)運(yùn)算處理后,被依次發(fā)送給LCD1602,每次顯示兩個(gè)區(qū)域的溫度,間隔2 秒再顯示兩個(gè)區(qū)域的溫度,如圖3 所示。
圖3 溫度的顯示
單片機(jī)讀取完所有的溫度值后會(huì)進(jìn)行判斷,如果有溫度值超過(guò)預(yù)設(shè)的溫度上限或低于溫度下限值后,單片機(jī)調(diào)用報(bào)警子程序。報(bào)警子程序同時(shí)令單片機(jī)的P3.5 和P3.6 引腳發(fā)出低電平,通過(guò)中斷子程序中的定時(shí)延時(shí)程序每0.5 秒使P3.5 和P3.6 引腳電平同時(shí)相反變化一次,可得到變化的聲光報(bào)警信號(hào),提示當(dāng)前溫度超出預(yù)設(shè)范圍。LCD1602 顯示屏同時(shí)顯示超出預(yù)設(shè)范圍的區(qū)域溫度,提示操作人員及時(shí)做出相應(yīng)處理。若單片機(jī)讀取的溫度值在預(yù)設(shè)范圍內(nèi)時(shí),P3.5和P3.6 引腳保持高電平,無(wú)報(bào)警信號(hào)發(fā)出,程序繼續(xù)循環(huán)掃描讀取每個(gè)傳感器測(cè)得的溫度值進(jìn)行判斷。
本文將溫度傳感器的初始化、讀字節(jié)、寫(xiě)字節(jié)、啟動(dòng)溫度轉(zhuǎn)換、液晶顯示器的初始化、寫(xiě)命令、寫(xiě)數(shù)據(jù)等過(guò)程分別建立子程序。主程序中在變量聲明,初始化液晶顯示器程序后,進(jìn)入無(wú)線循環(huán)程序。無(wú)限循環(huán)程序中,單片機(jī)分別依次調(diào)用DS18B20 初始化、讀取各個(gè)傳感器溫度、判斷溫度、溫度報(bào)警、顯示溫度子程序。無(wú)限循環(huán)確保了單片機(jī)能一直監(jiān)測(cè)溫度,無(wú)需人為再進(jìn)行操作。如果單片機(jī)受到干擾死機(jī)或者程序跑飛,按下復(fù)位按鍵重新啟動(dòng)即可。定時(shí)器中斷程序?yàn)閾P(yáng)聲器和LED提供了1秒的閃爍周期,放在主程序之后。
本文設(shè)計(jì)的溫度監(jiān)測(cè)報(bào)警系統(tǒng)可以應(yīng)用于室內(nèi)房間、保溫箱、農(nóng)業(yè)大棚等多種場(chǎng)所,能夠有效地幫助人們同時(shí)監(jiān)測(cè)多個(gè)區(qū)域的溫度。如果加以驅(qū)動(dòng),同一總線最多可以支持掛接256 個(gè)DS18B20 溫度傳感器,在本文的基礎(chǔ)上,可以擴(kuò)展同時(shí)監(jiān)測(cè)更多的目標(biāo)區(qū)域溫度,擴(kuò)大溫度監(jiān)測(cè)的范圍。若加繼電器以驅(qū)動(dòng)升溫或降溫電路,可以控制將環(huán)境溫度保持在一個(gè)區(qū)間內(nèi),構(gòu)成恒溫控制系統(tǒng)[8]。本設(shè)計(jì)能夠滿(mǎn)足溫度監(jiān)測(cè)精度不小于±0.5℃的監(jiān)控場(chǎng)所需求,具有成本低,可靠性強(qiáng),易擴(kuò)展的特點(diǎn)。