單片機課程設計--數(shù)字溫度計設計_第1頁
已閱讀1頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  單片機課程設計報告</b></p><p>  院 (系): 電氣與控制工程學院 </p><p>  專業(yè)班級:測控技術與儀器</p><p><b>  設計者:</b></p><p><b>  設計者</b></p>

2、<p><b>  指導教師:</b></p><p>  2013年7月 17日</p><p><b>  目錄</b></p><p><b>  1基本要求1</b></p><p><b>  1.1設計題目1</b></p

3、><p><b>  1.2設計任務1</b></p><p>  1.3本設計應達到要求1</p><p><b>  1.4擴展功能1</b></p><p>  1.5設計說明書(論文)1</p><p><b>  2課程設計內容2</b>

4、</p><p>  2.1設計任務目的2</p><p>  2.2設計任務要求2</p><p><b>  2.3方案設計2</b></p><p>  2.3.1溫度采集電路的選擇2</p><p>  2.3.2單片機的選擇2</p><p>  2.3

5、.3顯示電路的取決3</p><p>  2.3.4報警部分電路分析3</p><p>  3重要器件及其相關參數(shù)4</p><p>  3.1單片機STC89C524</p><p>  3.2溫度傳感器DS18B204</p><p><b>  4硬件電路設計7</b></

6、p><p><b>  4.1主板電路7</b></p><p><b>  4.2顯示電路7</b></p><p>  4.3報警參數(shù)調節(jié)電路7</p><p>  4.4蜂鳴器報警電路7</p><p>  4.5溫度采集電路7</p><p&

7、gt;<b>  5系統(tǒng)軟件設計8</b></p><p><b>  5.1主程序8</b></p><p>  5.2讀取數(shù)據(jù)的流程圖8</p><p>  5.3溫度轉換命令子程序9</p><p>  5.4 計算溫度子程序10</p><p>  5.5模

8、式切換流程圖10</p><p>  6實際連接與最終結果11</p><p><b>  設計心得體會13</b></p><p><b>  參考文獻15</b></p><p>  附錄1:元件清單16</p><p>  附錄2:程序清單16</p&

9、gt;<p><b>  數(shù)字溫度計設計</b></p><p>  【摘 要】:隨著時代的進步和發(fā)展,單片機技術已經普及到我們生活,工作,科研,各個領域,已經成為一種比較成熟的技術,本文將介紹一種基于單片機控制的數(shù)字溫度計,本溫度計屬于多功能溫度計,可以通過鍵盤設置上下報警溫度當溫度不在設置范圍內時,可以報警。 </p><p>  【關鍵字】:DS

10、18B20;STC89C52;四位一體數(shù)碼管;報警;</p><p>  【引 言】:隨著人們生活水平的不斷提高,單片機控制無疑是人們追求的目標之一,它所給人帶來的方便也是不可否定的,其中數(shù)字溫度計就是一個典型的例子,但人們對它的要求越來越高,要為現(xiàn)代人工作、科研、生活、提供更好的更方便的設施就需要從數(shù)單片機技術入手,一切向著數(shù)字化控制,智能化控制方向發(fā)展。</p><p>  本設計所

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

12、;  1.1設計題目</b></p><p><b>  數(shù)字溫度計設計</b></p><p><b>  1.2設計任務</b></p><p>  利用單片機和集成溫度傳感器設計一個可以直接顯示溫度值的數(shù)字溫度計并要求達到一定的測量精度。</p><p>  1.3本設計應達到要求

13、</p><p>  ⑴ 硬件設計:根據(jù)任務要求,完成單片機最小系統(tǒng)及其擴展設計,焊接電路板,組成功能完整的樣機。</p><p> ?、?軟件設計:根據(jù)溫度測量及顯示功能要求,完成控制軟件的編寫與調試;</p><p> ?、?功能要求:至少利用3位數(shù)碼管進行測量值的顯示(也可用液晶顯示器相應內容),溫度測量范圍:-20℃~100℃;</p><

14、;p><b>  1.4擴展功能</b></p><p>  根據(jù)實際情況自由添加附加功能,如設置溫度的上下限報警功能,利用語音或聲光報警等。</p><p>  1.5設計說明書(論文)</p><p>  設計說明書應表明設計思想和所使用的設計方法,主要內容包括:</p><p> ?、?系統(tǒng)簡介、整體功能說明

15、、各功能模塊說明(附圖)及系統(tǒng)使用說明;</p><p>  ② 設計還需要改進的地方及設計的心得體會;</p><p> ?、?參考文獻:包括參考書、資料、網站等,按標準格式列出(可參考教材最后的參考文獻引用格式);</p><p> ?、?附錄:系統(tǒng)總體原理圖及源程序。</p><p><b>  2課程設計內容</b&g

