2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p>  單 片 機</p><p><b>  課</b></p><p><b>  程</b></p><p><b>  設</b></p><p><b>  計</b></p><p>  設計題

2、目: 單 片 機 水 溫 控 制 系 統(tǒng)</p><p>  姓 名: </p><p>  班 級: 07 自 動 化(2)班 </p><p>  學 號: </p><p>

3、  指導教師: </p><p>  完成時間: 2010年6月25日 </p><p><b>  課程設計任務書</b></p><p>  教研室主任簽字: 年 </p

4、><p><b>  數(shù)字溫度計</b></p><p>  摘 要:本文介紹一種基于AT89C51單片機作為控制器、使用數(shù)字溫度傳感器DS18B20作為溫度采集器的數(shù)字溫度計。重點闡述了AT89C51的結構性能和引腳功能,DS1B20的性能結構、工作原理和控制方法,以及單片機AT89C51和數(shù)字溫度傳感器DS18B20之間的接口、數(shù)據(jù)傳遞。該數(shù)字溫度計能夠測出0—100

5、℃之間的溫度,適合日常生活、工業(yè)生產(chǎn)和科學研究等領域對溫度測量的需要。</p><p>  關鍵詞:溫度測量;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ù)字溫度計采用溫度敏感元件也就是溫度傳感器(如鉑電阻,熱電偶,半導體,熱敏電阻等),將溫度的變化轉換成電信號的變化,如電壓和電流的變化,溫度變化和電信號的變化有一定的關系,如線性關系,一定的曲線關系等,這個電信號可以使用模數(shù)轉換的電路即AD轉換電路將模擬信號轉換

9、為數(shù)字信號,數(shù)字信號再送給處理單元,如單片機或者PC機等,處理單元經(jīng)過內部的軟件計算將這個數(shù)字信號和溫度聯(lián)系起來,成為可以顯示出來的溫度數(shù)值,如25.0攝氏度,然后通過顯示單元,如LED,LCD或者電腦屏幕等顯示出來給人觀察。這樣就完成了數(shù)字溫度計的基本測溫功能。</p><p>  在日常生活及工農業(yè)生產(chǎn)中經(jīng)常要用到溫度的檢測及控制,傳統(tǒng)的測溫元件有熱電偶和熱電阻。而熱電偶和熱電阻測出的一般都是電壓,再轉換成對

10、應的溫度,需要比較多的外部硬件支持,硬件電路復雜,軟件調式復雜,制作成本高。</p><p>  隨著人們生活水平的不斷提高,單片機控制無疑是人們追求的目標之一,它所給人帶來的方便也是不可否定的,其中數(shù)字溫度計就是一個典型的例子,但人們對它的要求越來越高,要為現(xiàn)代人工作、科研、生活、提供更好的更方便的設施就需要從數(shù)單片機技術入手,一切向著數(shù)字化控制,智能化控制方向發(fā)展。</p><p> 

11、 本設計所介紹的數(shù)字溫度計與傳統(tǒng)的溫度計相比,具有讀數(shù)方便,測溫范圍廣,測溫準確,其輸出溫度采用數(shù)字顯示,主要用于對測溫比較準確的場所,或科研實驗室使用,該設計控制器使用單片機STC89C51,測溫傳感器使用DS18B20,用3位共陽極LED數(shù)碼管以串口傳送數(shù)據(jù),實現(xiàn)溫度顯示,能準確達到以上要求。</p><p><b>  2 方案論證</b></p><p>  

12、在日常生活及工農業(yè)生產(chǎn)中經(jīng)常要用到溫度的檢測及控制,傳統(tǒng)的測溫元件有熱電偶和熱電阻。而熱電偶和熱電組測出的一般都是電壓,再轉換成對應得溫度,需要比較多的外部硬件支持,硬件電路復雜,軟件調試復雜,制作成本高。</p><p>  由于本設計是測溫電路,可以使用熱敏電阻之類的器件利用其感溫效應,在將隨被測溫度變化的電壓或電流采集過來,進行A/D轉換后,就可以用單片機進行數(shù)據(jù)的處理,在顯示電路上,就可以將被測溫度顯示出

