版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 題目 主從式溫度監(jiān)測(cè)報(bào)警與控制系統(tǒng) </p><p><b> 任務(wù)與要求</b></p><p> 主從式溫度監(jiān)測(cè)警報(bào)與控制系統(tǒng)</p><p> 摘要:本文以AT89S52單片機(jī)為主控器構(gòu)成一個(gè)多功能的主從式溫度監(jiān)測(cè)警報(bào)與控制系統(tǒng)。在文中詳盡分析所設(shè)計(jì)電路的原理、所編寫單片機(jī)程序及部分主要電路
2、元件功能,結(jié)合實(shí)際焊接調(diào)試的問題和解決方案,給出我們完整的課程設(shè)計(jì)。</p><p> 關(guān)鍵詞:AT89S52單片機(jī)、DS13B02、PC串口通信、溫度監(jiān)測(cè)</p><p><b> 引言</b></p><p> 在各工業(yè)生產(chǎn)部門經(jīng)常會(huì)遇到對(duì)溫度進(jìn)行監(jiān)測(cè)和控制的需要,而用微機(jī)構(gòu)成溫度控制系統(tǒng)有很大的實(shí)用意義。微機(jī)測(cè)溫、控溫便于實(shí)現(xiàn)生產(chǎn)過
3、程的自動(dòng)化,具有操作簡單、精度高、可靠性好、測(cè)量范圍廣等特點(diǎn),可實(shí)現(xiàn)遠(yuǎn)距離巡回檢測(cè)、安全報(bào)警、溫度顯示與打印、信息存儲(chǔ)、數(shù)據(jù)通訊等功能。</p><p> 1.主從式溫度監(jiān)測(cè)警報(bào)與控制系統(tǒng)設(shè)計(jì)及主要功能部分</p><p> 本溫度監(jiān)測(cè)警報(bào)與控制系統(tǒng)的整體電路圖如圖一示,以AT89S52單片機(jī)為主控器,借助DS18B20一線總線數(shù)字式傳感器的功能,采用四位數(shù)碼管來顯示實(shí)時(shí)溫度。當(dāng)時(shí)是溫
4、度高于設(shè)置值時(shí),蜂鳴器將會(huì)發(fā)出警報(bào)。</p><p> 圖一、監(jiān)測(cè)報(bào)警與控制系統(tǒng)整體電路圖</p><p> 1.1 AT89S52單片機(jī)</p><p> 采用AT89S52單片機(jī)來對(duì)電路實(shí)施控制是十分高效的。通過對(duì)程序的編寫,可以隨時(shí)根據(jù)實(shí)際需要改變電子鐘的功能,使其具有可拓展性。</p><p> AT89S52單片機(jī)是一種低功
5、耗高性能的CMOS8位微控制器,內(nèi)置8KB可在線編程閃存。在本課程設(shè)計(jì)中使用到的AT89S52主要特性如下:</p><p> 1)8K字節(jié)可擦寫1000次的在線可編程ISP 閃存</p><p> 2)全靜態(tài)工作:0Hz ~ 24MHz</p><p> 3)256字節(jié)內(nèi)部RAM</p><p> 4)32條可編程I/O線</
6、p><p> 5)3個(gè)16位定時(shí)器/計(jì)數(shù)器</p><p><b> 6)8個(gè)中斷源</b></p><p> 7)通過中斷終止掉電方式</p><p><b> 8)看門狗定時(shí)器</b></p><p> 圖二、AT89S52引腳圖</p><p&
7、gt; 1.2 DS18B20一線總線數(shù)字式傳感器</p><p> DS18B20“一線總線”數(shù)字化溫度傳感器是DALLAS最新單線數(shù)字溫度傳感器, DS18B20支持“一線總線”接口,測(cè)量溫度范圍為 -55°C~+125°C,在-10~+85°C范圍內(nèi),精度為±0.5°C。DS1822的精度較差為± 2°C ?,F(xiàn)場(chǎng)溫度直接以“一線總線”
8、的數(shù)字方式傳輸,大大提高了系統(tǒng)的抗干擾性。適合于惡劣環(huán)境的現(xiàn)場(chǎng)溫度測(cè)量,與前一代產(chǎn)品不同,新的產(chǎn)品支持3V~5.5V的電壓范圍,使系統(tǒng)設(shè)計(jì)更靈活、方便。而且新一代產(chǎn)品更便宜,體積更小。</p><p> DS18B20可以程序設(shè)定9~12位的分辨率,精度為±0.5°C??蛇x更小的封裝方式,更寬的電壓適用范圍。分辨率設(shè)定,及用戶設(shè)定的報(bào)警溫度存儲(chǔ)在EEPROM中,掉電后依然保存。DS18B20
9、的性能是新一代產(chǎn)品中最好的!性能價(jià)格比也非常出色! DS1822與 DS18B20軟件兼容,是DS18B20的簡化版本。省略了存儲(chǔ)用戶定義報(bào)警溫度、分辨率參數(shù)的EEPROM,精度降低為±2°C,適用于對(duì)性能要求不高,成本控制嚴(yán)格的應(yīng)用,是經(jīng)濟(jì)型產(chǎn)品。 繼“一線總線”的早期產(chǎn)品后,DS1820開辟了溫度傳感器技術(shù)的新概念。DS18B20和DS1822使電壓、特性及封裝有更多的選擇,讓我們可以構(gòu)建適合自己的經(jīng)濟(jì)的測(cè)溫系統(tǒng)
10、。</p><p> 1.2.1 DS18B20的內(nèi)部結(jié)構(gòu)</p><p> DS18B20內(nèi)部結(jié)構(gòu)主要由四部分組成:64位光刻ROM、溫度傳感器、非揮發(fā)的溫度報(bào)警觸發(fā)器TH和TL、配置寄存器。DS18B20的管腳排列如圖三示:</p><p> 圖三、DS18B20的管腳排列</p><p> DQ為數(shù)字信號(hào)輸入/輸出端;GND為電
11、源地;VDD為外接供電電源輸入端(在寄生電源接線方式時(shí)接地)。</p><p> 光刻ROM中的64位序列號(hào)是出廠前被光刻好的,它可以看作是該DS18B20的地址序列碼。64位光刻ROM的排列是:開始8位(28H)是產(chǎn)品類型標(biāo)號(hào),接著的48位是該DS18B20自身的序列號(hào),最后8位是前面56位的循環(huán)冗余校驗(yàn)碼(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一個(gè)DS18B20都各不相同,這樣就可以實(shí)現(xiàn)一根
12、總線上掛接多個(gè)DS18B20的目的。</p><p> DS18B20中的溫度傳感器可完成對(duì)溫度的測(cè)量,以12位轉(zhuǎn)化為例:用16位符號(hào)擴(kuò)展的二進(jìn)制補(bǔ)碼讀數(shù)形式提供,以0.0625℃/LSB形式表達(dá),其中S為符號(hào)位。</p><p> 圖四、12位轉(zhuǎn)化后得到的12位數(shù)據(jù)</p><p> 這是12位轉(zhuǎn)化后得到的12位數(shù)據(jù),存儲(chǔ)在18B20的兩個(gè)8比特的RAM中,
13、二進(jìn)制中的前面5位是符號(hào)位,如果測(cè)得的溫度大于0,這5位為0,只要將測(cè)到的數(shù)值乘于0.0625即可得到實(shí)際溫度;如果溫度小于0,這5位為1,測(cè)到的數(shù)值需要取反加1再乘于0.0625即可得到實(shí)際溫度。 </p><p> 例如+125℃的數(shù)字輸出為07D0H,+25.0625℃的數(shù)字輸出為0191H,-25.0625℃的數(shù)字輸出為FF6FH,-55℃的數(shù)字輸出為FC90H。</p><p>
14、; 圖五、各溫度對(duì)應(yīng)的數(shù)字輸出</p><p> 1.2.2 DS18B20溫度傳感器的存儲(chǔ)器</p><p> DS18B20溫度傳感器的內(nèi)部存儲(chǔ)器包括一個(gè)高速暫存RAM和一個(gè)非易失性的可電擦除的E2RAM,后者存放高溫度和低溫度觸發(fā)器TH、TL和結(jié)構(gòu)寄存器。 </p><p> 暫存存儲(chǔ)器包含了8個(gè)連續(xù)字節(jié),前兩個(gè)字節(jié)是測(cè)得的溫度信息,第一個(gè)字節(jié)的內(nèi)容是
15、溫度的低八位,第二個(gè)字節(jié)是溫度的高八位。第三個(gè)和第四個(gè)字節(jié)是TH、TL的易失性拷貝,第五個(gè)字節(jié)是結(jié)構(gòu)寄存器的易失性拷貝,這三個(gè)字節(jié)的內(nèi)容在每一次上電復(fù)位時(shí)被刷新。第六、七、八個(gè)字節(jié)用于內(nèi)部計(jì)算。第九個(gè)字節(jié)是冗余檢驗(yàn)字節(jié)。</p><p> 該字節(jié)各位的意義如下:</p><p> TM R1 R0 1 1 1 1 1 </p><p> 低五位一直都是1,TM
16、是測(cè)試模式位,用于設(shè)置DS18B20在工作模式還是在測(cè)試模式。在DS18B20出廠時(shí)該位被設(shè)置為0,用戶不要去改動(dòng)。R1和R0用來設(shè)置分辨率,如下表所示:(DS18B20出廠時(shí)被設(shè)置為12位)</p><p><b> 圖六、分辨率設(shè)置表</b></p><p> 根據(jù)DS18B20的通訊協(xié)議,主機(jī)控制DS18B20完成溫度轉(zhuǎn)換必須經(jīng)過三個(gè)步驟:每一次讀寫之前都要
17、對(duì)DS18B20進(jìn)行復(fù)位,復(fù)位成功后發(fā)送一條ROM指令,最后發(fā)送RAM指令,這樣才能對(duì)DS18B20進(jìn)行預(yù)定的操作。復(fù)位要求主CPU將數(shù)據(jù)線下拉500微秒,然后釋放,DS18B20收到信號(hào)后等待16~60微秒左右,后發(fā)出60~240微秒的存在低脈沖,主CPU收到此信號(hào)表示復(fù)位成功。</p><p> 1.2.3 DS1820使用中注意事項(xiàng) </p><p> DS1820雖然具有測(cè)溫系
18、統(tǒng)簡單、測(cè)溫精度高、連接方便、占用口線少等優(yōu)點(diǎn),但在實(shí)際應(yīng)用中也應(yīng)注意以下幾方面的問題: </p><p> (1)較小的硬件開銷需要相對(duì)復(fù)雜的軟件進(jìn)行補(bǔ)償,由于DS1820與微處理器間采用串行數(shù)據(jù)傳送,因此,在對(duì)DS1820進(jìn)行讀寫編程時(shí),必須嚴(yán)格的保證讀寫時(shí)序,否則將無法讀取測(cè)溫結(jié)果。在使用PL/M、C等高級(jí)語言進(jìn)行系統(tǒng)程序設(shè)計(jì)時(shí),對(duì)DS1820操作部分最好采用匯編語言實(shí)現(xiàn)。</p><
19、p> (2)在DS1820的有關(guān)資料中均未提及單總線上所掛DS1820數(shù)量問題,容易使人誤認(rèn)為可以掛任意多個(gè)DS1820,在實(shí)際應(yīng)用中并非如此。當(dāng)單總線上所掛DS1820超過8個(gè)時(shí),就需要解決微處理器的總線驅(qū)動(dòng)問題,這一點(diǎn)在進(jìn)行多點(diǎn)測(cè)溫系統(tǒng)設(shè)計(jì)時(shí)要加以注意。</p><p> (3)連接DS1820的總線電纜是有長度限制的。試驗(yàn)中,當(dāng)采用普通信號(hào)電纜傳輸長度超過50m時(shí),讀取的測(cè)溫?cái)?shù)據(jù)將發(fā)生錯(cuò)誤。當(dāng)將總
20、線電纜改為雙絞線帶屏蔽電纜時(shí),正常通訊距離可達(dá)150m,當(dāng)采用每米絞合次數(shù)更多的雙絞線帶屏蔽電纜時(shí),正常通訊距離進(jìn)一步加長。這種情況主要是由總線分布電容使信號(hào)波形產(chǎn)生畸變?cè)斐傻?。因此,在用DS1820進(jìn)行長距離測(cè)溫系統(tǒng)設(shè)計(jì)時(shí)要充分考慮總線分布電容和阻抗匹配問題。</p><p> (4)在DS1820測(cè)溫程序設(shè)計(jì)中,向DS1820發(fā)出溫度轉(zhuǎn)換命令后,程序總要等待DS1820的返回信號(hào),一旦某個(gè)DS1820接觸不
21、好或斷線,當(dāng)程序讀該DS1820時(shí),將沒有返回信號(hào),程序進(jìn)入死循環(huán)。這一點(diǎn)在進(jìn)行DS1820硬件連接和軟件設(shè)計(jì)時(shí)也要給予一定的重視。</p><p> 測(cè)溫電纜線建議采用屏蔽4芯雙絞線,其中一對(duì)線接地線與信號(hào)線,另一組接VCC和地線,屏蔽層在源端單點(diǎn)接地。</p><p> 1.3MAX232芯片</p><p> MAX232芯片是美信公司專門為電腦的RS-
22、232標(biāo)準(zhǔn)串口設(shè)計(jì)的單電源電平轉(zhuǎn)換芯片,使用+5v單電源供電。</p><p> MAX232芯片的引腳介紹如圖七所示。</p><p> 圖七、MAX232引腳圖</p><p> 第一部分是電荷泵電路。由1、2、3、4、5、6腳和4只電容構(gòu)成。功能是產(chǎn)生+12v和-12v兩個(gè)電源,提供給RS-232串口電平的需要。 </p><p>
23、; 第二部分是數(shù)據(jù)轉(zhuǎn)換通道。由7、8、9、10、11、12、13、14腳構(gòu)成兩個(gè)數(shù)據(jù)通道。 </p><p> 其中13腳(R1IN)、12腳(R1OUT)、11腳(T1IN)、14腳(T1OUT)為第一數(shù)據(jù)通道。 8腳(R2IN)、9腳(R2OUT)、10腳(T2IN)、7腳(T2OUT)為第二數(shù)據(jù)通道。 TTL/CMOS數(shù)據(jù)從T1IN、T2IN輸入轉(zhuǎn)換成RS-232數(shù)據(jù)從T1OUT、T2OU
24、T送到電腦DB9插頭;DB9插頭的RS-232數(shù)據(jù)從R1IN、R2IN輸入轉(zhuǎn)換成TTL/CMOS數(shù)據(jù)后從R1OUT、R2OUT輸出。 </p><p> 第三部分是供電。15腳GND、16腳VCC(+5v)。</p><p> MAX232芯片的主要有以下特點(diǎn)</p><p> 1)符合所有的RS-232C技術(shù)標(biāo)準(zhǔn) </p><p>
25、 2)只需要單一 +5V電源供電 </p><p> 3)片載電荷泵具有升壓、電壓極性反轉(zhuǎn)能力,能夠產(chǎn)生+10V和-10V電壓V+、V- </p><p> 4)功耗低,典型供電電流5mA </p><p> 5)內(nèi)部集成2個(gè)RS-232C驅(qū)動(dòng)器 </p><p> 6)內(nèi)部集成2個(gè)RS-232C接收器 </p><
26、;p> 7)高集成度,片外最低只需4個(gè)電容即可工作。</p><p> 圖八、MAX232引腳接法原理圖</p><p> 1.4 四位數(shù)碼管顯示</p><p> 該溫度計(jì)的顯示采用四位共陰動(dòng)態(tài)數(shù)碼管來動(dòng)態(tài)顯示。最高一位用來顯示“+”或者“-”攝氏溫度,中間兩位用來顯示當(dāng)前的溫度數(shù)值的“十位”和“個(gè)位”,最后一位用來顯示當(dāng)前的溫度數(shù)值的“小數(shù)點(diǎn)后一位
27、”。如下圖十一所示(顯示的是“+32.8攝氏度”)。</p><p> 圖九、數(shù)碼管顯示(環(huán)境溫度為32.8℃)</p><p><b> 1.5 蜂鳴器發(fā)聲</b></p><p> 蜂鳴器是一種一體化結(jié)構(gòu)的電子訊響器,采用直流電壓供電。</p><p> 本課程設(shè)計(jì)采用壓電式蜂鳴器。壓電式蜂鳴器主要由多諧振蕩
28、器、壓電蜂鳴片、阻抗匹配器及共鳴箱、外殼等組成。有的壓電式蜂鳴器外殼上還裝有發(fā)光二極管。多諧振蕩器由晶體管或集成電路構(gòu)成。當(dāng)接通電源后(1.5~15V直流工作電壓),多諧振蕩器起振,輸出1.5~2.5kHZ的音頻信號(hào),阻抗匹配器推動(dòng)壓電蜂鳴片發(fā)聲。壓電蜂鳴片由鋯鈦酸鉛或鈮鎂酸鉛壓電陶瓷材料制成。</p><p> 圖十、蜂鳴器發(fā)聲電路</p><p> 由于驅(qū)動(dòng)蜂鳴器需要較大的電流,而
29、單片機(jī)89S52芯片所提供的電流并不足以驅(qū)動(dòng)蜂鳴器,所以要通大電流三極管來驅(qū)動(dòng)蜂鳴器。如圖十三所示,蜂鳴器一端接地,一端通過三極管接高電平。利用AT89S52單片機(jī)芯片輸出的信號(hào),通過三極管來驅(qū)動(dòng)蜂鳴器。</p><p><b> 2 單片機(jī)主程序</b></p><p> 圖十一、單片機(jī)主程序流程圖</p><p> 2.1程序運(yùn)行流程
30、說明</p><p> 當(dāng)給電路供電時(shí)首先是對(duì)單片機(jī)的串口通信以及定時(shí)器的初始化,以便程序能正確運(yùn)行。隨后程序開始調(diào)用溫度獲取函數(shù),從溫度傳感器中獲取當(dāng)前溫度。然后對(duì)當(dāng)前溫度進(jìn)行判斷,以便當(dāng)當(dāng)前的環(huán)境溫度超過溫度所設(shè)置的范圍時(shí),能夠及時(shí)對(duì)其進(jìn)行處理。監(jiān)測(cè)溫度完后便將當(dāng)前的溫度值送入到主機(jī)中,同時(shí)將其顯示到數(shù)碼管中,將溫度直觀化,方便人們對(duì)溫度的觀察與處理。</p><p> 如果需要更
31、改溫度的的上下限值,可以通過主機(jī)進(jìn)行設(shè)置。首先,先向從機(jī)發(fā)送“S”待主機(jī)出現(xiàn)提示后,根據(jù)提示輸入所需要設(shè)置的溫度值,點(diǎn)擊發(fā)送后,設(shè)置就完成了。輸入的數(shù)值必須用兩位數(shù)字來表示。(如:設(shè)置溫度為1度時(shí),則需輸入“01”。)</p><p><b> 2.2程序模塊說明</b></p><p> 本單片機(jī)程序由溫度獲取模塊(DS18B20Drive.c);數(shù)碼管顯示模塊
32、(NixieTubeDrive.c);</p><p> 串口通信模塊(RS232SerialPort.c);溫度監(jiān)測(cè)模塊(TemperatureChec.c);主程序(main.c)五大部分組成。</p><p> 以下部分程序?yàn)閱纹瑱C(jī)的主程序:</p><p> #include <reg52.H></p><p>
33、#include <intrins.h></p><p> #include "TypeDe.h"</p><p> sbit BEEP = P3^4 ; 設(shè)置P3.4引腳為蜂鳴器的控制引腳</p><p> bitUGFlag ;</p><p> uint8 US
34、E_C = 0 ;</p><p> void initT0( void ) ;</p><p> extern bitBFlag ;</p><p> extern bitWFlag ;</p><p> extern float Temp_V ;</p><p> extern
35、sint8 max_temp , min_temp ;</p><p> void main( void )</p><p><b> {</b></p><p> InitSerialP ( ) ; 初始化串口</p><p> initT0 ( ) ;
36、 初始化T0定時(shí)器</p><p> max_temp = 85 ; 設(shè)置初始默認(rèn)溫度上限值為85℃</p><p> min_temp = 0 ; 設(shè)置初始默認(rèn)溫度下限值為0℃</p><p> while ( 1 )</p><p><b> {</b>&l
37、t;/p><p> Temp_Chek ( ) ; 監(jiān)測(cè)環(huán)境溫度值是否超過溫度設(shè)置范圍</p><p> if( BFlag & WFlag )</p><p> BEEP = 1 ; 超過溫度設(shè)置的上限值,蜂鳴器一直響</p><p> else if ( BFlag &
38、!WFlag ) 低于溫度設(shè)置的下限值,蜂鳴器間斷的響</p><p> BEEP = ~BEEP ;</p><p> else BEEP = 0 ; 環(huán)境溫度在設(shè)置范圍內(nèi),蜂鳴器不鳴響</p><p> PC_Display( ) ; 將當(dāng)前溫度值發(fā)送到主機(jī)PC</p><p>
39、UGFlag = 0 ; </p><p> while( !UGFlag )</p><p><b> {</b></p><p><b> uint8i;</b></p><p> TemperatureUpdate( ) ; 重新獲取當(dāng)前環(huán)境溫度值&
40、lt;/p><p> for( i = 0 ; i<20 ; i++ )</p><p> LED_display( ) ; 數(shù)碼管顯示當(dāng)前溫度值</p><p><b> }</b></p><p><b> }</b></p><p><b
41、> }</b></p><p> /*開啟定時(shí)器 每秒更新一次溫度*/</p><p> void initT0( void )</p><p><b> {</b></p><p> TMOD|=0x01; //設(shè)置定時(shí)器T0為模式1</p><
42、p> TH0 = 0x4c ;//定時(shí)50ms</p><p> TL0 = 0x00 ;//</p><p> EA=1; //開總中斷</p><p> ET0=1; //允許定時(shí)/計(jì)數(shù)器1 中斷</p><p> TR0=1; //啟動(dòng)定時(shí)/計(jì)數(shù)器1 中
43、斷</p><p><b> } </b></p><p> void Send_Temp_to_PC( void ) interrupt 2</p><p><b> {</b></p><p> TH0 = 0x4c ;</p><p> TL0 = 0x00
44、;</p><p> if (++USE_C == 40) //每隔1秒更新一次當(dāng)前溫度值并發(fā)到PC</p><p><b> {</b></p><p> UGFlag = 1 ;</p><p> USE_C = 0 ;</p><p><b> }</b&g
45、t;</p><p><b> }</b></p><p><b> 4 電路運(yùn)行效果</b></p><p> 4.1從機(jī)運(yùn)行效果圖</p><p> 此圖為從機(jī)(溫度獲取端)的運(yùn)行效果圖,圖中數(shù)碼管顯示的環(huán)境溫度為29.1℃。</p><p> 圖十二 從機(jī)運(yùn)行
46、效果圖</p><p> 4.2主機(jī)端顯示效果圖</p><p> 此圖為主機(jī)端(PC平臺(tái))與從機(jī)通信后顯示的實(shí)時(shí)溫度情況。</p><p> 圖十三 主機(jī)端直觀顯示效果圖</p><p> 3 實(shí)際中遇到的問題與解決措施</p><p> 1)由于實(shí)現(xiàn)該溫度監(jiān)測(cè)警報(bào)功能的程序比較長,期間要經(jīng)常調(diào)用相關(guān)的子程
47、序,并出現(xiàn)了不少問題。后來我們結(jié)合程序流程圖,對(duì)相關(guān)程序部分進(jìn)行分析,找出錯(cuò)誤的地方并使用PROTUES軟件對(duì)所設(shè)計(jì)的電路和程序進(jìn)行模擬,這有助于我們對(duì)所編寫的程序?qū)崿F(xiàn)實(shí)時(shí)分析。</p><p> 2)而在實(shí)際焊接電路的過程中,我們采用的策略的分模塊焊接,每焊接好一個(gè)模塊就用儀器檢查焊接是否正確,這樣可以有效地減少出錯(cuò)的可能。特別是在整體電路焊接好,插上芯片之后,發(fā)現(xiàn)無法實(shí)現(xiàn)其邏輯功能。在這種情況下,我們還是分
48、模塊檢測(cè),對(duì)癥下藥,分析哪里處現(xiàn)問題,是電路問題還是元器件的問題。這樣做可以有效地提高我們解決問題的效率。</p><p> 3)在調(diào)試好程序和實(shí)際電路后,發(fā)現(xiàn)數(shù)碼顯示管的顯示比較暗。這是單片機(jī)輸出電流比較小的原因。所以我們?cè)跀?shù)碼管的輸入端通過三極管來連接高電平,拉高相關(guān)輸入電流,使得數(shù)碼管的亮度變亮。</p><p><b> 4 結(jié)束語</b></p&g
49、t;<p> 在這次的課程設(shè)計(jì)中,我們結(jié)合了所學(xué)的單片機(jī)和電路知識(shí),設(shè)計(jì)出滿足課程設(shè)計(jì)要求的溫度監(jiān)測(cè)警報(bào)與控制系統(tǒng)。在進(jìn)行課程設(shè)計(jì)的過程中,我們四組員四人查閱了很多文獻(xiàn),了解了AT89S52、MAX232芯片、DS18B20溫度傳感器的功能。拓展了我們的視野。通過本次的課程設(shè)計(jì),加深了我們對(duì)單片機(jī)的理解,使得我們更加熟悉單片機(jī)的程序編寫。特別是通過程序的調(diào)試,我們發(fā)現(xiàn)了很多程序編寫的壞習(xí)慣,例如使用中斷服務(wù)程序時(shí)沒有保護(hù)
50、好相關(guān)可能被改變的數(shù)據(jù)。</p><p> 我們所設(shè)計(jì)的溫度監(jiān)測(cè)警報(bào)與控制系統(tǒng)原理簡單,所用到的軟器件較少,而且是使用AT89S52單片機(jī)來實(shí)現(xiàn)控制功能,使得其相關(guān)功能或參數(shù)可以根據(jù)需要進(jìn)行修改。</p><p><b> 參考文獻(xiàn)</b></p><p> [1]胡少宏.主從式溫度測(cè)量控制系統(tǒng).網(wǎng)絡(luò)與通訊.1997(7).</p&
51、gt;<p> [2]康華光.電子技術(shù)基礎(chǔ)數(shù)字部分.高考教育出版社.2002.</p><p> [3] 李朝青.《單片機(jī)原理及接口技術(shù)》(第三版).北京航空航天大學(xué)出版社.2009.7 </p><p> 教師評(píng)語:
52、 </p><p> 教師簽名: </p><p> 批改日期: </p><p> 附件:(完整單片機(jī)程序)</p><p><b> 所有的子程序</b></p><p> void Delay
53、10Us_f( uint8 DT ) ;</p><p> uint8 Ds18b20Init_f( void );</p><p> void Ds18b20Write_Byte( uint8 Cmd );</p><p> uint8 Ds18b20Read_Byte( void );</p><p> u
54、int16 Ds18b20ReadTemp_f( void );</p><p> void TemperatureUpdate( void );</p><p> void LED_delay( uint8 i ) ;</p><p> void LED_display() ;</p><p> void InitS
55、erialP( void ) ;</p><p> void SendByte_SP( uint8 sbuf_Data );</p><p> uint8 GetByte_SP( void ) ;</p><p> void Send_Data_SP( uint8 *send_data , data_length ) ;</p><p
56、> void deal_Temp( void ) ;</p><p> void ser_int ( void ) ;</p><p> void PC_Dis_Temp( void );</p><p> void PC_Display( void ) ;</p><p> void Temp_Warn( void
57、 ) ;</p><p> void Temp_Chek ( void ) ;</p><p> /**********************************************************************</p><p> **************************************************
58、*********************</p><p> 程序名: 芯片DS18B20驅(qū)動(dòng)程序 </p><p><b> 自身函數(shù):</b></p><p> void Delay10Us_f( uint16 Count ) </p><p> uint8 Ds18b20Init_f(
59、void )</p><p> void Ds18b20Write_Byte( uint8 Cmd )</p><p> uint8 Ds18b20Read_Byte( void )</p><p> uint16 Ds18b20ReadTemp_f( void )</p><p> void Tempera
60、tureUpdate( void )</p><p><b> 全局變量:</b></p><p> uint16 idata TempDat 以十進(jìn)制形式保存所獲得溫度值</p><p> uint8 idata Temperature[ 4 ]保存溫度值的數(shù)組.依次存放正負(fù)標(biāo)志,溫度值十位,個(gè)位
61、,和小數(shù)位</p><p> 引用的外部函數(shù)或變量:</p><p><b> 無</b></p><p><b> 功能: </b></p><p> 對(duì) DS18B20 進(jìn)行初始化</p><p> 對(duì) DS18B20 進(jìn)行數(shù)據(jù)讀寫的操作。</p>
62、<p> 實(shí)現(xiàn)溫度的獲取。 </p><p> ***********************************************************************</p><p> ***********************************************************************/</p
63、><p> /* 以下為 DS18B20 的驅(qū)動(dòng)程序 */</p><p> #include <reg52.H></p><p> #include <intrins.h></p><p> #include "TypeDe.h"</p><p&
64、gt; /*定義芯片DS18B20的數(shù)據(jù)輸入輸出管腳*/</p><p> sbit Io_DS18B20_DQ = P3^6 ;</p><p> #define DS18B20_DQ_HIGH Io_DS18B20_DQ = 1 </p><p> #define DS18B20_DQ_LOWIo_DS18B20_DQ = 0 <
65、/p><p> #define DS18B20_DQ_READ Io_DS18B20_DQ </p><p> /* 函數(shù)聲明 */</p><p> void Delay10Us_f( uint8 DT ) ;</p><p> uint8 Ds18b20Init_f( void );</p&
66、gt;<p> void Ds18b20Write_Byte( uint8 Cmd );</p><p> uint8 Ds18b20Read_Byte( void );</p><p> uint16 Ds18b20ReadTemp_f( void );</p><p> void TemperatureUpdate( vo
67、id );</p><p> float Temp_V ;/*聲明以十進(jìn)制形式保存溫度值的變量 TempDat */</p><p> uint8 Temperature[ 4 ]; /*聲明保存溫度值的數(shù)組.依次存放正負(fù)標(biāo)志,溫度值十位,個(gè)位,和小</p><p><b> 數(shù)位*/</b></
68、p><p> /*函數(shù)名:Delay_10us*/</p><p> /*輸入:uint16 Count(延時(shí)的時(shí)間大?。?/</p><p> /*輸出: 無*/</p><p> /*功能:延時(shí)10uS函數(shù)*/</p><p> void Delay
69、10Us_f( uint8 DT ) </p><p><b> {</b></p><p> while( --DT>0 );</p><p><b> } </b></p><p> /*函數(shù)名:Ds18b20Init_f*/</p><p&g
70、t; /*輸入:無*/</p><p> /*輸出: uint8 Flag(復(fù)位成功與否標(biāo)志)*/</p><p> /*功能:初始化芯片DS18B20*/</p><p> uint8 Ds18b20Init_f( void ) </p><p><b> { </b>
71、;</p><p> bit Flag ; </p><p> DS18B20_DQ_HIGH ; /*稍作延時(shí)*/ </p><p> NOP ; </p><p> DS18B20_DQ_LOW ; //總線拉低 </p><p> Delay10U
72、s_f(50) ; //延時(shí)大于480us </p><p><b> NOP ;</b></p><p> DS18B20_DQ_HIGH ; //總線釋放 </p><p> Delay10Us_f(10) ; //等待DS18B02復(fù)位</p><p> Fl
73、ag = DS18B20_DQ_READ ; //如果Flag為0,則復(fù)位成功,否則復(fù)位失敗 </p><p> Delay10Us_f(15) ;</p><p><b> NOP ;</b></p><p><b> NOP ;</b></p><p> DS18B20_DQ
74、_HIGH ;</p><p> return Flag ; </p><p><b> } </b></p><p> /*函數(shù)名:Ds18b20Write_Byte( uint8 Cmd )*/</p><p> /*輸入:uint8 Cmd(需要寫入的命令)*/</p><
75、p> /*輸出: 無*/</p><p> /*功能:對(duì)芯片DS18B20進(jìn)行寫命令*/</p><p> void Ds18b20Write_Byte( uint8 Cmd ) </p><p><b> { </b></p><p> uint8 i ; </p
76、><p> for( i = 8 ; i > 0 ; i-- ) </p><p><b> { </b></p><p> DS18B20_DQ_LOW ;//拉低總線,開始寫時(shí)序</p><p> Delay10Us_f( 2 ) ; </p><
77、p> DS18B20_DQ_READ = Cmd & 0x01 ; //控制字的最低位先送到總線 </p><p> Delay10Us_f( 4 ) ; //稍作延時(shí),讓DS18B20讀取總線上的數(shù)據(jù) </p><p><b> NOP ;</b></p><p><b> NO
78、P ;</b></p><p> DS18B20_DQ_HIGH ; //拉高總線,1bit寫周期結(jié)束 </p><p> Cmd >>= 1 ; </p><p><b> } </b></p><p><b> } </b></p&
79、gt;<p> /*函數(shù)名:Ds18b20Read_Byte*/</p><p> /*輸入:無*/</p><p> /*輸出:ReadValue(從DS18B20讀取的數(shù)據(jù))*/</p><p> /*功能:從DS18B20中讀取一個(gè)字節(jié)的數(shù)據(jù)*/</p><p> uin
80、t8 Ds18b20Read_Byte( void ) </p><p><b> { </b></p><p> uint8 ReadValue = 0 , i ; </p><p> for( i = 8 ; i > 0 ; i-- ) </p><p><b> { </b>&l
81、t;/p><p> DS18B20_DQ_LOW ; </p><p> ReadValue >>= 1 ; </p><p> DS18B20_DQ_HIGH ;</p><p> if( DS18B20_DQ_READ == 1 ) </p><p> ReadValue |= 0x80 ;
82、</p><p> Delay10Us_f( 3 ) ; </p><p><b> } </b></p><p> return ReadValue ; </p><p><b> } </b></p><p> /*函數(shù)名:Ds18b20ReadTemp_f
83、*/</p><p> /*輸入:無 */</p><p> /*輸出: ReturnTemp(讀取的溫度值)*/</p><p> /*功能:讀取當(dāng)前的溫度數(shù)據(jù)(只保留一位小數(shù))*/</p><p> uint16 Ds18b20ReadTemp_f( void ) </p>
84、<p><b> { </b></p><p> uint8 TempH, TempL ; </p><p> uint16 ReturnTemp ; </p><p> /* if( v_Ds18b20Init_() ) return ; //復(fù)位失敗,添加錯(cuò)誤處理的代碼 */ </p>
85、<p> Ds18b20Init_f() ; //復(fù)位DS18B20 </p><p> Ds18b20Write_Byte( 0xcc ) ; //跳過ROM </p><p> Ds18b20Write_Byte( 0x44 ) ; //啟動(dòng)溫度轉(zhuǎn)換 </p><p> Ds18b
86、20Init_f() ; </p><p> Ds18b20Write_Byte( 0xcc ) ; //跳過ROM </p><p> Ds18b20Write_Byte( 0xbe ) ; //讀取DS18B20內(nèi)部的寄存器內(nèi)容 </p><p> TempL = Ds18b20Read_Byte( ) ;
87、 //讀溫度值低位(內(nèi)部RAM的第0個(gè)字節(jié)) </p><p> TempH = Ds18b20Read_Byte( ) ; //讀溫度值高位(內(nèi)部RAM的第1個(gè)字節(jié))</p><p> ReturnTemp = TempH ; </p><p> ReturnTemp <<= 8 ; </p><p&g
88、t; ReturnTemp |= TempL ; //溫度值放在變量ReturnTemp中 </p><p> return ReturnTemp ; </p><p><b> } </b></p><p> /*函數(shù)名:TemperatureUpdate_f*/</p><p>
89、 /*輸入:無*/</p><p> /*輸出: 無*/</p><p> /*功能:將讀取的溫度數(shù)據(jù)值轉(zhuǎn)化存放在數(shù)組Temperature(只保留了一位小數(shù))*/</p><p> void TemperatureUpdate( void ) </p><p><b> { </b>
90、;</p><p> uint16 TempDat ;</p><p> uint8 Tflag = 10 ; </p><p> float Temp ; </p><p> TempDat = Ds18b20ReadTemp_f() ; </p><p> if( TempDat & 0xf000
91、 ) </p><p><b> { </b></p><p> Tflag = 11 ; </p><p> TempDat = ~TempDat + 1 ; </p><p><b> } </b></p><p>
92、; Temp = TempDat * 0.0625 ;</p><p> Temp_V = Temp ; </p><p> TempDat = Temp * 10 ; </p><p> Temperature[ 0 ] = Tflag ; //溫度正負(fù)標(biāo)志 </p>
93、<p> Temperature[ 1 ] = TempDat / 100 ; //溫度十位值 </p><p> Temperature[ 2 ] = TempDat % 100 / 10 ; //溫度個(gè)位值 </p><p> Temperature[ 3 ] = TempDat % 10 ;//溫度小數(shù)位 </p><
94、p><b> }</b></p><p> &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
95、&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
96、&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
97、&&&&&&&&&&&&</p><p> /**********************************************************************</p><p> *******************************************
98、****************************</p><p> 程序名: 4位7段動(dòng)態(tài)數(shù)碼管顯示驅(qū)動(dòng)程序</p><p><b> 自身函數(shù):</b></p><p> void LED_delay( uint8 i ) ;</p><p> void LED_display() ;<
99、;/p><p><b> 全局變量:</b></p><p><b> 無</b></p><p> 引用的外部函數(shù)或變量:</p><p> extern idata Temperature[ 4 ];</p><p><b> 功能: </b>
100、;</p><p> 對(duì)數(shù)碼管進(jìn)行初始化;</p><p> 利用數(shù)碼管實(shí)現(xiàn)溫度的直觀顯示。 </p><p> ***********************************************************************</p><p> ***************************
101、********************************************/</p><p> #include <reg52.H></p><p> #include "TypeDe.h"</p><p> extern uint8Temperature[ 4 ]; //聲明Temperatu
102、re是外部數(shù)組</p><p> /* 函數(shù)聲明 */</p><p> void LED_delay( uint8 i ) ;</p><p> void LED_display() ;</p><p> /* 數(shù)組 Disp_Tab[] 存放的數(shù)據(jù)為 LED 顯示的字模, 共陰數(shù)碼管 0-9
103、 */ </p><p> uint8 code Disp_Tab[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};</p><p> uint8 code Disp_bit[]={0x01,0x02,0x04,0x08};// 數(shù)組 Disp_bit[] 數(shù)碼管位選值 </p&
104、gt;<p> /*函數(shù)名:LED_delay*/</p><p> /*輸入:uint8 i*/</p><p> /*輸出: 無*/</p><p> /*功能:數(shù)碼管顯示延時(shí)*/</p><p> void LED_delay( uint8 i )</
105、p><p><b> {</b></p><p><b> uint8 j;</b></p><p> for(i; i > 0; i--)</p><p> for(j = 200; j > 0; j--);</p><p><b> }<
106、/b></p><p> /*函數(shù)名:LED_display*/</p><p> /*輸入:uint8 LedOut[ 4 ]*/</p><p> /*輸出: 無*/</p><p> /*功能:將溫度輸出到數(shù)碼管*/</p><p> void LE
107、D_display()</p><p><b> {</b></p><p><b> uint8 i ;</b></p><p> uint8 LedOut[ 4 ] ;</p><p> LedOut[ 0 ]=Disp_Tab[Temperature[ 0 ]]; //溫度正負(fù)
108、標(biāo)志 </p><p> LedOut[ 1 ]=Disp_Tab[Temperature[ 1 ]]; //溫度十位值</p><p> LedOut[ 2 ]=Disp_Tab[Temperature[ 2 ]]; //溫度個(gè)位值</p><p> LedOut[ 3 ]=Disp_Tab[Temperature[ 3 ]]; //
109、溫度小數(shù)位</p><p> for( i=0 ; i<4 ; i++) </p><p><b> {</b></p><p> P0 = 0x00 ;</p><p> if( i == 2 )</p><p> LedOut[ i ] &= 0x7f ; </
110、p><p> P2 = LedOut[ i ] ;//使用查表法進(jìn)行段選</p><p> P0 = Disp_bit[ i ] ; //使用查表法進(jìn)行位選 </p><p> LED_delay( 5 ) ; //掃描間隔時(shí)間</p><p><b> }</b><
111、/p><p><b> }</b></p><p> &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&a
112、mp;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&a
113、mp;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&a
114、mp;&&&&&&&&&&&&&&</p><p> /**********************************************************************</p><p> ******************************
115、*****************************************</p><p> 程序名: RS232串口驅(qū)動(dòng)程序</p><p><b> 自身函數(shù):</b></p><p> void init_SerialP() ;</p><p> void SendByte_SP(u
116、int8 SByte) ;</p><p> uint8 GetByte_SP() ;</p><p> void Receive_TempDat() ;</p><p> void SendData_SerialP( uint8 *SData ) ;</p><p> void deal_Temp() ;</p>
117、<p><b> 全局變量:</b></p><p><b> uint8</b></p><p> uint8 idataFlag ;</p><p> sint8idatamax_temp ;</p><p> sint8 idatamin_temp ;<
118、/p><p> 引用的外部函數(shù)或變量:</p><p> void LED_display() ;</p><p><b> 功能: </b></p><p><b> 對(duì)串口進(jìn)行初始化;</b></p><p> 設(shè)置波特率為 9600 b/s 。</p>
119、;<p> 對(duì)串口通信的各種數(shù)據(jù)進(jìn)行處理。</p><p> 實(shí)現(xiàn)與 上位機(jī)( PC ) 的交互式通信。 </p><p> ***********************************************************************</p><p> **************************
120、*********************************************/</p><p> #include <REG52.H></p><p> #include "TypeDe.h"</p><p> extern uint8Temperature[ 4 ];</p><p>
121、 extern bitWFlag ;</p><p> externuint8PCFlag ;</p><p> void InitSerialP( void ) ;</p><p> void SendByte_SP( uint8 sbuf_Data );</p><p> uint8 GetByte_SP( vo
122、id ) ;</p><p> void Send_Data_SP( uint8 *send_data , data_length ) ;</p><p> void deal_Temp( void ) ;</p><p> void ser_int ( void ) ;</p><p> void PC_Dis_Temp(
123、void );</p><p> void PC_Display( void ) ;</p><p> void Temp_Warn( void ) ;</p><p> bit SFlag ;</p><p> uint8PCFlag ;</p><p> extern sint8 max_te
124、mp , min_temp ;</p><p> uint8 tempT[ 4 ] ;</p><p> uint8 ReData , SenData ;</p><p> uint8TTemperature[ 4 ] ;</p><p> uint8code Temp_max_T[ ] = "\n\nPlea
125、se enter the Max-tempareture volue,range from -10 to +85: " ;</p><p> uint8code Temp_min_T[ ] = "\n\nPlease enter the Min-tempareture volue,range from -10 to +85: " ;</p><p&g
126、t; uint8 codeSet_Temp[ ] = "\n\nNew tempareture range: " ;</p><p> uint8codePC_Dis_T[ ] = " \n\nThe current tempareture is : ";</p><p> uint8codeWarnTH[] = "\n
127、\nWarnning!\nThe temparature is too higt!" ;</p><p> uint8codeWarnTL[] = "\n\nWarnning!\nThe temparature is too low!" ;</p><p> uint8codeerror[ ] = "\n\nWrong Commond!&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 溫度監(jiān)測(cè)系統(tǒng)設(shè)計(jì)仿真與實(shí)現(xiàn)課程設(shè)計(jì)
- 溫度采集系統(tǒng)課程設(shè)計(jì)
- 溫度巡檢系統(tǒng)課程設(shè)計(jì)
- 溫度控制課程設(shè)計(jì)--數(shù)字溫度測(cè)量系統(tǒng)
- 多點(diǎn)溫度檢測(cè)系統(tǒng)課程設(shè)計(jì)
- 無線溫度采集系統(tǒng)課程設(shè)計(jì)
- 溫度控制系統(tǒng)課程設(shè)計(jì)
- 煤礦監(jiān)測(cè)系統(tǒng)課程設(shè)計(jì)
- 溫度采集顯示系統(tǒng)課程設(shè)計(jì)
- 課程設(shè)計(jì)---溫度控制系統(tǒng)設(shè)計(jì)
- 課程設(shè)計(jì)---溫度控制系統(tǒng)設(shè)計(jì)
- 溫度控制系統(tǒng)設(shè)計(jì)課程設(shè)計(jì)
- 微機(jī)課程設(shè)計(jì)---溫度控制系統(tǒng)
- 微機(jī)原理課程設(shè)計(jì)--- 溫度測(cè)控系統(tǒng)
- 溫度顯示控制系統(tǒng)課程設(shè)計(jì)
- 電子線路cad課程設(shè)計(jì)報(bào)告---環(huán)境溫度監(jiān)測(cè)系統(tǒng)
- 多路智能溫度測(cè)控系統(tǒng)設(shè)計(jì)_課程設(shè)計(jì)
- 課程設(shè)計(jì)---模擬溫度采集監(jiān)控系統(tǒng)
- 糧庫溫度測(cè)量顯示系統(tǒng)課程設(shè)計(jì)
- 數(shù)字溫度測(cè)量系統(tǒng)課程設(shè)計(jì)論文
評(píng)論
0/150
提交評(píng)論