16、t;</p><p><b>  2.1設計任務目的</b></p><p>  隨著人們生活水平的不斷提高,單片機控制無疑是人們追求的目標之一,它所給人帶來的方便也是不可否定的,其中數(shù)字溫度計就是一個典型的例子,但人們對它的要求越來越高,要為現(xiàn)代人工作、科研、生活、提供更好的更方便的設施就需要從數(shù)單片機技術入手,一切向著數(shù)字化控制,智能化控制方向發(fā)展。本次課程設計的

17、目的就是通過本次課程設計使我們更加熟練單片機技術的使用,將單片機理論知識融入于生產應用。使我們學有所用,學以致用!</p><p><b>  2.2設計任務要求</b></p><p>  根據(jù)設計要求,確定設計任務的總綱領:利用單片機和集成溫度傳感器設計一個可以直接顯示溫度值的數(shù)字溫度計。設計要求:</p><p> ?。?)硬件設計:根據(jù)

18、任務要求,完成單片機最小系統(tǒng)及其擴展設計,焊接電路板,組成功能完整的樣機。</p><p> ?。?)軟件設計:根據(jù)溫度測量及顯示功能要求,完成控制軟件的編寫與調試;</p><p> ?。?)功能要求:至少利用3位數(shù)碼管進行測量值的顯示(也可用液晶顯示器相應內容),溫度測量范圍:-20℃~100℃;</p><p><b>  (4)擴展功能:</

19、b></p><p>  根據(jù)實際情況自由添加附加功能,如設置溫度的上下限報警功能,利用語音或聲光報警等。</p><p><b>  2.3方案設計</b></p><p>  因為本設計的核心就是溫度的采集,故而首先考慮溫度的采集方案即溫度采集電路的選擇。</p><p>  2.3.1溫度采集電路的選擇<

20、;/p><p> ?。?)溫度采集電路方案一</p><p>  由于本設計是測溫電路,可以使用熱敏電阻之類的器件利用其感溫效應,在將隨被測溫度變化的電壓或電流采集過來,進行A/D轉換后,就可以用單片機進行數(shù)據(jù)的處理,在顯示電路上,就可以將被測溫度顯示出來,這種設計需要用到A/D轉換電路,感溫電路比較麻煩。</p><p> ?。?)溫度采集電路方案二 </p&g

21、t;<p>  進而考慮到用溫度傳感器,在單片機電路設計中,大多都是使用傳感器,所以這是非常容易想到的,所以可以采用一只溫度傳感器DS18B20,此傳感器,可以很容易直接讀取被測溫度值,進行轉換,就可以滿足設計要求。</p><p>  從以上兩種方案,很容易看出,采用方案二,電路與軟件設計都比較簡單,傳感精度也明顯更高。故采用了方案二為本次數(shù)字溫度計設計的大致方案。</p><

22、p>  2.3.2單片機的選擇</p><p>  選擇完溫度采集電路的設計,則考慮此次設計電路的核心單片機。單片機的選擇主要是AT系列和STC系列的選擇。依照的原則是:滿足所需功能的前提下,盡量選擇低成本單片機。</p><p>  由于AT系列51單片機是USA的產品,功能少,速度慢,RAM/ROM小,性能不夠穩(wěn)定。而且一些AT系列的單片機已經停產。相比STC系列單片機高性能,功

23、能齊全,速度高,RAM/ROM大,價格低廉、下載程序方便等優(yōu)點。毫無疑問。我們選擇了STC系列常用的且價格較低的單片機STC89C52RC。</p><p>  2.3.3顯示電路的取決</p><p>  單片機確定后。主要僅剩下顯示電路的設計。關于顯示電路。我們采用了四位一體八段共陰數(shù)碼管。符合課程設計的要求。</p><p>  2.3.4報警部分電路分析&l

24、t;/p><p>  在測溫場所我們往往需要對高、低溫進行報警,而且需要根據(jù)不同情況隨時調節(jié)報警溫限,這就需要設計鍵盤電路來進行報警參數(shù)設置。根據(jù)分析需要設計三個按鍵的鍵盤,即模式切換、加鍵,減鍵。</p><p><b>  2.4系統(tǒng)框圖</b></p><p>  該系統(tǒng)可分為以下七個模塊:</p><p>  (1)

25、控制器:采用單片機STC89C52對采集的溫度數(shù)據(jù)進行處理;</p><p> ?。?)溫度采集:采用DS18B20直接向控制器傳輸12位二進制數(shù)據(jù);</p><p> ?。?)溫度顯示:采用了4個LED共陰極七段數(shù)碼管顯示實際溫度值;</p><p>  (4)門限設置:主要實現(xiàn)模式切換及上下門限溫度的調節(jié);</p><p> ?。?)報警

26、裝置:采用發(fā)光二極管和嗡鳴器進行報警,低于低門限或高于高門限均使其二極管發(fā)光嗡鳴器發(fā)出報警聲音;</p><p>  (6)復位電路:對整個系統(tǒng)進行復位;</p><p>  (7)時鐘振蕩模塊:為整個系統(tǒng)提供統(tǒng)一的時鐘周期。</p><p>  圖2.1總體設計方框圖</p><p>  3重要器件及其相關參數(shù)</p><

