用單片機(jī)開發(fā)一個溫度測量控制系統(tǒng),顯示用16*2的液晶,實時顯示測量溫度,加熱輸出采用通斷控制,用發(fā)光二極管來模擬,能設(shè)置目標(biāo)溫度,能設(shè)置報警溫度閾值,超過了進(jìn)行報警,報警采用液晶屏幕顯示。
看到設(shè)計任務(wù)的時候,因為主要是進(jìn)行溫度測量,所以必然會用到溫度傳感器。那么什么是溫度傳感器呢。溫度傳感器(temperature transducer)是指能感受溫度并轉(zhuǎn)換成可用輸出信號的傳感器。溫度傳感器是溫度測量儀表的核心部分,品種繁多。按測量方式可分為接觸式和非接觸式兩大類,按照傳感器材料及電子元件特性分為熱電阻和熱電偶兩類。在經(jīng)過一番選擇后,最終確定用DS18B20作為需要的溫度傳感器,原因如下。1.DS18B20是常用的數(shù)字溫度傳感器,其輸出的是數(shù)字信號,具有體積小,硬件開銷低,抗干擾能力強(qiáng),精度高的特點。 2.因為之前用過熱敏電阻代替,精度不夠高,也想嘗試下新的傳感器。
其次就是16*2的液晶顯示模塊,因為要求中不需要顯示中文,所有就采用LCD1602模塊為所需的液晶顯示屏。加熱部分用發(fā)光二極管模擬,并采用通斷控制,那么就可以利用定時器中斷發(fā)出PWM波達(dá)到需要的要求即可。其次是設(shè)置目標(biāo)溫度和警報溫度。顯然,需要加至少兩個按鍵來控制。進(jìn)行報警的部分就可以使用簡單的蜂鳴器即可。當(dāng)溫度達(dá)到警報溫度的時候,蜂鳴器就響。
因為是LCD屏,所有發(fā)揮部分加了一個萬年歷的模塊,采用DS1302時鐘模塊。本可以加個計算器模塊,但是估計IO口設(shè)計完上面的一系列模塊后就不夠用了,所以不打算加上計算器模塊。
主要元器件的選擇:MCU 芯片選擇的是AT89C51,LCD顯示屏采用的是LCD1602,在仿真電路中用的是LM016L,和LCD1602性質(zhì)相同。溫度傳感器用的是DS18B20。發(fā)揮部分用的是DS1302時鐘模塊。
模塊設(shè)計
最小系統(tǒng):這個部分的設(shè)計相對比較簡單,首先是系統(tǒng)時鐘電路,需要一個12M的外部晶振,其次需要兩個30pf電容。搭配起來就是一個系統(tǒng)時鐘了。接下來就是復(fù)位電路了,需要一個10K電阻,一個10μf的電解電容,還有一個開關(guān)。設(shè)計好后的最小系統(tǒng)如圖所示:
液晶顯示:LCD1602
按照LCD1602手冊連接好電路如圖所示:
DS18B20溫度模塊: 單線數(shù)字溫度傳感器,所以操作的要求比較高,讀取數(shù)據(jù)的時候需要控制在微秒量級。
初始化:主機(jī)首先發(fā)出一個480-960微秒的低電平脈沖,然后釋放總線變?yōu)楦唠娖剑⒃陔S后的480微秒時間內(nèi)對總線進(jìn)行檢測,如果有低電平出現(xiàn)說明總線上有器件已做出應(yīng)答。若無低電平出現(xiàn)一直都是高電平說明總線上無器件應(yīng)答。
做為從器件的DS18B20在一上電后就一直在檢測總線上是否有480-960微秒的低電平出現(xiàn),如果有,在總線轉(zhuǎn)為高電平后等待15-60微秒后將總線電平拉低60-240微秒做出響應(yīng)存在脈沖,告訴主機(jī)本器件已做好準(zhǔn)備。若沒有檢測到就一直在檢測等待。
寫操作:寫周期最少為60微秒,最長不超過120微秒。寫周期一開始做為主機(jī)先把總線拉低1微秒表示寫周期開始。隨后若主機(jī)想寫0,則繼續(xù)拉低電平最少60微秒直至寫周期結(jié)束,然后釋放總線為高電平。若主機(jī)想寫1,在一開始拉低總線電平1微秒后就釋放總線為高電平,一直到寫周期結(jié)束。而做為從機(jī)的DS18B20則在檢測到總線被拉底后等待15微秒然后從15us到45us開始對總線采樣,在采樣期內(nèi)總線為高電平則為1,若采樣期內(nèi)總線為低電平則為0。
讀操作:對于讀數(shù)據(jù)操作時序也分為讀0時序和讀1時序兩個過程。讀時隙是從主機(jī)把單總線拉低之后,在1微秒之后就得釋放單總線為高電平,以讓DS18B20把數(shù)據(jù)傳輸?shù)絾慰偩上。DS18B20在檢測到總線被拉低1微秒后,便開始送出數(shù)據(jù),若是要送出0就把總線拉為低電平直到讀周期結(jié)束。若要送出1則釋放總線為高電平。主機(jī)在一開始拉低總線1微秒后釋放總線,然后在包括前面的拉低總線電平1微秒在內(nèi)的15微秒時間內(nèi)完成對總線進(jìn)行采樣檢測,采樣期內(nèi)總線為低電平則確認(rèn)為0。采樣期內(nèi)總線為高電平則確認(rèn)為1。完成一個讀時序過程,至少需要60us才能完成。
DS1302模塊:
DS1302的引腳排列,其中Vcc1為后備電源,VCC2為主電源。在主電源關(guān)閉的情況下,也能保持時鐘的連續(xù)運行。DS1302由Vcc1或Vcc2兩者中的較大者供電。當(dāng)Vcc2大于Vcc1+0.2V時,Vcc2給DS1302供電。當(dāng)Vcc2小于Vcc1時,DS1302由Vcc1供電。X1和X2是振蕩源,外接32.768kHz晶振。RST是復(fù)位/片選線,通過把RST輸入驅(qū)動置高電平來啟動所有的數(shù)據(jù)傳送。RST輸入有兩種功能:首先,RST接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,RST提供終止單字節(jié)或多字節(jié)數(shù)據(jù)的傳送手段。當(dāng)RST為高電平時,所有的數(shù)據(jù)傳送被初始化,允許對DS1302進(jìn)行操作。如果在傳送過程中RST置為低電平,則會終止此次數(shù)據(jù)傳送,I/O引腳變?yōu)楦咦钁B(tài)。上電運行時,在Vcc≥2.5V之前,RST必須保持低電平。只有在SCLK為低電平時,才能將RST置為高電平。I/O為串行數(shù)據(jù)輸入輸出端(雙向),后面有詳細(xì)說明。SCLK始終是輸入端。
加熱模塊:用的LED代替,在加熱的時候LED在PWM波的作用下會出現(xiàn)周期為4s的亮滅,代表加熱的進(jìn)行。在停止加熱的時候,會滅掉。
按鍵功能:按鍵1是萬年歷按鍵,按鍵2是設(shè)置目標(biāo)溫度和警報溫度按鍵,按一下進(jìn)入目標(biāo)溫度設(shè)置,按兩下進(jìn)入警報溫度設(shè)置。按鍵3是加溫度按鍵,按鍵4是減溫度按鍵。按鍵5是溫度顯示按鍵。
硬件電路圖:
硬件PCB板圖:
LCD顯示模塊部分代碼編寫:
在LCD硬件部分介紹的時候,介紹了LCD1602讀寫的步驟和時序。按步驟可以編寫出以下的初始化和讀寫代碼。其中的清屏(LcdWriteCom(0x01))這一步在主函數(shù)里面的用處很多。
DS18B20溫度顯示模塊:
DS18B20對時序的要求很高,要控制在微秒量級之間,初始化、讀、寫中的任何一步有誤差就會顯示不出溫度。按照硬件部分的介紹可以寫出DS18B20部分的代碼如下:
初始化:
寫操作:
讀操作:
DS1302模塊代碼:
根據(jù)硬件部分對DS1302的解釋,也可以寫出如下的代碼
PWM波代碼:通過定時器中斷1輸出周期為4s的方波,實現(xiàn)兩秒亮,兩秒滅。
目標(biāo)溫度和警報溫度設(shè)定:
達(dá)到目標(biāo)溫度后LED滅和未達(dá)到目標(biāo)溫度LED周期性亮滅:
達(dá)到警報溫度后蜂鳴器響:
按下溫度顯示按鍵,顯示當(dāng)前溫度:
按下目標(biāo)溫度設(shè)置鍵,出現(xiàn)Aim_temp設(shè)置。此時按下加和減鍵可以實現(xiàn)目標(biāo)溫度設(shè)置。
繼續(xù)按下溫度設(shè)置鍵,跳轉(zhuǎn)到警報溫度設(shè)置頁面,按下加和減號鍵可以設(shè)置警報溫度。
此時,按下溫度顯示鍵:如果目標(biāo)溫度高于當(dāng)前溫度,LED燈會周期性亮滅,模擬加熱環(huán)節(jié)。如果目標(biāo)溫度低于當(dāng)前溫度,則LED滅。模擬停止加熱環(huán)節(jié)。如果當(dāng)前溫度高于設(shè)定的警報溫度,蜂鳴器響。
目標(biāo)溫度(52)高于當(dāng)前溫度(48),LED亮。
目標(biāo)溫度(52)低于當(dāng)前溫度(55),LED滅:
當(dāng)前溫度高于警報溫度,蜂鳴器響:
按下萬年歷顯示模塊,顯示日期(初始化值):
通過本次的設(shè)計,讓我學(xué)會了如何通過元器件手冊編寫相應(yīng)的初始化等程序。尤其是DS18B20這個溫度傳感器模塊。稍有延遲誤差就讀不出具體的溫度數(shù)據(jù),會一直顯示-0.006℃。調(diào)了很久,才把延遲范圍控制在要求的范圍內(nèi)。
此外,對于LCD1602的部分,要是想顯示單獨一個變量數(shù)字,需要在末尾加上’0’。例如:要在LCD上顯示目標(biāo)溫度Aim_temp,需要拆分成高位和地位,分別用Aim_h和Aim_l來表示,那么要顯示出來就需要Aim_h+’0’才可以顯示出來。總之,這次綜合設(shè)計讓我更加意識到了單片機(jī)的強(qiáng)大和有趣,希望未來能在這條路上越走越遠(yuǎn)。