13、來,這種設計需要用到A/D轉換電路,感溫電路比較麻煩。</p><p>  進而考慮到用溫度傳感器,在單片機電路設計中,大多都是使用傳感器,所以這是非常容易想到的,所以可以采用一只溫度傳感器DS18B20,此傳感器,可以很容易直接讀取被測溫度值,進行轉換,就可以滿足設計要求。</p><p>  本數(shù)字溫度計設計采用美國DALLAS半導體公司繼DS1820之后推出的一種改進型智能溫度傳感器

14、DS1820作為檢測元件,測溫范圍為-55℃~125℃,分辨率最大可達0.0625℃。DS18B20可以直接讀出被測溫度值。而且采用3線制與單片機相連,減少了外部硬件電路,具有低成本和易使用的特點。</p><p>  按照系統(tǒng)設計功能的要求,確定系統(tǒng)由3個模塊組成:主控制器.測溫電路和顯示電路。數(shù)字溫度計總體電路結構框圖如圖1所示。</p><p>  圖1 數(shù)字溫度計電路結構框圖&l

15、t;/p><p>  3 系統(tǒng)硬件電路的設計</p><p>  溫度計電路設計原理圖如圖2所示,控制器使用單片機AT89C51,溫度傳感器使用DS18B20,用4位公陽LED數(shù)碼管以動態(tài)掃描法實現(xiàn)溫度顯示。</p><p>  圖2 數(shù)字溫度計設計電路圖</p><p><b>  3.1主控制器</b></p&g

16、t;<p>  單片機AT89C51具有低電壓供電和小體積等特點,兩個端口剛好滿足電路系統(tǒng)的設計需要,很適合便攜式產(chǎn)品的設計使用,系統(tǒng)可用二節(jié)電池供電。</p><p><b>  3.2顯示電路</b></p><p>  顯示電路采用4位共陽LED數(shù)碼管,從P1口輸出段碼,列掃描用P3.0~P3.3來實現(xiàn),列驅動用74LS04非門。</p>

17、;<p>  3.3溫度傳感器工作原理</p><p>  DS18B20溫度傳感器是美國DALLAS半導體公司最新推出的一種改進型智能溫度傳感器,與傳統(tǒng)的熱敏電阻等測溫元件相比,它能直接讀出北側溫度,并且可根據(jù)實際要求通過簡單的編程實現(xiàn)9~12位的數(shù)字值讀數(shù)方式。DS18B20的性能特點如下:</p><p> ?、侏毺氐膯尉€接口僅需要一個端口引腳進行通信;</p&g

18、t;<p>  ②多個DS18B20可以并聯(lián)在惟一的三線上,實現(xiàn)多點組網(wǎng)功能;</p><p><b> ?、蹮o須外部器件;</b></p><p> ?、芸赏ㄟ^數(shù)據(jù)線供電,電壓范圍為3.0~5.5V;</p><p><b> ?、萘愦龣C功能;</b></p><p> ?、逌囟纫?

19、或12位數(shù)字量讀出;</p><p>  ⑦用戶可定義的非易失性溫度報警設置;</p><p> ?、鄨缶阉髅钭R別并標志超過程序限定溫度(溫度報警條件)的器件;</p><p> ?、嶝撾妷禾匦?,電源極性接反時,溫度計不會因發(fā)熱而燒毀,但不能正常工作。</p><p>  DS18B20采用3腳PR-35封裝或8腳SOIC封裝,其內部結構

20、框圖如圖3所示。</p><p>  圖3 DS18B20內部結構圖</p><p>  64位ROM的位結構如圖4所示。開始8位是產(chǎn)品類型的編號,接著是每個器件的惟一的序號,共有48位,最后8位是前面56位的CRC檢驗碼,這也是多個DS18B20可以采用一線進行通信的原因。非易失性溫度報警器觸發(fā)器TH和TL,可通過軟件寫入戶報警上下限。</p><p>  圖4