27、;p>  3.1單片機STC89C52</p><p>  P0.0~P0.7:通用I/O引腳或數(shù)據(jù)低8位地址總線復用地址;</p><p>  P1.0~P1.7:通用I/O引腳;</p><p>  P2.0~P2.7:通用I/O引腳或高8位地址總線復用地址;</p><p>  P3.0~P3.7:通用I/O引腳或第二功能引腳(R

28、xD、TxD、</p><p>  INT0、INT1、T0、T1、WR、RD);</p><p>  XTAL1、XTAL2:外接晶振輸入端;</p><p>  RST/Vpd:復位信號輸入引腳/備用電源輸入引腳;</p><p>  Vcc:接+5V電源;</p><p><b>  Vss:地端。&l

29、t;/b></p><p>  3.2溫度傳感器DS18B20</p><p>  (1)DS18B20內部結構框圖如圖3.1所示:</p><p>  圖3.1DS18B20內部結構框圖</p><p> ?。?)DS18B20溫度傳感器內部高速RAM結構如圖3.2所示。用戶要去改動,R1和R0決定溫度轉換的精度位數(shù),來設置分辨率。&

30、lt;/p><p><b>  圖3.2</b></p><p> ?。?)由表1可見,DS18B20溫度轉換的時間比較長,而且分辨率越高,所需要的溫度數(shù)據(jù)轉換時間越長。因此,在實際應用中要將分辨率和轉換時間權衡考慮。</p><p>  表1 DS18B20溫度轉換時間表</p><p>  (4)DS18B20的測溫原理

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

32、55℃所對應的一個基數(shù)值。</p><p>  減法計數(shù)器1對低溫度系數(shù)晶振產生的脈沖信號進行減法計數(shù),當減法計數(shù)器1的預置值減到0時,溫度寄存器的值將加1,減法計數(shù)器1的預置將重新被裝入,減法計數(shù)器1重新開始對低溫度系數(shù)晶振產生的脈沖信號進行計數(shù),如此循環(huán)直到減法計數(shù)器計數(shù)到0時,停止溫度寄存器的累加,此時溫度寄存器中的數(shù)值就是所測溫度值。其輸出用于修正減法計數(shù)器的預置值,只要計數(shù)器門仍未關閉就重復上述過程,直

33、到溫度寄存器值大致被測溫度值。</p><p> ?。?)通過單線總線端口訪問 DS1820 的協(xié)議如下:</p><p><b>  ? 初始化</b></p><p>  ? ROM 操作命令</p><p><b>  ? 存儲器操作命令</b></p><p><

34、;b>  ? 執(zhí)行/數(shù)據(jù)</b></p><p>  DS1820 需要嚴格的協(xié)議以確保數(shù)據(jù)的完整性。協(xié)議包括幾種單線信號類型:復位脈沖、存在脈沖、寫0、寫1、讀0 和讀1。所有這些信號,除存在脈沖外,都是由總線控制器發(fā)出的。和 DS1820 間的任何通訊都需要以初始化序列開始,一個復位脈沖跟著一個存在脈沖,表明DS1820 已經準備好發(fā)送和接收數(shù)據(jù)(適當?shù)腞OM 命令和存儲器操作命令)。<

35、;/p><p>  當總線上只有一個器件時,DS18B20讀溫度的流程為:</p><p>  復位→發(fā)0CCH SKIP ROM命令→發(fā)44H開始轉換命令→延時→復位→發(fā)0CCHSKIP ROM命令→發(fā)0BEH讀存儲器命令→連續(xù)讀出兩個字節(jié)數(shù)據(jù)(即溫度)→ 結束。</p><p>  (6)DS18B20溫度傳感器與單片機的接口電路</p><

36、;p>  DS18B20可以采用兩種方式供電,一種是采用電源供電方式,此時DS18B20的1腳接地,2腳作為信號線,3腳接電源,其接電源與單片機連接方式如圖4。另一種是寄生電源供電方式。</p><p>  當DS18B20處于寫存儲器操作和溫度A/D轉換操作時,總線上必須有強的上拉,上拉開啟時間最大為10us。采用寄生電源供電方式時VDD端接地。由于單線制只有一根線,因此發(fā)送接口必須是三態(tài)的。</p

37、><p><b>  4硬件電路設計</b></p><p><b>  4.1主板電路</b></p><p>  系統(tǒng)整體硬件電路包括,傳感器數(shù)據(jù)采集電路,溫度顯示電路,上下限報警調整電路,單片機主板電路等,如圖4.1所示。</p><p>  圖4.1中有三個獨立式按鍵可以分別調整溫度計的上下限報

38、警設置,圖中蜂鳴器可以在被測溫度不在上下限范圍內時,發(fā)出報警鳴叫聲音。</p><p>  圖4.1中的按健復位電路是上電復位加手動復位,使用比較方便,在程序跑飛時,可以手動復位,這樣就不用在重起單片機電源,就可以實現(xiàn)復位。</p><p><b>  圖4.1系統(tǒng)電路圖</b></p><p><b>  4.2顯示電路</b

