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