21、 64位ROM結構圖</p><p>  DS18B20溫度傳感器的內部存儲器還包括一個高速暫存RAM和一個非易失性的可擦除的EERAM。高速暫存RAM的結構為8字節(jié)的存儲器,結構如圖5所示。頭2個字節(jié)包含測得的溫度信息,第3和第4字節(jié)是TH和TL的拷貝,是易失的,每次上電復位時被刷新。第5個字節(jié)為配置寄存器,它的內容用于確定溫度值的數(shù)字轉換分辨率。DS18B20工作時按此寄存器中的分辨率將溫度轉換為相應精

22、度的數(shù)值。該字節(jié)各位的定義熱圖6所示。低5位一直為1,TM是測試模式位,用于設置DS18B20在工作模式還是在測試模式。在DS18B20出廠時該位被設置為0,用戶不要改動,R1和R0決定溫度轉換得精度位數(shù),即用來設置分辨率,定義方法見表1。</p><p>  表1 DS18B20分辨率的定義規(guī)定</p><p>  圖5 高速暫存RAM結構圖</p><p&g

23、t;<b>  圖6 配置寄存器</b></p><p>  由表1可見,DS18B20溫度轉換的時間比較長,而且設定的分辨率越高,所需要的溫度轉換時間越長.因此,在實際應用中要將分辨率和轉換時間權衡考慮.</p><p>  高速暫存RAM的第6,7,8字節(jié)保存未用,表現(xiàn)為邏輯1.第9字節(jié)讀出前面所有8字節(jié)的CRC碼,可用來檢驗數(shù)據(jù),從而保證通信數(shù)據(jù)的正確性.&l

24、t;/p><p>  當DS18B20接收溫度轉換命令后,開始啟動轉換.轉換完成后的溫度值就以16位帶符號擴展的二進制補碼形式存儲在高速暫存存儲器的第1,2字節(jié).單片機可以通過單線接口讀出數(shù)據(jù),讀數(shù)據(jù)時低位在先,高位在后,數(shù)據(jù)格式以0.0625℃/LSB形式表示.溫度值格式如圖7所示.</p><p>  圖7 溫度數(shù)據(jù)值格式</p><p>  當符號位S=0時,表

25、示測得的溫度值為正值,可以直接將二進制位轉換為十進制;當符號位S=1時,表示測得的溫度值為負值,要先將補碼轉換為原碼,再計算十進制.表2是一部分溫度值對應的二進制溫度數(shù)據(jù).</p><p>  表2 DS18B20溫度與測得值對應表</p><p>  DS18B20完成溫度轉換后,就把測得的溫度值與RAM中的TH,TL字節(jié)內容作比較.若T>TH或T<TL,則將該器件內的報

26、警標志置位,并對主機發(fā)出報警搜索命令作出響應.因此,可用多只DS18B20同時測量溫度并進行報警搜索.</p><p>  在64位ROM的最高有效字節(jié)中存儲有循環(huán)冗余檢驗碼(CRC).主機根據(jù)ROM的前56位來計算CRC值,并和存入DS18B20的CRC值作比較,以判斷主機收到ROM數(shù)據(jù)是否正確.</p><p>  DS18B20的測溫原理如圖8所示.圖中第溫度系數(shù)晶振的震蕩頻率受溫度

27、的影響很小,用于產(chǎn)生固定頻率的脈沖送給減法計數(shù)器1;高溫度系數(shù)晶振隨溫度變化其震蕩頻率明顯改變,所產(chǎn)生的信號作為減法計數(shù)器2的脈沖輸入.圖中還隱含著計數(shù)門,當計數(shù)門打開時,DS18B20就對低溫度系數(shù)震蕩器產(chǎn)生的時鐘脈沖計數(shù),進而完成溫度測量.計數(shù)門的開啟時間由高溫度系數(shù)震蕩器來決定,每次測量前,首先將-55℃所對應的一個基數(shù)分別置入減法計數(shù)器1,溫度寄存器中,減法計數(shù)器1和溫度寄存器被預置在-55℃所對應的一個基數(shù)值.</p&g