39、></p><p>  顯示電路采用的是四位一體八段共陰數(shù)碼管。四位一體八段數(shù)碼管最大的有點是免去了各個數(shù)碼管間的復雜的連接電路。本設計中,將八段數(shù)碼管的A-DP,8個段選端分別接到單片機的P0~0-P0~7管腳。1-4,4個位選端分別連接到單片機的P2~0-P2~3管腳。</p><p>  4.3報警參數(shù)調節(jié)電路</p><p>  門限中的三個按鍵,分別

40、為模式切換按鍵、加按鍵、減按鍵;模式切換按鍵接P1~0,加按鍵接P1~1,減按鍵接P1~2。</p><p>  4.4蜂鳴器報警電路</p><p>  報警電路中,超過高門限或者低于低門限時發(fā)光二極管被點亮蜂鳴器,其余時刻光二極管均熄滅、蜂鳴器不響;蜂鳴器報警接P1~4。</p><p><b>  4.5溫度采集電路</b></p&

41、gt;<p>  DS18B20溫度采集電路中,需要注意的是DQ上需要一個上拉電阻,一般為4.7KΩ左右。DQ接P2~6。</p><p><b>  5系統(tǒng)軟件設計</b></p><p>  系統(tǒng)程序主要包括主程序,讀出溫度子程序,溫度轉換命令子程序,計算溫度子程序,顯示數(shù)據(jù)刷新子程序等</p><p><b>  

42、5.1主程序</b></p><p>  主程序的主要功能是負責溫度的實時顯示、讀出并處理DS18B20的測量的當前溫度值,溫度測量每1s進行一次。這樣可以在一秒之內測量一次被測溫度,其程序流程見圖5.1所示。</p><p>  圖5.1主程序流程圖</p><p>  5.2讀取數(shù)據(jù)的流程圖</p><p>  DSl8820

43、的主要數(shù)據(jù)元件有:64位激光Lasered ROM,溫度靈敏元件和非易失性溫度告警觸發(fā)器TH和TL。DSBl820可以從單總線獲取電源,當信號線為高電平時,將能量貯存在內部電容器中;當單信號線為低電平時,將該電源斷開,直到信號線變?yōu)楦唠娖街匦陆由霞纳?電容)電源為止。此外,還可外接5 V電源,給DSl8820供電。DSl8820的供電方式靈活,利用外接電源還可增加系統(tǒng)的穩(wěn)定性和可靠性。圖5.2為讀取數(shù)據(jù)流程圖。</p>&

44、lt;p>  圖5.2 讀取數(shù)據(jù)的流程圖</p><p>  5.3溫度轉換命令子程序</p><p>  溫度轉換命令子程序主要是發(fā)溫度轉換開始命令,當采用12位分辨率時轉換時間約為750ms,在本程序設計中采用1s顯示程序延時法等待轉換的完成。溫度轉換命令子程序流程圖如上圖,圖5.3所示。</p><p>  圖5.3溫度轉換命令子程序流程圖</p&

45、gt;<p>  5.4 計算溫度子程序</p><p>  計算溫度子程序將RAM中讀取值進行BCD碼的轉換運算,并進行溫度值正負的判定,其程序流程圖如圖5.4所示。</p><p>  圖5.4計算溫度子程序流程圖</p><p>  5.5模式切換流程圖</p><p>  圖5.5模式切換流程圖</p>&

46、lt;p>  使用模式值st來標記不同模式,st=1時,表示在正常溫度模式,st=2,表示在高門限模式,st=3表示在低門限模式,每次按下一次模式切換鍵,st+1,待其加至4時,將該值返回至1。從而形成了模式鍵不斷按下,三種模式循環(huán)切換的情況。防抖在這里是十分關鍵的。因為此處的按鍵是按下然后又返回為按了一次。所以按下時,則進入程序,為了防止機械抖動等不確定情況,延時恰當?shù)囊欢螘r間后再次檢測是否確實按下。若確實按下,則對模式進行切換

47、。切換后,延時等待按鍵返回高位,返回高位后,再次延時消除抖動,再次檢驗,確定按鍵返回高位后,退出程序。</p><p>  6實際連接與最終結果</p><p><b> ?。?)正常范圍顯示</b></p><p>  圖6.1正常顯示實物連接圖</p><p><b>  溫度報警上限顯示</b>

48、;</p><p>  圖6.2溫度報警上限顯示實物連接圖</p><p><b>  溫度報警下限顯示</b></p><p>  圖6.3溫度報警下限顯示實物連接圖</p><p><b>  設計心得體會</b></p><p>  [硬件焊接]xx:通過本次課程設計我

