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