28、t;<p>  減法計數(shù)器1所對低溫度系數(shù)晶振產(chǎn)生的脈沖信號進行減法計數(shù),當減法計數(shù)器1的預置值減到0時,溫度寄存器的值將加1,減法計數(shù)器1的預置值將被重新裝入,減法計數(shù)器1重新開始對低溫度系數(shù)晶振產(chǎn)生的脈沖信號進行計數(shù),如此循環(huán)直到計數(shù)器2計數(shù)到0時,停止溫度寄存器值的累加,此時溫度寄存器中的數(shù)值就是所測溫度值.圖8中的斜率累加器用于補償和修正測溫過程中的非線形性,其輸出用于減法計數(shù)器的預置值,只要計數(shù)門仍未關閉就重復上

29、述過程,直到溫度寄存器值達到被預測值.</p><p>  另外,由于DS18B20單線通信功能是分時完成的,它有嚴格的時隙概念,因此讀寫時序很重要,系統(tǒng)對DS18B20的各種操作必須按協(xié)議進行.操作協(xié)議為:初始化DS18B20→發(fā)ROM功能命令→發(fā)存儲器操作命令→處理數(shù)據(jù).</p><p>  圖8 DS18B20測溫原理圖</p><p>  DS18B20可

30、以采用兩種方式供電,一種是采用電源供電方式,此時DS18B20的1腳接地,2腳作為信號線,3腳接電源.另一種是寄生電源供電方式,如圖9所示.單片機端口接單線總線,為為保證有效DS18B20時鐘周期內提供足夠的電流,可用一個MOSFET管來完成對總線的上拉.</p><p>  圖9 DS18B20采用寄生電源的電路圖</p><p>  當DS18B20處于寫存儲器操作和溫度A/D轉換操

31、作時,總線上必須有強的上拉,上拉開啟時間最大為10us.采用寄生電源供電方式時Vdd和GND端均接地.由于單線制只有一根線,因此發(fā)送接口必須是三態(tài)的.</p><p>  4 系統(tǒng)程序的設計</p><p>  系統(tǒng)程序主要包括主程序,讀出溫度子程序,溫度轉換命令子程序,計算溫度子程序,顯示數(shù)據(jù)刷新子程序等等.</p><p><b>  4.1主程序&

32、lt;/b></p><p>  主程序的主要功能是負責溫度的實時顯示,讀出并處理DS18B20的測量溫度值,溫度測量1s進行一次,其程序流程圖見圖10.</p><p>  4.2讀出溫度子程序</p><p>  讀出溫度子程序的主要功能是讀出RAM中的9個字節(jié),在讀出時需進行CRC校驗,校驗有錯時不進行溫度數(shù)據(jù)的改寫.其程序流程圖如圖11所示.</

33、p><p>  圖10 DS18B20溫度計主程序流程圖 圖11 讀出溫度子程序流程圖</p><p>  4.3溫度轉換命令子程序</p><p>  溫度轉換命令子程序主要是發(fā)溫度轉換開始命令,當采用12分辨率時轉換時間為750ms,在本程序設計中采用1s顯示程序延時法等待轉換的完成.溫度轉換命令子程序流程圖如圖12所示 .</p>&l

34、t;p>  圖12 溫度轉換命令子程序流程圖 圖13 計算溫度子程序流程圖</p><p>  4.4計算溫度子程序</p><p>  計算溫度子程序將RAM中讀取值進行BCD碼的轉換運算,并進行溫度值正負的判斷,其程序流程圖如圖13所示.</p><p>  4.5顯示數(shù)據(jù)刷新子程序</p><p>  顯示數(shù)據(jù)刷新子程序主