49、學到了好多東西,原來我的單片機知識并不扎實,不論軟件還是硬件都不好,不過在這次實習中,通過親自動手,發(fā)現(xiàn)了很多不會的問題,也加深了對這些知識的認識。在課程設計之前,我們在書上網上查找了許多資料,最終確定了此次課設的電路圖。在調試過程中,我們的板子出現(xiàn)了許多問題,舉例如下:</p><p>  問題1:連接好線路,數(shù)碼管不亮</p><p>  解決辦法:我們猜測可能線路板有虛焊,就將線路板

50、檢查了一遍,最后是將數(shù)碼管給拆了,重新焊接了一遍。</p><p>  問題2:蜂鳴器響,數(shù)碼管不亮</p><p>  解決辦法:通過同學的幫助,我們最后發(fā)現(xiàn)是單片機的問題,換了一新的52芯片。</p><p>  問題3:連接好線路,數(shù)碼管亂碼。</p><p>  解決辦法:本次課程設計的電路圖是參考網上的,不知道是否正確,就用仿真試做

51、了一下,發(fā)現(xiàn)仿真結果是正確的,就照圖焊接了。連好線路,發(fā)現(xiàn)數(shù)碼管出現(xiàn)亂碼現(xiàn)象,通過詢問同學,在網上查找資料,知道了是數(shù)碼關沒有驅動,就給4個位選線路分別焊接了三極管(9014),因為數(shù)碼管是共陰的。</p><p>  問題4:數(shù)碼管顯示2559</p><p>  解決辦法:分析得知,這個可能是由于溫度傳感器沒有采集到數(shù)據(jù),即可能是因為軟件編程有問題也可能是硬件焊接,我們找來同學的板子,

52、將我們的52單片機與同學焊接的板子相連接,發(fā)現(xiàn)數(shù)碼管有顯示,明白了是板子的問題,之后將與溫度串關起相連的線路仔細檢查,部分線路重新焊接。</p><p>  在課設中,我深深感受到團隊合作的重要性。這次課設對于我們來說是比較困難的,但是俗話說三個臭皮匠頂個諸葛亮,雖說我們只有兩人,但我們分工明確,互相討論互相學習互相幫組,遇到不會的問題積極解決,請教同學,終于成功完成了此次設計。我們收獲不小,這為我們大四的畢業(yè)設

53、計打下了基礎。</p><p><b>  [軟件調試]xx:</b></p><p>  經過一周的努力我們終于完成了本次設計任務,作品實現(xiàn)了預期的功能要求。但在本次設計與調試的過程中,我也遇到了很多的問題。</p><p> ?。?)在仿真中,我將數(shù)碼管段碼a~dp連接在了P0口,仿真不成功。后查閱P0、P1、P2以及P3口的內部結構后發(fā)現(xiàn)

54、,除P0外另外三口均接有上拉電阻,而P0則無。所以P0在作為通用I/O接口使用時,必須外接上拉電阻,其余端口則不需要。加入排阻后仿真成功。</p><p><b> ?。?)關于位選</b></p><p>  在最開始的測試數(shù)碼管類型中,我只測試了一位數(shù)碼管,使其顯示數(shù)值1,但測試成功后,4位數(shù)碼管均顯示為1。在測試過程中,我并未注意這個問題。</p>

55、<p>  測試結束后,進行整體聯(lián)調。但數(shù)碼管始終無正確顯示。當時,我首先著手于尋找軟件程序中是否有錯誤。所以人為將temp設定為一個固定值,先確定數(shù)據(jù)處理程序和數(shù)據(jù)顯示程序無誤。然而數(shù)碼管無法正常顯示我預先設定的值,后經過反復改動,發(fā)現(xiàn),在位選過程中,必須在選中一位數(shù)碼管的過程中同時將其余所有的數(shù)碼管關閉,否則將產生混亂。若逐一設定S1=1;S2=0;S3=0;S4=0未免太過麻煩,所以設定一個數(shù)組,分別賦值0x08,0x

56、04,0x02,0x01。片選時按照規(guī)則將上值賦給,則一舉多得。</p><p><b> ?。?)DQ數(shù)據(jù)采集</b></p><p>  上述問題均解決后,再次進行調試,數(shù)碼管顯示2559。顯然采集的數(shù)據(jù)是有很大問題的,這就說明電路并沒有采集到溫度數(shù)據(jù),我不斷的對程序中DS18B20的初始化時等部分的時序進行調整。在經歷了無法顯示正常溫度的挫敗后,我仔細查閱了DS

57、18B20的數(shù)據(jù)手冊,確定了在其初始化過程中,DQ電平應該如何變化且應當延時多少。同時也確定了DS8B20的在12位分辨率情況下數(shù)據(jù)A/D轉換所需時間為500ms~750ms,所以在發(fā)出轉換命令后需要給其充分的時間來進行A/D轉換。經過對程序的調整,問題得到解決。</p><p> ?。?)數(shù)碼管大部分時間顯示的是正常溫度,但是仍然會在某些時候跳變?yōu)?559,1279等數(shù)值還不時的錯誤報警。猜測可能是接觸不良造成

