版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 單 片 機(jī)</p><p><b> 課</b></p><p><b> 程</b></p><p><b> 設(shè)</b></p><p><b> 計(jì)</b></p><p> 設(shè)計(jì)題
2、目: 單 片 機(jī) 水 溫 控 制 系 統(tǒng)</p><p> 姓 名: </p><p> 班 級: 07 自 動 化(2)班 </p><p> 學(xué) 號: </p><p>
3、 指導(dǎo)教師: </p><p> 完成時間: 2010年6月25日 </p><p><b> 課程設(shè)計(jì)任務(wù)書</b></p><p> 教研室主任簽字: 年 </p
4、><p><b> 數(shù)字溫度計(jì)</b></p><p> 摘 要:本文介紹一種基于AT89C51單片機(jī)作為控制器、使用數(shù)字溫度傳感器DS18B20作為溫度采集器的數(shù)字溫度計(jì)。重點(diǎn)闡述了AT89C51的結(jié)構(gòu)性能和引腳功能,DS1B20的性能結(jié)構(gòu)、工作原理和控制方法,以及單片機(jī)AT89C51和數(shù)字溫度傳感器DS18B20之間的接口、數(shù)據(jù)傳遞。該數(shù)字溫度計(jì)能夠測出0—100
5、℃之間的溫度,適合日常生活、工業(yè)生產(chǎn)和科學(xué)研究等領(lǐng)域?qū)囟葴y量的需要。</p><p> 關(guān)鍵詞:溫度測量;DS18B20;AT89C51</p><p> Design of Digital Thermometer Based on AT89C51Abstract: A digital thermometer collection is designed, which uses SC
6、M AT89C51 as a controller, digital temperature sensor DS18B20 as temperature collector. The structure, pin and function of the AT89C51, the performance of the structure, working principle and control methods of DS1B20, a
7、nd the interface, data transmission between SCM AT89C51 and digital temperature sensor DS18B20 is introduced. This digital thermometer can detect the temperature fro</p><p> Key words: temperature measureme
8、nt; DS18B20; AT89C51</p><p><b> 1 引言</b></p><p> 數(shù)字溫度計(jì)采用溫度敏感元件也就是溫度傳感器(如鉑電阻,熱電偶,半導(dǎo)體,熱敏電阻等),將溫度的變化轉(zhuǎn)換成電信號的變化,如電壓和電流的變化,溫度變化和電信號的變化有一定的關(guān)系,如線性關(guān)系,一定的曲線關(guān)系等,這個電信號可以使用模數(shù)轉(zhuǎn)換的電路即AD轉(zhuǎn)換電路將模擬信號轉(zhuǎn)換
9、為數(shù)字信號,數(shù)字信號再送給處理單元,如單片機(jī)或者PC機(jī)等,處理單元經(jīng)過內(nèi)部的軟件計(jì)算將這個數(shù)字信號和溫度聯(lián)系起來,成為可以顯示出來的溫度數(shù)值,如25.0攝氏度,然后通過顯示單元,如LED,LCD或者電腦屏幕等顯示出來給人觀察。這樣就完成了數(shù)字溫度計(jì)的基本測溫功能。</p><p> 在日常生活及工農(nóng)業(yè)生產(chǎn)中經(jīng)常要用到溫度的檢測及控制,傳統(tǒng)的測溫元件有熱電偶和熱電阻。而熱電偶和熱電阻測出的一般都是電壓,再轉(zhuǎn)換成對
10、應(yīng)的溫度,需要比較多的外部硬件支持,硬件電路復(fù)雜,軟件調(diào)式復(fù)雜,制作成本高。</p><p> 隨著人們生活水平的不斷提高,單片機(jī)控制無疑是人們追求的目標(biāo)之一,它所給人帶來的方便也是不可否定的,其中數(shù)字溫度計(jì)就是一個典型的例子,但人們對它的要求越來越高,要為現(xiàn)代人工作、科研、生活、提供更好的更方便的設(shè)施就需要從數(shù)單片機(jī)技術(shù)入手,一切向著數(shù)字化控制,智能化控制方向發(fā)展。</p><p>
11、 本設(shè)計(jì)所介紹的數(shù)字溫度計(jì)與傳統(tǒng)的溫度計(jì)相比,具有讀數(shù)方便,測溫范圍廣,測溫準(zhǔn)確,其輸出溫度采用數(shù)字顯示,主要用于對測溫比較準(zhǔn)確的場所,或科研實(shí)驗(yàn)室使用,該設(shè)計(jì)控制器使用單片機(jī)STC89C51,測溫傳感器使用DS18B20,用3位共陽極LED數(shù)碼管以串口傳送數(shù)據(jù),實(shí)現(xiàn)溫度顯示,能準(zhǔn)確達(dá)到以上要求。</p><p><b> 2 方案論證</b></p><p>
12、在日常生活及工農(nóng)業(yè)生產(chǎn)中經(jīng)常要用到溫度的檢測及控制,傳統(tǒng)的測溫元件有熱電偶和熱電阻。而熱電偶和熱電組測出的一般都是電壓,再轉(zhuǎn)換成對應(yīng)得溫度,需要比較多的外部硬件支持,硬件電路復(fù)雜,軟件調(diào)試復(fù)雜,制作成本高。</p><p> 由于本設(shè)計(jì)是測溫電路,可以使用熱敏電阻之類的器件利用其感溫效應(yīng),在將隨被測溫度變化的電壓或電流采集過來,進(jìn)行A/D轉(zhuǎn)換后,就可以用單片機(jī)進(jìn)行數(shù)據(jù)的處理,在顯示電路上,就可以將被測溫度顯示出
13、來,這種設(shè)計(jì)需要用到A/D轉(zhuǎn)換電路,感溫電路比較麻煩。</p><p> 進(jìn)而考慮到用溫度傳感器,在單片機(jī)電路設(shè)計(jì)中,大多都是使用傳感器,所以這是非常容易想到的,所以可以采用一只溫度傳感器DS18B20,此傳感器,可以很容易直接讀取被測溫度值,進(jìn)行轉(zhuǎn)換,就可以滿足設(shè)計(jì)要求。</p><p> 本數(shù)字溫度計(jì)設(shè)計(jì)采用美國DALLAS半導(dǎo)體公司繼DS1820之后推出的一種改進(jìn)型智能溫度傳感器
14、DS1820作為檢測元件,測溫范圍為-55℃~125℃,分辨率最大可達(dá)0.0625℃。DS18B20可以直接讀出被測溫度值。而且采用3線制與單片機(jī)相連,減少了外部硬件電路,具有低成本和易使用的特點(diǎn)。</p><p> 按照系統(tǒng)設(shè)計(jì)功能的要求,確定系統(tǒng)由3個模塊組成:主控制器.測溫電路和顯示電路。數(shù)字溫度計(jì)總體電路結(jié)構(gòu)框圖如圖1所示。</p><p> 圖1 數(shù)字溫度計(jì)電路結(jié)構(gòu)框圖&l
15、t;/p><p> 3 系統(tǒng)硬件電路的設(shè)計(jì)</p><p> 溫度計(jì)電路設(shè)計(jì)原理圖如圖2所示,控制器使用單片機(jī)AT89C51,溫度傳感器使用DS18B20,用4位公陽LED數(shù)碼管以動態(tài)掃描法實(shí)現(xiàn)溫度顯示。</p><p> 圖2 數(shù)字溫度計(jì)設(shè)計(jì)電路圖</p><p><b> 3.1主控制器</b></p&g
16、t;<p> 單片機(jī)AT89C51具有低電壓供電和小體積等特點(diǎn),兩個端口剛好滿足電路系統(tǒng)的設(shè)計(jì)需要,很適合便攜式產(chǎn)品的設(shè)計(jì)使用,系統(tǒng)可用二節(jié)電池供電。</p><p><b> 3.2顯示電路</b></p><p> 顯示電路采用4位共陽LED數(shù)碼管,從P1口輸出段碼,列掃描用P3.0~P3.3來實(shí)現(xiàn),列驅(qū)動用74LS04非門。</p>
17、;<p> 3.3溫度傳感器工作原理</p><p> DS18B20溫度傳感器是美國DALLAS半導(dǎo)體公司最新推出的一種改進(jìn)型智能溫度傳感器,與傳統(tǒng)的熱敏電阻等測溫元件相比,它能直接讀出北側(cè)溫度,并且可根據(jù)實(shí)際要求通過簡單的編程實(shí)現(xiàn)9~12位的數(shù)字值讀數(shù)方式。DS18B20的性能特點(diǎn)如下:</p><p> ?、侏?dú)特的單線接口僅需要一個端口引腳進(jìn)行通信;</p&g
18、t;<p> ②多個DS18B20可以并聯(lián)在惟一的三線上,實(shí)現(xiàn)多點(diǎn)組網(wǎng)功能;</p><p><b> ③無須外部器件;</b></p><p> ?、芸赏ㄟ^數(shù)據(jù)線供電,電壓范圍為3.0~5.5V;</p><p><b> ?、萘愦龣C(jī)功能;</b></p><p> ⑥溫度以9
19、或12位數(shù)字量讀出;</p><p> ?、哂脩艨啥x的非易失性溫度報(bào)警設(shè)置;</p><p> ?、鄨?bào)警搜索命令識別并標(biāo)志超過程序限定溫度(溫度報(bào)警條件)的器件;</p><p> ⑨負(fù)電壓特性,電源極性接反時,溫度計(jì)不會因發(fā)熱而燒毀,但不能正常工作。</p><p> DS18B20采用3腳PR-35封裝或8腳SOIC封裝,其內(nèi)部結(jié)構(gòu)
20、框圖如圖3所示。</p><p> 圖3 DS18B20內(nèi)部結(jié)構(gòu)圖</p><p> 64位ROM的位結(jié)構(gòu)如圖4所示。開始8位是產(chǎn)品類型的編號,接著是每個器件的惟一的序號,共有48位,最后8位是前面56位的CRC檢驗(yàn)碼,這也是多個DS18B20可以采用一線進(jìn)行通信的原因。非易失性溫度報(bào)警器觸發(fā)器TH和TL,可通過軟件寫入戶報(bào)警上下限。</p><p> 圖4
21、 64位ROM結(jié)構(gòu)圖</p><p> DS18B20溫度傳感器的內(nèi)部存儲器還包括一個高速暫存RAM和一個非易失性的可擦除的EERAM。高速暫存RAM的結(jié)構(gòu)為8字節(jié)的存儲器,結(jié)構(gòu)如圖5所示。頭2個字節(jié)包含測得的溫度信息,第3和第4字節(jié)是TH和TL的拷貝,是易失的,每次上電復(fù)位時被刷新。第5個字節(jié)為配置寄存器,它的內(nèi)容用于確定溫度值的數(shù)字轉(zhuǎn)換分辨率。DS18B20工作時按此寄存器中的分辨率將溫度轉(zhuǎn)換為相應(yīng)精
22、度的數(shù)值。該字節(jié)各位的定義熱圖6所示。低5位一直為1,TM是測試模式位,用于設(shè)置DS18B20在工作模式還是在測試模式。在DS18B20出廠時該位被設(shè)置為0,用戶不要改動,R1和R0決定溫度轉(zhuǎn)換得精度位數(shù),即用來設(shè)置分辨率,定義方法見表1。</p><p> 表1 DS18B20分辨率的定義規(guī)定</p><p> 圖5 高速暫存RAM結(jié)構(gòu)圖</p><p&g
23、t;<b> 圖6 配置寄存器</b></p><p> 由表1可見,DS18B20溫度轉(zhuǎn)換的時間比較長,而且設(shè)定的分辨率越高,所需要的溫度轉(zhuǎn)換時間越長.因此,在實(shí)際應(yīng)用中要將分辨率和轉(zhuǎn)換時間權(quán)衡考慮.</p><p> 高速暫存RAM的第6,7,8字節(jié)保存未用,表現(xiàn)為邏輯1.第9字節(jié)讀出前面所有8字節(jié)的CRC碼,可用來檢驗(yàn)數(shù)據(jù),從而保證通信數(shù)據(jù)的正確性.&l
24、t;/p><p> 當(dāng)DS18B20接收溫度轉(zhuǎn)換命令后,開始啟動轉(zhuǎn)換.轉(zhuǎn)換完成后的溫度值就以16位帶符號擴(kuò)展的二進(jìn)制補(bǔ)碼形式存儲在高速暫存存儲器的第1,2字節(jié).單片機(jī)可以通過單線接口讀出數(shù)據(jù),讀數(shù)據(jù)時低位在先,高位在后,數(shù)據(jù)格式以0.0625℃/LSB形式表示.溫度值格式如圖7所示.</p><p> 圖7 溫度數(shù)據(jù)值格式</p><p> 當(dāng)符號位S=0時,表
25、示測得的溫度值為正值,可以直接將二進(jìn)制位轉(zhuǎn)換為十進(jìn)制;當(dāng)符號位S=1時,表示測得的溫度值為負(fù)值,要先將補(bǔ)碼轉(zhuǎn)換為原碼,再計(jì)算十進(jìn)制.表2是一部分溫度值對應(yīng)的二進(jìn)制溫度數(shù)據(jù).</p><p> 表2 DS18B20溫度與測得值對應(yīng)表</p><p> DS18B20完成溫度轉(zhuǎn)換后,就把測得的溫度值與RAM中的TH,TL字節(jié)內(nèi)容作比較.若T>TH或T<TL,則將該器件內(nèi)的報(bào)
26、警標(biāo)志置位,并對主機(jī)發(fā)出報(bào)警搜索命令作出響應(yīng).因此,可用多只DS18B20同時測量溫度并進(jìn)行報(bào)警搜索.</p><p> 在64位ROM的最高有效字節(jié)中存儲有循環(huán)冗余檢驗(yàn)碼(CRC).主機(jī)根據(jù)ROM的前56位來計(jì)算CRC值,并和存入DS18B20的CRC值作比較,以判斷主機(jī)收到ROM數(shù)據(jù)是否正確.</p><p> DS18B20的測溫原理如圖8所示.圖中第溫度系數(shù)晶振的震蕩頻率受溫度
27、的影響很小,用于產(chǎn)生固定頻率的脈沖送給減法計(jì)數(shù)器1;高溫度系數(shù)晶振隨溫度變化其震蕩頻率明顯改變,所產(chǎn)生的信號作為減法計(jì)數(shù)器2的脈沖輸入.圖中還隱含著計(jì)數(shù)門,當(dāng)計(jì)數(shù)門打開時,DS18B20就對低溫度系數(shù)震蕩器產(chǎn)生的時鐘脈沖計(jì)數(shù),進(jìn)而完成溫度測量.計(jì)數(shù)門的開啟時間由高溫度系數(shù)震蕩器來決定,每次測量前,首先將-55℃所對應(yīng)的一個基數(shù)分別置入減法計(jì)數(shù)器1,溫度寄存器中,減法計(jì)數(shù)器1和溫度寄存器被預(yù)置在-55℃所對應(yīng)的一個基數(shù)值.</p&g
28、t;<p> 減法計(jì)數(shù)器1所對低溫度系數(shù)晶振產(chǎn)生的脈沖信號進(jìn)行減法計(jì)數(shù),當(dāng)減法計(jì)數(shù)器1的預(yù)置值減到0時,溫度寄存器的值將加1,減法計(jì)數(shù)器1的預(yù)置值將被重新裝入,減法計(jì)數(shù)器1重新開始對低溫度系數(shù)晶振產(chǎn)生的脈沖信號進(jìn)行計(jì)數(shù),如此循環(huán)直到計(jì)數(shù)器2計(jì)數(shù)到0時,停止溫度寄存器值的累加,此時溫度寄存器中的數(shù)值就是所測溫度值.圖8中的斜率累加器用于補(bǔ)償和修正測溫過程中的非線形性,其輸出用于減法計(jì)數(shù)器的預(yù)置值,只要計(jì)數(shù)門仍未關(guān)閉就重復(fù)上
29、述過程,直到溫度寄存器值達(dá)到被預(yù)測值.</p><p> 另外,由于DS18B20單線通信功能是分時完成的,它有嚴(yán)格的時隙概念,因此讀寫時序很重要,系統(tǒng)對DS18B20的各種操作必須按協(xié)議進(jìn)行.操作協(xié)議為:初始化DS18B20→發(fā)ROM功能命令→發(fā)存儲器操作命令→處理數(shù)據(jù).</p><p> 圖8 DS18B20測溫原理圖</p><p> DS18B20可
30、以采用兩種方式供電,一種是采用電源供電方式,此時DS18B20的1腳接地,2腳作為信號線,3腳接電源.另一種是寄生電源供電方式,如圖9所示.單片機(jī)端口接單線總線,為為保證有效DS18B20時鐘周期內(nèi)提供足夠的電流,可用一個MOSFET管來完成對總線的上拉.</p><p> 圖9 DS18B20采用寄生電源的電路圖</p><p> 當(dāng)DS18B20處于寫存儲器操作和溫度A/D轉(zhuǎn)換操
31、作時,總線上必須有強(qiáng)的上拉,上拉開啟時間最大為10us.采用寄生電源供電方式時Vdd和GND端均接地.由于單線制只有一根線,因此發(fā)送接口必須是三態(tài)的.</p><p> 4 系統(tǒng)程序的設(shè)計(jì)</p><p> 系統(tǒng)程序主要包括主程序,讀出溫度子程序,溫度轉(zhuǎn)換命令子程序,計(jì)算溫度子程序,顯示數(shù)據(jù)刷新子程序等等.</p><p><b> 4.1主程序&
32、lt;/b></p><p> 主程序的主要功能是負(fù)責(zé)溫度的實(shí)時顯示,讀出并處理DS18B20的測量溫度值,溫度測量1s進(jìn)行一次,其程序流程圖見圖10.</p><p> 4.2讀出溫度子程序</p><p> 讀出溫度子程序的主要功能是讀出RAM中的9個字節(jié),在讀出時需進(jìn)行CRC校驗(yàn),校驗(yàn)有錯時不進(jìn)行溫度數(shù)據(jù)的改寫.其程序流程圖如圖11所示.</
33、p><p> 圖10 DS18B20溫度計(jì)主程序流程圖 圖11 讀出溫度子程序流程圖</p><p> 4.3溫度轉(zhuǎn)換命令子程序</p><p> 溫度轉(zhuǎn)換命令子程序主要是發(fā)溫度轉(zhuǎn)換開始命令,當(dāng)采用12分辨率時轉(zhuǎn)換時間為750ms,在本程序設(shè)計(jì)中采用1s顯示程序延時法等待轉(zhuǎn)換的完成.溫度轉(zhuǎn)換命令子程序流程圖如圖12所示 .</p>&l
34、t;p> 圖12 溫度轉(zhuǎn)換命令子程序流程圖 圖13 計(jì)算溫度子程序流程圖</p><p> 4.4計(jì)算溫度子程序</p><p> 計(jì)算溫度子程序?qū)AM中讀取值進(jìn)行BCD碼的轉(zhuǎn)換運(yùn)算,并進(jìn)行溫度值正負(fù)的判斷,其程序流程圖如圖13所示.</p><p> 4.5顯示數(shù)據(jù)刷新子程序</p><p> 顯示數(shù)據(jù)刷新子程序主
35、要是對顯示數(shù)據(jù)進(jìn)行刷新操作,當(dāng)最高顯示位為0時將符號顯示位移入下一位.程序流程圖如圖14所示. </p><p> 圖14 顯示數(shù)據(jù)刷新子程序流程圖</p><p> 4.6DS18B20的各個ROM命令</p><p> ⑴Read ROM[33H]</p><p> 這個命令允許總線控制器讀到DS18B20的8位系列編碼,
36、惟一的序列號和8位CRC碼。只有在總線上存在單只DS18B20的時候才能使用這個命令。如果總線上有不止一個從機(jī),當(dāng)所有從機(jī)試圖同時傳送信號時,就會發(fā)生數(shù)據(jù)沖突。</p><p> ?、芃atch ROM[55H]</p><p> 這個是匹配ROM命令,后跟64位ROM序列,讓總線控制器在多點(diǎn)總線上定位一只特定DS18B20,只有和64位ROM序列完全匹配的DS18B20才能響應(yīng)隨后的存
37、儲器操作。所有和64位ROM序列不匹配的從機(jī)都將等待復(fù)位脈沖。這條命令在總線上有單個或三個器件時都可以使用。</p><p> ?、荢kip ROM[0CCH]</p><p> 這條命令允許總線控制器不用提供64位ROM編碼就使用存儲器操作命令,在單點(diǎn)總線情況下,可以節(jié)省時間。如果總線上不止一個從機(jī),在Skip ROM命令之后跟著發(fā)一條讀命令,由于多個從機(jī)同時傳送信號。總線上就會發(fā)生數(shù)
38、據(jù)沖突。</p><p> ?、萐earch ROM[0F0H]</p><p> 當(dāng)一個系統(tǒng)初次啟動時,總線控制器可能并不知道單線總線上有多少器件或它們的64位ROM編碼。搜索ROM命令允許總線控制器用排除法識別總線所有從機(jī)的64位編碼。</p><p> ?、葾larm Search[0ech]</p><p> 這條命令的流程和Se
39、arch ROM相同。然而,只有在最近一次測溫后遇到符合報(bào)警條件的情況,DS18B20 才會響應(yīng)這條命令。報(bào)警條件定義為溫度高于TH或低于TL。只要DS18B20不掉電,報(bào)警狀態(tài)將一直保持,直到再一次測得的溫度值達(dá)不到報(bào)警條件。</p><p> ?、蔠rite Scratchpad[4EH]</p><p> 這個命令向DS18B20的暫存器TH和TL中寫入數(shù)據(jù)??梢栽谌魏螘r刻發(fā)出復(fù)位
40、命令來中止寫入。</p><p> ?、薘ead Scratchpad[0BEH]</p><p> 這個命令讀取暫存器的內(nèi)容。讀取將從第1個字節(jié)開始,一直進(jìn)行下去,直到第9個字節(jié)讀完。如果不想讀完所有字節(jié),控制器可以在任何時間發(fā)出復(fù)位命令來中止讀取。</p><p> ?、藽opy Scratchpad [48H]</p><p> 這
41、個命令把暫存器的內(nèi)容拷貝到DS18B20的EEROM存儲器里,即把溫度報(bào)警觸發(fā)字節(jié)存入非易失性存儲器里。如果總線控制器在這條命令之后跟著發(fā)出讀時間隙,而DS18B20又忙于把暫存器拷貝到EE存儲器,DS18B20就會輸出一個0,如果拷貝結(jié)束的話,DS18B20則輸出1。如果使用寄生電源,總線控制器必須在這條命令發(fā)出后立即啟動強(qiáng)上拉并最少保持10ms。</p><p> ?、虲onvert T[44H]</p
42、><p> 這條命令啟動一次溫度轉(zhuǎn)換而無需其它數(shù)據(jù)。溫度轉(zhuǎn)換命令被執(zhí)行,而后DS18B20保持等待狀態(tài)。如果總線控制器在這條命令之后跟著發(fā)出時間間隙,而DS18B20又忙于做時間轉(zhuǎn)換的話,DS18B20將在總線上輸出0,若溫度轉(zhuǎn)換完成,則輸出1。如果使用寄生電源,總線控制器必須在發(fā)出這條命令后立即啟動強(qiáng)上拉,并保持500ms以上時間。</p><p> ?、蜶ecall 、EE[0E8H]&
43、lt;/p><p> 這條命令把報(bào)警觸發(fā)器里的值拷貝回暫存器。這種拷貝操作在DS18B20上點(diǎn)時自動執(zhí)行,這樣器件以上電暫存器里馬上就存在有效的數(shù)據(jù)了。若這條命令發(fā)出之后發(fā)出數(shù)據(jù)隙,器件會輸出溫度轉(zhuǎn)換忙的標(biāo)識:0為忙,1為完成。</p><p> ⑾Read Power Supply[0b4h]</p><p> 若把這條命令發(fā)給DS18B20后發(fā)出讀時間隙,器件
44、會返回他的電源模式:0為寄生電源,1為外部電源。</p><p> 4.7溫度數(shù)據(jù)的計(jì)算處理方法</p><p> 從DS18B20讀取出的二進(jìn)制值必須先轉(zhuǎn)換成十進(jìn)制值,才能用于字符的顯示。因?yàn)镈S18B20的轉(zhuǎn)換精度為9~12位可選的,為了提高精度采用12位。在采用12位轉(zhuǎn)換精度時,溫度寄存器里的值是以0.0625為步進(jìn)的,即溫度值為溫度寄存器里的二進(jìn)制值乘以0.0625,就是實(shí)際的
45、十進(jìn)制溫度值。通過觀察表5.2可以發(fā)現(xiàn)一個十進(jìn)制值和二進(jìn)制值之間有很明顯的關(guān)系,就是把二進(jìn)制的高字節(jié)的低半字節(jié)和低字節(jié)的高半字節(jié)組成一個字節(jié),這個字節(jié)的二進(jìn)制值化為十進(jìn)制之后,就是溫度值的百、十、個位值,而剩下的低字節(jié)的低半字節(jié)化為十進(jìn)制后,就是溫度值得小數(shù)部分。小數(shù)部分因?yàn)槭前雮€字節(jié),所以二進(jìn)制值范圍是0~F,轉(zhuǎn)換成十進(jìn)制小數(shù)值就是0.0625的倍數(shù)(0~15倍)。這樣需要4位的數(shù)碼管來顯示小數(shù)部分,實(shí)際應(yīng)用不必有這么高的精度,采用1
46、位數(shù)碼管來顯示小數(shù)部分,實(shí)際應(yīng)用不必有這么高的精度,采用1位數(shù)碼管來顯示小數(shù),可以精確到0.1℃。表下就是二進(jìn)制和十進(jìn)制的近似對應(yīng)關(guān)系表。</p><p> 表3 小數(shù)部分二進(jìn)制和十進(jìn)制的近似對應(yīng)關(guān)系表</p><p> 5 調(diào)試及性能分析 </p><p> 系統(tǒng)的調(diào)試以程序?yàn)橹?,硬件調(diào)試比較簡單,首先檢查電路的焊接是否正確,然后可用萬用表測試或通電檢
47、測。軟件調(diào)試可以先編寫顯示程序并進(jìn)行硬件的正確性檢驗(yàn),然后分別進(jìn)行主程序、讀出溫度子程序、溫度轉(zhuǎn)換子程序、計(jì)算溫度子程序、顯示數(shù)據(jù)刷新等子程序的</p><p> 編程及調(diào)試,由于DS18B20與單片機(jī)采用串行數(shù)據(jù)傳送,因此,對DA18B20進(jìn)行讀寫編程時必須嚴(yán)格的保證讀寫時序,否則將無法讀取測量結(jié)果。本程序采用單片機(jī)匯編邊寫,用Keil C51編譯器編程調(diào)試。軟件調(diào)試到能顯示溫度值,而且在有溫度變化時(例如用
48、手去接觸)顯示溫度能改變就基本完成。</p><p> 性能測試可用制作的溫度計(jì)和已有的成品溫度計(jì)來同時測量比較,由于DS18B20的精度很高,所以誤差指標(biāo)可以限制在0.1℃以內(nèi),另外-55℃~+125℃的測量范圍使得該溫度計(jì)完全適合一般的應(yīng)用場合,其低電壓供電特性可做成用電池供電的手持溫度計(jì)。</p><p> DS18B20溫度計(jì)還可以在高低溫報(bào)警、遠(yuǎn)距離多點(diǎn)測溫控制等方面進(jìn)行應(yīng)用
49、開發(fā),但在實(shí)際設(shè)計(jì)中應(yīng)注意一下問題:</p><p> DS18B20工作時電流高達(dá)1.5mA,總線上掛節(jié)點(diǎn)數(shù)較多且同時進(jìn)行轉(zhuǎn)換時,要考慮增加總線驅(qū)動,可用單片機(jī)端口在溫度轉(zhuǎn)換時導(dǎo)通一個MODFET供電。</p><p> 連接DS18B20的總線電纜是有長度限制的,因此在用DS18B20進(jìn)行長距離測溫系統(tǒng)設(shè)計(jì)時,要充分考慮總線分布電容和阻抗匹配等問題。</p><
50、p> 在DS18B20測溫程序設(shè)計(jì)中,向DS18B20發(fā)出溫度轉(zhuǎn)換命令后,程序總要等待DS18B20的返回信號,一旦某個DS18B20接觸不好或短線,當(dāng)程序讀該DS18B20時,將沒有返回信號,程序進(jìn)行死循環(huán),這一點(diǎn)在進(jìn)行DS18B20硬件連接和軟件設(shè)計(jì)時要給予一定的重視。</p><p><b> 單片機(jī)程序:</b></p><p> #include
51、 <reg51.h> // 引用標(biāo)準(zhǔn)庫的頭文件</p><p> #include <intrins.h></p><p> #include <stdio.h></p><p> #include <DS18B.H></p><p> #define uchar unsi
52、gned char</p><p> #define uint unsigned int</p><p> sbit DIN=P1^0;// 串行數(shù)據(jù)輸入</p><p> sbit CLK=P1^1;// 串行時鐘</p><p> sbit LOAD=P1^2;// 顯示數(shù)據(jù)鎖存控制</p>
53、;<p> sbit SOUND=P1^4;</p><p> #define NoOp 0x00 // 空操作寄存器</p><p> #define Digit0 0x01 // 數(shù)碼管1寄存器</p><p> #define Digit1 0x02 // 數(shù)碼管2寄存器&l
54、t;/p><p> #define Digit2 0x03 // 數(shù)碼管3寄存器</p><p> #define Digit3 0x04 // 數(shù)碼管4寄存器</p><p> #define Digit4 0x05 // 數(shù)碼管5寄存器</p><p> #define Di
55、git5 0x06 // 數(shù)碼管6寄存器</p><p> #define Digit6 0x07 // 數(shù)碼管7寄存器</p><p> #define Digit7 0x08 // 數(shù)碼管8寄存器</p><p> #define DecodeMode 0x09 // 譯碼模式寄存器&
56、lt;/p><p> #define Intensity 0x0a // 亮度寄存器</p><p> #define ScanLimit 0x0b // 掃描位數(shù)寄存器</p><p> #define ShutDown 0x0c // 低功耗模式寄存器</p><p> #define Dis
57、playTest 0x0f // 顯示測試寄存器</p><p> #define ShutdownMode 0x00 // 低功耗方式</p><p> #define NormalOperation 0x01 // 正常操作方式</p><p> #define ScanDigit 0x07 // 掃描位
58、數(shù)設(shè)置,顯示8位數(shù)碼管</p><p> #define DecodeDigit 0xff // 譯碼設(shè)置,8位均為BCD碼</p><p> #define CommonDigit 0x00 // 譯碼設(shè)置,8位均為非譯碼方式</p><p> #define IntensityGrade 0x0a /
59、/ 亮度級別設(shè)置</p><p> #define TestMode 0x01 // 顯示測試模式</p><p> #define TextEnd 0x00 // 顯示測試結(jié)束,恢復(fù)正常工作模式</p><p> /* 將數(shù)字p轉(zhuǎn)換成相應(yīng)的具體段字母*/</p><p> uchar c
60、hangestyle(uint p)</p><p> { uchar c;</p><p> if(p==0) c=0x7e;</p><p> if(p==1) c=0x30;</p><p> if(p==2) c=0x6d;</p><p> if(p==3) c=0x79;</p>&
61、lt;p> if(p==4) c=0x33;</p><p> if(p==5) c=0x5b;</p><p> if(p==6) c=0x5f;</p><p> if(p==7) c=0x70;</p><p> if(p==8) c=0x7f;</p><p> if(p==9) c=0x7b
62、;</p><p> return(c);</p><p><b> }</b></p><p> /* 向MAX7219寫入字(16位)*/</p><p> void WriteWord (uchar addr,uchar num)</p><p><b> {</b
63、></p><p><b> LOAD=0;</b></p><p><b> _nop_();</b></p><p> SendChar(addr);</p><p><b> _nop_();</b></p><p> SendCh
64、ar(num);</p><p><b> _nop_();</b></p><p> LOAD=1;// 鎖存進(jìn)相應(yīng)寄存器</p><p><b> }</b></p><p> InitDisplay ();// MAX7219初始化</p><p&
65、gt;<b> _nop_();</b></p><p> a=degdata/10;</p><p> b=(degdata-a*10)/1;</p><p> c=(degdata-a*10-b)*10;</p><p> d=(degdata-a*10-b-c*0.1)*100;</p>&
66、lt;p> a=changestyle(a);</p><p> b=changestyle(b);</p><p> c=changestyle(c);</p><p> d=changestyle(d);</p><p><b> b=b|0x80;</b></p><p>
67、 WriteWord(Digit0,a);</p><p> WriteWord(Digit1,b);</p><p> WriteWord(Digit2,c);</p><p> WriteWord(Digit3,d);</p><p> WriteWord(Digit4,Fdata);</p><p>
68、WriteWord(Digit5,Sdata);</p><p> WriteWord(Digit6,Ddata);</p><p> WriteWord(Digit7,Hdata);</p><p><b> }</b></p><p> /* 以下保存為DS18B.H 再進(jìn)行編譯*/</p>&
69、lt;p> #define uint unsigned int</p><p> #define uchar unsigned char</p><p> #define uint unsigned int</p><p> #define ulong unsigned long</p><p> sbit DQ=P1^3;
70、</p><p> void delayus(uchar us)</p><p><b> {</b></p><p> while(us--); //12M,一次6us,加進(jìn)入退出14us(8M晶振,一次9us)</p><p><b> }</b></p><p>
71、; /* 延時t毫秒 */</p><p> void delayms(uint t)</p><p><b> {</b></p><p><b> uint i;</b></p><p> while(t--)</p><p><b> {</
72、b></p><p> /* 對于12M時鐘,約延時1ms */</p><p> for (i=0;i<123;i++)</p><p><b> {}</b></p><p><b> }</b></p><p><b> }</b&
73、gt;</p><p> /* 產(chǎn)生復(fù)位脈沖初始化DS18B20 ,DS18B20產(chǎn)生應(yīng)答信號,返回為1時可以用,為0時不能用*/</p><p> uint TxReset(void)</p><p><b> {</b></p><p><b> uint i,j;</b></p&
74、gt;<p><b> DQ = 0;</b></p><p> delayus(120); //拉低約900us</p><p> DQ=1;// 產(chǎn)生上升沿</p><p> delayus(6); //維護(hù)約24us //等待15-60us;</p><p> delay
75、us(11);</p><p><b> if(DQ==1)</b></p><p> return(0); //70US左右如果檢測到了DS18B20應(yīng)答脈沖則DQ比為1,否則為0</p><p> else return(1); //430US左右應(yīng)檢測到高電平,否則就表示DS18B20不工作</p><p
76、><b> }</b></p><p> /* 讀取數(shù)據(jù)的一位,滿足讀時隙要求 */</p><p> bit RdBit(void)</p><p><b> {</b></p><p><b> uint i;</b></p><p>
77、;<b> bit b;</b></p><p><b> DQ=1;</b></p><p><b> DQ=0;</b></p><p><b> i++;</b></p><p><b> DQ=1;</b></
78、p><p><b> i++;</b></p><p> i++; //產(chǎn)生下降沿b=DQ;</p><p> i=9; //讀時隙至少60US</p><p> while(i>0) i--;</p><p> return(b);</p&g
79、t;<p><b> }</b></p><p> /* 讀取數(shù)據(jù)的一個字節(jié) 8位 */</p><p> uchar RdByte(void)</p><p><b> {</b></p><p> uchar j,c;</p><p><b&
80、gt; uint i;</b></p><p> for(i=1;i<=8;i++)</p><p> {j = RdBit();</p><p> c = (j<<7)|(c>>1); //從高位開始讀取</p><p><b> }</b></p>
81、<p> return(c);</p><p><b> }</b></p><p> /* 寫數(shù)據(jù)的一個字節(jié),滿足寫1和寫0的時隙要求 */</p><p> void WrByte(uchar b)</p><p><b> {</b></p><p&g
82、t;<b> uint i;</b></p><p><b> uchar j;</b></p><p><b> bit btmp;</b></p><p> for(j=1;j<=8;j++)</p><p><b> {</b><
83、;/p><p> btmp = b&0x01;</p><p> b = b>>1;// 取下一位(由低位向高位)</p><p><b> if (btmp)</b></p><p><b> {</b></p><p><b> D
84、Q=0;</b></p><p><b> i++;</b></p><p> i++;// 延時,使得15us以內(nèi)拉高</p><p><b> DQ = 1;</b></p><p><b> i = 9;</b></p><p&g
85、t; while(i>0) i--;// 整個寫1時隙不低于60us</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><b> /* 寫0 */</b>
86、;</p><p><b> DQ = 0;</b></p><p><b> i = 9;</b></p><p> while(i>0) i--;// 保持低在60us到120us之間</p><p><b> DQ=1;</b></p>&l
87、t;p><b> i++;</b></p><p><b> i++;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p>&
88、lt;p> /* 啟動溫度轉(zhuǎn)換 如果DS18B20好使則轉(zhuǎn)換溫度。否則液晶顯示DS18B20有錯誤*/</p><p> void convert(void)</p><p><b> { uint i;</b></p><p> i=TxReset();</p><p> delayms(1);/
89、/ 延時</p><p><b> if(i==1)</b></p><p> {WrByte(0xcc);// skip rom 命令</p><p> WrByte(0x44);</p><p><b> }</b></p><p><b> }&
90、lt;/b></p><p> float change(uchar a,uchar b) //a為高字節(jié),b為低字節(jié)</p><p> {uint i,zhengfu;</p><p> bit k,p,f;</p><p> float re1=8,re2,re3=1,resu=0;</p><p>
91、; for(i=0;i<3;i++)</p><p> {k=a&0x01;</p><p> re1=re1*2;</p><p> if(k){resu=resu+re1;}</p><p><b> a=a>>1;</b></p><p><b>
92、; }</b></p><p> if(a&0x01) zhengfu=1;</p><p> else zhengfu=0;</p><p><b> re2=0.25;</b></p><p><b> b=b>>1;</b></p>&
93、lt;p><b> b=b>>1;</b></p><p> for(i=1;i<3;i++)</p><p> {p=b&0x01;</p><p><b> if(p)</b></p><p><b> {</b></p>
94、;<p> resu=resu+re2;</p><p><b> }</b></p><p><b> b=b>>1;</b></p><p> re2=re2*2;</p><p><b> }</b></p><p&
95、gt; if(b&0x01)resu=resu+1;</p><p><b> b=b>>1;</b></p><p> for(i=0;i<3;i++)</p><p> {f=b&0x01;</p><p> re3=re3*2;</p><p>
96、 if(f) resu=resu+re3;</p><p><b> b=b>>1;</b></p><p><b> }</b></p><p> return(resu);</p><p><b> }</b></p><p>&
97、lt;b> 6 心得體會</b></p><p> 單片機(jī)課程設(shè)計(jì)已經(jīng)結(jié)束了,雖然我們的課題比較難,但是我們還是通過大家的努力還是圓滿的完成了,通過這次課程設(shè)計(jì)期間使我對數(shù)電課上所學(xué)到的知識有了更深的認(rèn)識,并且把我們平時在電子這一方面所學(xué)到的知識有了一個綜合的運(yùn)用,使我們真正的從實(shí)踐掌握了DS18B20的各方面的知識。</p><p> 經(jīng)過一周的單片機(jī)課程設(shè)計(jì),
98、終于完成了我的數(shù)字溫度計(jì)的設(shè)計(jì),雖然沒有完全達(dá)到設(shè)計(jì)要求,但從心底里說,還是高興的,畢竟這次設(shè)計(jì)把實(shí)物都做了出來,高興之余不得不深思呀!</p><p> 在本次設(shè)計(jì)的過程中,我發(fā)現(xiàn)很多的問題,雖然以前還做過這樣的設(shè)計(jì)但這次設(shè)計(jì)真的讓我長進(jìn)了很多,單片機(jī)課程設(shè)計(jì)重點(diǎn)就在于軟件算法的設(shè)計(jì),需要有很巧妙的程序算法,雖然以前寫過幾次程序,但我覺的寫好一個程序并不是一件簡單的事,舉個例子,以前寫的那幾次,數(shù)據(jù)加減時,我
99、用的都是BCD碼,這一次,我全部用的都是16進(jìn)制的數(shù)直接加減,顯示處理時在用除法去刪分,感覺效果比較好,有好多的東西,只有我們?nèi)ピ囍隽?,才能真正的掌握,只學(xué)習(xí)理論有些東西是很難理解的,更談不上掌握。從這次的課程設(shè)計(jì)中,我真真正正的意識到,在以后的學(xué)習(xí)中,要理論聯(lián)系實(shí)際,把我們所學(xué)的理論知識用到實(shí)際當(dāng)中,學(xué)習(xí)單機(jī)片機(jī)更是如此,程序只有在經(jīng)常的寫與讀的過程中才能提高,這就是我在這次課程設(shè)計(jì)中的最大收獲。</p><p&
100、gt;<b> 參考文獻(xiàn)</b></p><p> [1] 李朝青.單片機(jī)原理及接口技術(shù)(簡明修訂版).杭州:北京航空航天大學(xué)出版社,1998</p><p> [2] 李廣弟.單片機(jī)基礎(chǔ)[M].北京:北京航空航天大學(xué)出版社,1994</p><p> [3] 閻石.數(shù)字電子技術(shù)基礎(chǔ)(第三版). 北京:高等教育出版社,1989</
101、p><p> [4] 廖常初.現(xiàn)場總線概述[J].電工技術(shù),1999.</p><p><b> 目錄</b></p><p><b> 1 引言3</b></p><p><b> 2 方案論證4</b></p><p> 3 系統(tǒng)硬件電路的
102、設(shè)計(jì)5</p><p><b> 3.1主控制器5</b></p><p><b> 3.2顯示電路5</b></p><p> 3.3溫度傳感器工作原理5</p><p> 4 系統(tǒng)程序的設(shè)計(jì)10</p><p><b> 4.1主程序10
103、</b></p><p> 4.2讀出溫度子程序10</p><p> 4.3溫度轉(zhuǎn)換命令子程序10</p><p> 4.4計(jì)算溫度子程序11</p><p> 4.5顯示數(shù)據(jù)刷新子程序11</p><p> 4.6DS18B20的各個ROM命令11</p><p&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于單片機(jī)的水溫控制系統(tǒng)課程設(shè)計(jì)
- 課程設(shè)計(jì)--基于單片機(jī)的水溫控制系統(tǒng)
- 基于單片機(jī)水溫控制系統(tǒng)
- 單片機(jī)課程設(shè)計(jì)---水溫控制器設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--水溫控制器設(shè)計(jì)
- 單片機(jī)水溫控制系統(tǒng)--畢業(yè)設(shè)計(jì)
- 基于單片機(jī)的水溫控制系統(tǒng)設(shè)計(jì)
- 基于單片機(jī)的水溫控制系統(tǒng)設(shè)計(jì)論文
- 基于單片機(jī)控制的水溫控制系統(tǒng)的設(shè)計(jì)
- 基于單片機(jī)的智能水溫控制系統(tǒng)
- 課程設(shè)計(jì)----水溫控制系統(tǒng)設(shè)計(jì)
- 基于單片機(jī)的水溫控制系統(tǒng)設(shè)計(jì)開題報(bào)告
- 基于單片機(jī)的水溫控制系統(tǒng)畢業(yè)設(shè)計(jì)
- 基于單片機(jī)的水溫控制系統(tǒng)設(shè)計(jì)開題報(bào)告
- 畢業(yè)設(shè)計(jì)----基于單片機(jī)的水溫控制系統(tǒng)設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)---基于單片機(jī)的水溫控制系統(tǒng)設(shè)計(jì)
- 基于單片機(jī)的水溫控制系統(tǒng)的畢業(yè)設(shè)計(jì)
- 開題報(bào)告基于單片機(jī)的智能水溫控制系統(tǒng)
- 單片機(jī)課程設(shè)計(jì)——單片機(jī)控制步進(jìn)電機(jī)控制系統(tǒng)設(shè)計(jì)
- 基于單片機(jī)的水溫控制系統(tǒng)畢業(yè)論文
評論
0/150
提交評論