35、要是對顯示數(shù)據(jù)進行刷新操作,當最高顯示位為0時將符號顯示位移入下一位.程序流程圖如圖14所示. </p><p>  圖14 顯示數(shù)據(jù)刷新子程序流程圖</p><p>  4.6DS18B20的各個ROM命令</p><p> ?、臨ead ROM[33H]</p><p>  這個命令允許總線控制器讀到DS18B20的8位系列編碼,

36、惟一的序列號和8位CRC碼。只有在總線上存在單只DS18B20的時候才能使用這個命令。如果總線上有不止一個從機,當所有從機試圖同時傳送信號時,就會發(fā)生數(shù)據(jù)沖突。</p><p> ?、芃atch ROM[55H]</p><p>  這個是匹配ROM命令,后跟64位ROM序列,讓總線控制器在多點總線上定位一只特定DS18B20,只有和64位ROM序列完全匹配的DS18B20才能響應隨后的存

37、儲器操作。所有和64位ROM序列不匹配的從機都將等待復位脈沖。這條命令在總線上有單個或三個器件時都可以使用。</p><p> ?、荢kip ROM[0CCH]</p><p>  這條命令允許總線控制器不用提供64位ROM編碼就使用存儲器操作命令,在單點總線情況下,可以節(jié)省時間。如果總線上不止一個從機,在Skip ROM命令之后跟著發(fā)一條讀命令,由于多個從機同時傳送信號??偩€上就會發(fā)生數(shù)

38、據(jù)沖突。</p><p> ?、萐earch ROM[0F0H]</p><p>  當一個系統(tǒng)初次啟動時,總線控制器可能并不知道單線總線上有多少器件或它們的64位ROM編碼。搜索ROM命令允許總線控制器用排除法識別總線所有從機的64位編碼。</p><p> ?、葾larm Search[0ech]</p><p>  這條命令的流程和Se

39、arch ROM相同。然而,只有在最近一次測溫后遇到符合報警條件的情況,DS18B20 才會響應這條命令。報警條件定義為溫度高于TH或低于TL。只要DS18B20不掉電,報警狀態(tài)將一直保持,直到再一次測得的溫度值達不到報警條件。</p><p> ?、蔠rite Scratchpad[4EH]</p><p>  這個命令向DS18B20的暫存器TH和TL中寫入數(shù)據(jù)。可以在任何時刻發(fā)出復位

40、命令來中止寫入。</p><p>  ⑺Read Scratchpad[0BEH]</p><p>  這個命令讀取暫存器的內容。讀取將從第1個字節(jié)開始,一直進行下去,直到第9個字節(jié)讀完。如果不想讀完所有字節(jié),控制器可以在任何時間發(fā)出復位命令來中止讀取。</p><p> ?、藽opy Scratchpad [48H]</p><p>  這

41、個命令把暫存器的內容拷貝到DS18B20的EEROM存儲器里,即把溫度報警觸發(fā)字節(jié)存入非易失性存儲器里。如果總線控制器在這條命令之后跟著發(fā)出讀時間隙,而DS18B20又忙于把暫存器拷貝到EE存儲器,DS18B20就會輸出一個0,如果拷貝結束的話,DS18B20則輸出1。如果使用寄生電源,總線控制器必須在這條命令發(fā)出后立即啟動強上拉并最少保持10ms。</p><p>  ⑼Convert T[44H]</p

42、><p>  這條命令啟動一次溫度轉換而無需其它數(shù)據(jù)。溫度轉換命令被執(zhí)行,而后DS18B20保持等待狀態(tài)。如果總線控制器在這條命令之后跟著發(fā)出時間間隙,而DS18B20又忙于做時間轉換的話,DS18B20將在總線上輸出0,若溫度轉換完成,則輸出1。如果使用寄生電源,總線控制器必須在發(fā)出這條命令后立即啟動強上拉,并保持500ms以上時間。</p><p> ?、蜶ecall 、EE[0E8H]&