58、的,主要是排線,+5V電壓線,地線等諸多因素的影響,稍作調整后即可消除。</p><p>  總之,在這次單片機課程設計過程中我對溫度集成芯片有了進一步了解。DS1820 雖然具有測溫系統(tǒng)簡單、測溫精度高、連接方便、占用口線少等優(yōu)點,但在實際應用中由于 DS1820 與微處理器間采用串行數(shù)據(jù)傳送,因此,在對 DS1820 進行讀寫編程時,必須嚴格的保證讀寫時序,否則將無法讀取測溫結果。在 DS1820 測溫程序設

59、計中,向 DS1820 發(fā)出溫度轉換命令后,程序總要等待 DS1820 的返回信號,一旦某個 DS1820 接觸不好或斷線,當程序讀該 DS1820 時,將沒有返回信號,程序進入死循環(huán)。</p><p><b>  參考文獻</b></p><p>  [1] 柴鈺.單片機原理及應用[M].西安電子科技大學出版社,2009</p><p> 

60、 [2] 李朝青.單片機原理及接口技術[M].北京航空航天大學出版社,1998</p><p>  [3] 李廣弟.單片機基礎[M].北京:北京航空航天大學出版社,1994</p><p>  [4] 閻石.數(shù)字電子技術基礎(第三版). 北京:高等教育出版社,1989</p><p><b>  附錄1:元件清單</b></p>

61、<p>  1、STC89C52單片機最小系統(tǒng) 1個</p><p>  2、DS18B20溫度傳感器 1個</p><p>  3、4位一體共陰數(shù)碼管 1個</p><p>  4、9014三極管 5個</p><p>  5、蜂鳴器

62、 1個</p><p>  6、按鍵 3個</p><p>  7、電阻220 16個</p><p>  8、發(fā)光二極管 2個</p><p>  9、電阻470K 3個</p><

63、p><b>  10、導線若干</b></p><p>  14、萬用板10*15 1片</p><p>  15、4.7K 9腳排阻 1個</p><p><b>  附錄2:程序清單</b></p><p>  /***************

64、*****************************************************</p><p>  * 文件名 : 溫度采集DS18B20.c</p><p>  * 描述 : 該文件實現(xiàn)了用溫度傳感器件DS18B20對溫度的采集,并在數(shù)碼管上顯示出來。</p><p>  ***************************

65、********************************************/</p><p>  #include<reg52.h></p><p>  #define uchar unsigned char</p><p>  #define uint unsigned int</p><p>  #define

66、 disdata P0 //段碼輸出口</p><p>  #define discan P2 //掃描口</p><p>  #define jump_ROM 0xCC</p><p>  #define start 0x44</p><p>  #define read_EER

67、OM 0xBE</p><p>  sbit DQ = P2^6; //DS18B20數(shù)據(jù)口</p><p>  uchar st=1;</p><p>  uint temp;</p><p><b>  uint i;</b></p><p><b>  

68、float tt;</b></p><p>  uint h; </p><p>  uint temp;</p><p>  uchar r;</p><p>  char high=40,low=15;</p><p>  sbit beep=P1^3;//LED報警

69、</p><p>  sbit beep1=P1^4;//LED報警</p><p>  uchar pp;</p><p>  sbit key1=P1^0; //模式切換鍵</p><p>  sbit key02=P1^1; //加鍵</p><p>  sbit key03

70、=P1^2; //減鍵</p><p>  unsigned char TMPH,TMPL; </p><p>  uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};</p><p>  uchar code ditab[16]={0x00,0x01,0x01,0

71、x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};</p><p>  //溫度小數(shù)部分用查表法</p><p>  uchar code dis_7[15]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x00,0x40,0x76,0x38,0x39}

72、;</p><p>  //共陰LED段碼表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-"

73、"H" "L" "C" </p><p>  uchar code scan_con[4]={0x08,0x04,0x02,0x01}; //列掃描控制字</p><p>  uchar data temp_data[2]={0x00,0x00}; //讀出溫度暫放</p&g

74、t;<p>  uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //顯示單元數(shù)據(jù),共4個數(shù)據(jù)和一個運算暫用</p><p>  /********************************************************************</p><p>  * 名稱 : delay()&

75、lt;/p><p>  * 功能 : 延時,延時時間大概為140US。</p><p><b>  * 輸入 : 無</b></p><p><b>  * 輸出 : 無</b></p><p>  ****************************************************

76、*******************/</p><p>  void delay_1()</p><p><b>  {</b></p><p><b>  int i,j;</b></p><p>  for(i=0; i<=10; i++)</p><p>  f

77、or(j=0; j<=2; j++)</p><p><b>  ;</b></p><p><b>  }</b></p><p>  /********************************************************************</p><p>

78、  * 名稱 : delay()</p><p>  * 功能 : 延時函數(shù)</p><p><b>  * 輸入 : 無</b></p><p><b>  * 輸出 : 無</b></p><p>  ***********************************************

79、************************/</p><p>  void delay(uint N)</p><p><b>  {</b></p><p><b>  int i;</b></p><p>  for(i=0; i<N; i++)</p><p&g

80、t;<b>  ;</b></p><p><b>  }</b></p><p>  /********************************************************************</p><p>  * 名稱 : Delay_1ms()</p><p>

81、;  * 功能 : 延時子程序,延時時間為 1ms * x</p><p>  * 輸入 : x (延時一毫秒的個數(shù))</p><p><b>  * 輸出 : 無</b></p><p>  ***********************************************************************/<

82、/p><p>  void Delay_1ms(uint i)//1ms延時</p><p><b>  {</b></p><p>  uchar x,j;</p><p>  for(j=0;j<i;j++)</p><p>  for(x=0;x<=148;x++);</p&

83、gt;<p><b>  }</b></p><p>  /********************************************************************</p><p>  * 名稱 : Reset()</p><p>  * 功能 : 復位DS18B20</p><

84、p><b>  * 輸入 : 無</b></p><p><b>  * 輸出 : 無</b></p><p>  ***********************************************************************/</p><p>  uchar Reset(void)&

85、lt;/p><p><b>  {</b></p><p>  uchar deceive_ready;</p><p><b>  DQ = 0;</b></p><p>  delay(29);</p><p><b>  DQ = 1;</b><

86、/p><p><b>  delay(3);</b></p><p>  deceive_ready = DQ;</p><p>  delay(25);</p><p>  return(deceive_ready);</p><p><b>  }</b></p>

87、<p>  /********************************************************************</p><p>  * 名稱 : read_bit()</p><p>  * 功能 : 從DS18B20讀一個位值</p><p><b>  * 輸入 : 無</b></

88、p><p>  * 輸出 : 從DS18B20讀出的一個位值</p><p>  ***********************************************************************/</p><p>  uchar read_bit(void)</p><p><b>  {</b>

89、;</p><p><b>  uchar i;</b></p><p><b>  DQ = 0;</b></p><p><b>  DQ = 1;</b></p><p>  for(i=0; i<3; i++);</p><p>  ret

90、urn(DQ);</p><p><b>  }</b></p><p>  /********************************************************************</p><p>  * 名稱 : write_bit()</p><p>  * 功能 : 向DS18B

91、20寫一位</p><p>  * 輸入 : bitval(要對DS18B20寫入的位值)</p><p><b>  * 輸出 : 無</b></p><p>  ***********************************************************************/</p><p&

92、gt;  void write_bit(uchar bitval)</p><p><b>  {</b></p><p>  DQ=0;if(bitval==1)</p><p><b>  DQ=1;</b></p><p><b>  delay(5);</b></

93、p><p><b>  DQ=1;</b></p><p><b>  }</b></p><p>  /********************************************************************</p><p>  * 名稱 : read_byte()&l

94、t;/p><p>  * 功能 : 從DS18B20讀一個字節(jié)</p><p><b>  * 輸入 : 無</b></p><p>  * 輸出 : 從DS18B20讀到的值</p><p>  ****************************************************************

95、*******/</p><p>  uchar read_byte(void)</p><p><b>  {</b></p><p>  uchar i,m,receive_data;</p><p><b>  m = 1;</b></p><p>  receive_

96、data = 0;</p><p>  for(i=0; i<8; i++)</p><p><b>  {</b></p><p>  if(read_bit())</p><p><b>  {</b></p><p>  receive_data = receiv

97、e_data + (m << i);</p><p><b>  }</b></p><p><b>  delay(6);</b></p><p><b>  }</b></p><p>  return(receive_data);</p><

98、;p><b>  }</b></p><p>  void key11()</p><p><b>  {</b></p><p>  while(key1==0) //當模式切換鍵按下則進入循環(huán)體</p><p><b>  {</b></p><p

99、>  delay(300);//延時消除抖動</p><p>  if(key1==0)</p><p><b>  {</b></p><p>  st++;//模式循環(huán)切換</p><p><b>  if(st==4)</b></p><p><b&g

100、t;  st=1;</b></p><p><b>  }</b></p><p>  while(!key1);//延時等待按鍵回到高電平</p><p>  delay(300);</p><p>  while(!key1);//延時消除抖動</p><p><b> 