43、lt;/p><p>  這條命令把報警觸發(fā)器里的值拷貝回暫存器。這種拷貝操作在DS18B20上點時自動執(zhí)行,這樣器件以上電暫存器里馬上就存在有效的數(shù)據(jù)了。若這條命令發(fā)出之后發(fā)出數(shù)據(jù)隙,器件會輸出溫度轉換忙的標識:0為忙,1為完成。</p><p>  ⑾Read Power Supply[0b4h]</p><p>  若把這條命令發(fā)給DS18B20后發(fā)出讀時間隙,器件

44、會返回他的電源模式:0為寄生電源,1為外部電源。</p><p>  4.7溫度數(shù)據(jù)的計算處理方法</p><p>  從DS18B20讀取出的二進制值必須先轉換成十進制值,才能用于字符的顯示。因為DS18B20的轉換精度為9~12位可選的,為了提高精度采用12位。在采用12位轉換精度時,溫度寄存器里的值是以0.0625為步進的,即溫度值為溫度寄存器里的二進制值乘以0.0625,就是實際的

45、十進制溫度值。通過觀察表5.2可以發(fā)現(xiàn)一個十進制值和二進制值之間有很明顯的關系,就是把二進制的高字節(jié)的低半字節(jié)和低字節(jié)的高半字節(jié)組成一個字節(jié),這個字節(jié)的二進制值化為十進制之后,就是溫度值的百、十、個位值,而剩下的低字節(jié)的低半字節(jié)化為十進制后,就是溫度值得小數(shù)部分。小數(shù)部分因為是半個字節(jié),所以二進制值范圍是0~F,轉換成十進制小數(shù)值就是0.0625的倍數(shù)(0~15倍)。這樣需要4位的數(shù)碼管來顯示小數(shù)部分,實際應用不必有這么高的精度,采用1

46、位數(shù)碼管來顯示小數(shù)部分,實際應用不必有這么高的精度,采用1位數(shù)碼管來顯示小數(shù),可以精確到0.1℃。表下就是二進制和十進制的近似對應關系表。</p><p>  表3 小數(shù)部分二進制和十進制的近似對應關系表</p><p>  5 調試及性能分析 </p><p>  系統(tǒng)的調試以程序為主,硬件調試比較簡單,首先檢查電路的焊接是否正確,然后可用萬用表測試或通電檢

47、測。軟件調試可以先編寫顯示程序并進行硬件的正確性檢驗,然后分別進行主程序、讀出溫度子程序、溫度轉換子程序、計算溫度子程序、顯示數(shù)據(jù)刷新等子程序的</p><p>  編程及調試,由于DS18B20與單片機采用串行數(shù)據(jù)傳送,因此,對DA18B20進行讀寫編程時必須嚴格的保證讀寫時序,否則將無法讀取測量結果。本程序采用單片機匯編邊寫,用Keil C51編譯器編程調試。軟件調試到能顯示溫度值,而且在有溫度變化時(例如用

48、手去接觸)顯示溫度能改變就基本完成。</p><p>  性能測試可用制作的溫度計和已有的成品溫度計來同時測量比較,由于DS18B20的精度很高,所以誤差指標可以限制在0.1℃以內,另外-55℃~+125℃的測量范圍使得該溫度計完全適合一般的應用場合,其低電壓供電特性可做成用電池供電的手持溫度計。</p><p>  DS18B20溫度計還可以在高低溫報警、遠距離多點測溫控制等方面進行應用

49、開發(fā),但在實際設計中應注意一下問題:</p><p>  DS18B20工作時電流高達1.5mA,總線上掛節(jié)點數(shù)較多且同時進行轉換時,要考慮增加總線驅動,可用單片機端口在溫度轉換時導通一個MODFET供電。</p><p>  連接DS18B20的總線電纜是有長度限制的,因此在用DS18B20進行長距離測溫系統(tǒng)設計時,要充分考慮總線分布電容和阻抗匹配等問題。</p><

50、p>  在DS18B20測溫程序設計中,向DS18B20發(fā)出溫度轉換命令后,程序總要等待DS18B20的返回信號,一旦某個DS18B20接觸不好或短線,當程序讀該DS18B20時,將沒有返回信號,程序進行死循環(huán),這一點在進行DS18B20硬件連接和軟件設計時要給予一定的重視。</p><p><b>  單片機程序:</b></p><p>  #include

51、 <reg51.h> // 引用標準庫的頭文件</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ù)設置,顯示8位數(shù)碼管</p><p>  #define DecodeDigit 0xff // 譯碼設置,8位均為BCD碼</p><p>  #define CommonDigit 0x00 // 譯碼設置,8位均為非譯碼方式</p><p>  #define IntensityGrade 0x0a /

59、/ 亮度級別設置</p><p>  #define TestMode 0x01 // 顯示測試模式</p><p>  #define TextEnd 0x00 // 顯示測試結束,恢復正常工作模式</p><p>  /* 將數(shù)字p轉換成相應的具體段字母*/</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;// 鎖存進相應寄存器</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 再進行編譯*/</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,加進入退出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)生復位脈沖初始化DS18B20 ,DS18B20產(chǎn)生應答信號,返回為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); //維護約24us //等待15-60us;</p><p>  delay

75、us(11);</p><p><b>  if(DQ==1)</b></p><p>  return(0); //70US左右如果檢測到了DS18B20應答脈沖則DQ比為1,否則為0</p><p>  else return(1); //430US左右應檢測到高電平,否則就表示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以內拉高</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>  /* 啟動溫度轉換 如果DS18B20好使則轉換溫度。否則液晶顯示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īng)結束了,雖然我們的課題比較難,但是我們還是通過大家的努力還是圓滿的完成了,通過這次課程設計期間使我對數(shù)電課上所學到的知識有了更深的認識,并且把我們平時在電子這一方面所學到的知識有了一個綜合的運用,使我們真正的從實踐掌握了DS18B20的各方面的知識。</p><p>  經(jīng)過一周的單片機課程設計,

98、終于完成了我的數(shù)字溫度計的設計,雖然沒有完全達到設計要求,但從心底里說,還是高興的,畢竟這次設計把實物都做了出來,高興之余不得不深思呀!</p><p>  在本次設計的過程中,我發(fā)現(xiàn)很多的問題,雖然以前還做過這樣的設計但這次設計真的讓我長進了很多,單片機課程設計重點就在于軟件算法的設計,需要有很巧妙的程序算法,雖然以前寫過幾次程序,但我覺的寫好一個程序并不是一件簡單的事,舉個例子,以前寫的那幾次,數(shù)據(jù)加減時,我

99、用的都是BCD碼,這一次,我全部用的都是16進制的數(shù)直接加減,顯示處理時在用除法去刪分,感覺效果比較好,有好多的東西,只有我們去試著做了,才能真正的掌握,只學習理論有些東西是很難理解的,更談不上掌握。從這次的課程設計中,我真真正正的意識到,在以后的學習中,要理論聯(lián)系實際,把我們所學的理論知識用到實際當中,學習單機片機更是如此,程序只有在經(jīng)常的寫與讀的過程中才能提高,這就是我在這次課程設計中的最大收獲。</p><p&

100、gt;<b>  參考文獻</b></p><p>  [1] 李朝青.單片機原理及接口技術(簡明修訂版).杭州:北京航空航天大學出版社,1998</p><p>  [2] 李廣弟.單片機基礎[M].北京:北京航空航天大學出版社,1994</p><p>  [3] 閻石.數(shù)字電子技術基礎(第三版). 北京:高等教育出版社,1989</

101、p><p>  [4] 廖常初.現(xiàn)場總線概述[J].電工技術,1999.</p><p><b>  目錄</b></p><p><b>  1 引言3</b></p><p><b>  2 方案論證4</b></p><p>  3 系統(tǒng)硬件電路的

102、設計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)程序的設計10</p><p><b>  4.1主程序10

103、</b></p><p>  4.2讀出溫度子程序10</p><p>  4.3溫度轉換命令子程序10</p><p>  4.4計算溫度子程序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)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論