101、 }</b></p><p><b>  }</b></p><p>  /******************門限值加1**************************/</p><p>  void key2() </p><p><b>  {</b></p>&

102、lt;p>  while(key02==0)</p><p><b>  {</b></p><p>  delay(400);</p><p>  if(key02==0)</p><p><b>  {</b></p><p><b>  if(st==3

103、)</b></p><p><b>  {</b></p><p>  low=low+1;}</p><p><b>  if(st==2)</b></p><p>  {high=high+1;}</p><p>  if(low>high)</p

104、><p>  {pp=low;low=high;high=pp;}</p><p><b>  }</b></p><p>  while(!key02);</p><p>  delay(400);</p><p>  while(!key02);</p><p><

105、b>  }</b></p><p><b>  }</b></p><p>  /******************門限值減1**************************/</p><p>  void key3() </p><p><b>  {</b></p&

106、gt;<p>  while(key03==0)</p><p><b>  {</b></p><p>  delay(400);</p><p>  if(key03==0)</p><p><b>  { </b></p><p><b> 

107、 if(st==3)</b></p><p>  {low=low-1;}</p><p><b>  if(st==2)</b></p><p>  {high=high-1;}</p><p>  if(low>high)</p><p>  {pp=low;low

108、=high;high=pp;}</p><p><b>  }</b></p><p>  while(!key03);</p><p>  delay(400);</p><p>  while(!key03);</p><p><b>  } </b></p&

109、gt;<p><b>  }</b></p><p>  /******************上限溫度顯示**************************/</p><p>  void high1()</p><p><b>  {</b></p><p><b> 

110、 uchar k;</b></p><p>  display[0]=high%10;</p><p>  display[1]=high/10;</p><p>  display[2]=10; //個位熄滅</p><p>  display[3]=12; //百位顯示H</p><p> 

111、 for(k=0;k<4;k++) </p><p><b>  {</b></p><p>  discan=scan_con[k]; </p><p>  disdata=dis_7[display[k]]; </p><p>  

112、delay(300);</p><p>  disdata=0x00;</p><p>  delay(100);</p><p><b>  }</b></p><p><b>  } </b></p><p>  /*uchar code table[10] = {

113、0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};</p><p>  uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};</p><p>  //溫度小數(shù)部分用查表法</p&g

114、t;<p>  uchar code dis_7[15]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x00,0x40,0x76,0x38,0x39};</p><p>  //共陰LED段碼表 "0" "1" "2" "3" "

115、4" "5" "6" "7" "8" "9" "不亮" "-" "H" "L" "C" </p><p>  uchar code scan_con[4]={0x08,0x04

116、,0x02,0x01}; //列掃描控制字</p><p>  uchar data temp_data[2]={0x00,0x00}; //讀出溫度暫放</p><p>  uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //顯示單元數(shù)據(jù),共4個數(shù)據(jù)和一個運算暫用</p><p&

117、gt;  /******************下限溫度顯示**************************/</p><p>  void low1()</p><p><b>  {</b></p><p><b>  uchar ki;</b></p><p>  display[0]=l

118、ow%10;</p><p>  display[1]=low/10;</p><p>  display[2]=10; //個位熄滅</p><p>  display[3]=13; //百位顯示L</p><p>  for(ki=0;ki<4;ki++) </p><p

119、><b>  {</b></p><p>  discan=scan_con[ki]; </p><p>  disdata=dis_7[display[ki]]; </p><p>  delay(100);</p><p>  disdata=0x00;</p>

120、;<p>  delay(100);</p><p><b>  }</b></p><p><b>  }</b></p><p>  void BEEP()</p><p><b>  {</b></p><p>  if(temp&g

121、t;=high||temp<=low)</p><p><b>  { beep=1;</b></p><p><b>  beep1=1;}</b></p><p><b>  else </b></p><p><b>  {beep=0;</b>

122、;</p><p><b>  beep1=0;}</b></p><p><b>  }</b></p><p>  /********************************************************************</p><p>  * 名稱 : wri

123、te_byte()</p><p>  * 功能 : 向DS18B20寫一個字節(jié)</p><p>  * 輸入 : val(要對DS18B20寫入的命令值)</p><p><b>  * 輸出 : 無</b></p><p>  *********************************************

124、**************************/</p><p>  void write_byte(uchar val)</p><p><b>  {</b></p><p>  uchar i,temp;</p><p>  for(i=0; i<8; i++)</p><p>

125、<b>  {</b></p><p>  temp = val >> i;</p><p>  temp = temp & 0x01;</p><p>  write_bit(temp);</p><p><b>  delay(5);</b></p><p

126、><b>  }</b></p><p><b>  }</b></p><p>  void work_temp()</p><p>  { Reset();</p><p>  write_byte(jump_ROM);</p><p>  write_

127、byte(start);</p><p><b>  Reset();</b></p><p>  write_byte(jump_ROM);</p><p>  write_byte(read_EEROM);</p><p>  TMPL = read_byte();</p><p>  TMP

128、H = read_byte();</p><p>  temp = TMPL / 16 + TMPH * 16;</p><p>  P0 = table[temp/10%10];</p><p>  P2 = 0x01;</p><p>  Delay_1ms(5);</p><p>  P0 = table[tem

129、p%10];</p><p>  P2 = 0x02;</p><p>  Delay_1ms(5); }</p><p>  /********************************************************************</p><p>  * 名稱 : Main()</p><

130、;p>  * 功能 : 主函數(shù)</p><p><b>  * 輸入 : 無</b></p><p><b>  * 輸出 : 無</b></p><p>  ***********************************************************************/</p&

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論