畢業(yè)論文---單片機數(shù)字溫度計設(shè)計_第1頁
已閱讀1頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、<p><b>  摘要</b></p><p>  當(dāng)今科技發(fā)展日新月異,電子技術(shù)及微電腦控制技術(shù)的應(yīng)用無處不在,使我們的生活更加豐富多彩,為我們帶來了很多的便利。傳統(tǒng)的溫度計都是采用水銀熱漲冷縮的原理制成的。這種溫度計不但本身誤差就大而且由于人讀取時的視覺誤差,導(dǎo)致讀取的數(shù)據(jù)并不精確。電子溫度傳感器不僅采用采集數(shù)據(jù)精度高的DS18B20組成,而且有四位一體的數(shù)碼管作為顯示裝置,

2、這樣更便于讀取數(shù)據(jù),給我們實時了解溫度的變化提供了便利。</p><p>  下面的篇章主要介紹通過對AT89C52單片機進行程序設(shè)計,DS18B20的詳解,并以此為控制核心,同時利用溫度傳感技術(shù)實現(xiàn)對當(dāng)前溫度進行實時測量,并以按鍵控制溫度。此項目主要包括溫度傳感部分,提示報警部分,開關(guān)控制部分及按鍵控制部分。 同時對項目研究背景及意義進行了分析。</p><p>  關(guān)鍵詞:STC89C

3、51,數(shù)字控制,溫度計,DS18B20</p><p><b>  目錄</b></p><p><b>  摘要2</b></p><p><b>  目錄3</b></p><p><b>  緒論3</b></p><p&g

4、t;  第一章 設(shè)計方案和系統(tǒng)組成4</p><p>  1.1 設(shè)計方案4</p><p>  1.2 系統(tǒng)組成5</p><p>  第二章 硬件結(jié)構(gòu)與工作原理6</p><p><b>  2.1硬件結(jié)構(gòu)6</b></p><p>  2.2 溫度監(jiān)測及控制電路7</p&g

5、t;<p>  第三章 軟件設(shè)計10</p><p>  3.1 主程序流程圖11</p><p>  3.2語言介紹11</p><p><b>  第四章 調(diào)試13</b></p><p><b>  第五章 結(jié)論14</b></p><p>  

6、第六章 參考文獻15</p><p><b>  緒論</b></p><p>  隨著人們生活水平的不斷提高,單片機控制無疑是人們追求的目標(biāo)之一,它給人帶來的方便也是無可置疑的,其中數(shù)字溫度計就是一個典型的例子。隨著人們對它的要求越來越高,要為現(xiàn)代人工作和生活提供更好、更方便的設(shè)施就需要從數(shù)字單片機技術(shù)入手,一切向著數(shù)字化控制、智能化控制方向發(fā)展。</p&g

7、t;<p>  溫度測量在物理實驗、醫(yī)療衛(wèi)生、食品生產(chǎn)等領(lǐng)域,尤其在熱學(xué)實驗(如:物體的比熱容、汽化熱、熱功當(dāng)量、壓強溫度系數(shù)等教學(xué)實驗)中,有特別重要的意義。目前溫度計的發(fā)展很快,從原始的玻璃管溫度計發(fā)展到了現(xiàn)在的熱電阻溫度計、熱電偶溫度計、數(shù)字溫度計、電子溫度計等等?,F(xiàn)在所使用的溫度計通常都是精度為1℃和0.1℃的水銀、煤油或酒精溫度計,這些溫度計的刻度間隔通常都很密,不容易準(zhǔn)確分辨,讀數(shù)困難,而且他們的熱容量還比較大

8、,達到熱平衡所需的時間較長,因此很難讀準(zhǔn),并且使用非常不方便。本文所介紹的數(shù)字溫度計與傳統(tǒng)的溫度計相比,具有讀數(shù)方便、測溫范圍廣、測溫準(zhǔn)確等優(yōu)點,其輸出溫度采用數(shù)字顯示,主要供測溫要求準(zhǔn)確的場所和科研實驗室使用。</p><p>  第一章 設(shè)計方案和系統(tǒng)組成</p><p><b>  1.1 設(shè)計方案</b></p><p><b&g

9、t;  1:溫度采集電路</b></p><p>  溫度采集部分要求精確度高,反應(yīng)靈敏,可采集的范圍廣,使用方便,而dollar公司生產(chǎn)的DS18B20采用單總線信號輸入,同時無轉(zhuǎn)換誤差、無傳輸損耗,測量精度高,長期穩(wěn)定,可測范圍廣,適用不同領(lǐng)域。</p><p>  1.單片機控制調(diào)節(jié)部分</p><p>  它利用了AT89C52單片機,通過對單片

10、機輸入程序,及鍵位設(shè)定,同時它采用四個獨立按鍵,可分別對個位和十分位的溫度進行調(diào)節(jié),以方便用戶調(diào)節(jié),同時調(diào)節(jié)時設(shè)定的初始值比正常溫度稍微低些,調(diào)節(jié)時不是從零開始節(jié)省了調(diào)節(jié)的時間,溫度的調(diào)節(jié)控制,滿足了智能化的要求。</p><p><b>  2.適時溫度顯示</b></p><p>  此項目采用了SM410564四位數(shù)碼管,通過溫度傳感器和單片機交換數(shù)據(jù),把當(dāng)前環(huán)

11、境下的溫度數(shù)據(jù)適時傳輸給數(shù)碼管,方便用戶了解當(dāng)前溫度,為下一步工作做好鋪墊。</p><p><b>  電路模塊圖示如下:</b></p><p><b>  1.2 系統(tǒng)組成</b></p><p>  系統(tǒng)的硬件:1)溫度采集及控制電路; 2)鍵盤輸入電路;3)數(shù)碼顯示電路;4)單片機外圍電路;5)輔助繼電器工作電路

12、;6)蜂鳴提醒及l(fā)ed警示電路;7)插座電路等</p><p>  系統(tǒng)的軟件:主要包括溫度檢測程序,鍵盤控制程序及繼電器控制程序,主要實現(xiàn)自動檢測及當(dāng)前溫度自動控制的功能。</p><p>  第二章 硬件結(jié)構(gòu)與工作原理</p><p>  2.1硬件結(jié)構(gòu) </p><p>  根據(jù)系統(tǒng)要求畫出的原理總圖:</p>&l

13、t;p>  該電路采用AT89C52單片機為中心控制芯片。AT89C52是美國ATMEL公司生產(chǎn)的低電壓、高性能CMOS8位單片機,片內(nèi)含8K bytes的可反復(fù)擦寫的PEROM和256bytes的RAM以及通用8位中央處理器和Flash存儲單元。AT89C52功能強大,可充分滿足該控制器存儲等各方面的需求。 </p><p>  AT89C52功能簡述:</p><p>

14、;  AT89C52提供以下標(biāo)準(zhǔn)功能:8K字節(jié)Flash閃速存儲器,256字節(jié)內(nèi)部RAM,32個I/O口線,3個16位定時器/計時器,一個6位向量級中斷結(jié)構(gòu),一個全雙工串通信口,片內(nèi)振蕩器及時鐘電路。同時,AT89C52可降至0Hz的靜態(tài)邏輯操作,并支持兩種軟件的可選節(jié)電工作方式:空閑方式停止CPU的工作,但允許RAM的內(nèi)容,但振蕩器停止工作并禁止其它所有部件工作直到下一個硬件復(fù)位。</p><p>  AT89

15、C52引腳圖</p><p>  AT89C52的參數(shù)了解:</p><p>  工作溫度 -55℃~+125℃  </p><p>  儲藏溫度 -65℃~+150℃</p><p>  任一引腳對地電壓 -1v~+7v</p><p>  最高工作電壓

16、 6.6v</p><p>  直流輸出電流 15mA</p><p>  2.2 溫度監(jiān)測及控制電路</p><p>  2.2.1溫度采集裝置:</p><p>  采用串行數(shù)字溫度傳感器DS18B20芯片使其換成脈沖信號,送到89C52的I/O 端口2.7口(編程為計數(shù)器工作模式),通過測量輸出脈沖

17、頻率的大小來換算成溫度高低信號</p><p>  DS18B20 外形圖和引腳說明</p><p>  1、DS18B20技術(shù)性能描述</p><p>  1.1 獨特的單線接口方式,DS18B20在與微處理器連接時僅需要一條口線即可實現(xiàn)微處理器與DS18B20的雙向通訊。</p><p>  1.2 測溫范圍-55℃~+125℃,固有測溫

18、分辨率0.5℃。</p><p>  1.3 支持多點組網(wǎng)功能,多個DS18B20可以并聯(lián)在唯一的三線上,實現(xiàn)多點測溫,但當(dāng)用多個DS18B20時電壓驅(qū)動不夠,一條線最多能驅(qū)動大約5個。</p><p>  1.4 工作電源: 3~5V/DC</p><p>  2:DS18B20溫度的讀取</p><p>  DS18B20在出廠時已配置為

19、12位,讀取溫度時共讀取16位,所以把后11位的2進制轉(zhuǎn)化為10進制后在乘以0.0625便為所測的溫度,還需要判斷正負。前5個數(shù)字為符號位,當(dāng)前5位為1時,讀取的溫度為負數(shù);當(dāng)前5位為0時,讀取的溫度為正數(shù)。16位數(shù)字擺放是從低位到高位。</p><p>  2.2.2溫度數(shù)碼顯示:</p><p>  百位 12 十位 9 個位 8 十分位 6 <

20、/p><p>  A 11 B 7 C 4 D 2 E 1 F 10 G 5 DP 3</p><p>  DS18B20采集的溫度數(shù)據(jù)經(jīng)單片機分析在該數(shù)碼管上顯示。數(shù)碼管顯示控制部分與AT89C52接口電路在內(nèi)藏控制器的數(shù)碼顯示模塊中,已經(jīng)完成了控制器與數(shù)碼顯示驅(qū)動器顯示器緩沖區(qū)的接口工作。</p><p>  2.2.3. 溫度調(diào)節(jié)設(shè)置按

21、鍵電路:</p><p>  通過四個外圍按鍵與單片機AT89C52直接相連,用戶可根據(jù)需要設(shè)置自己想要控制的正常范圍內(nèi)任意想要溫度。</p><p>  2.2.4內(nèi)部時鐘振蕩電路及復(fù)位電路:</p><p>  此部分為AT89C52的內(nèi)部時鐘電路振蕩器。80C52單片機內(nèi)部帶有時鐘電路,只需在片外通過XTAL1和XTAL2引腳接入定時控制元件(12MHZ晶振和

22、電容)即可構(gòu)成一個穩(wěn)定的自激振蕩器。XTAL1和XTAL2分別是80C52內(nèi)部高增益反響放大器的輸入端和輸出端 時鐘頻率為 12MHz.</p><p>  此部分為其使能和復(fù)位電路,該電路采用上電自動復(fù)位方式,通過復(fù)位電容C1的充電來實現(xiàn),接通電源就實現(xiàn)了系統(tǒng)的復(fù)位初始化。</p><p><b>  第三章 軟件設(shè)計</b></p><p&

23、gt;  系統(tǒng)程序主要包括主程序,讀出溫度子程序,溫度轉(zhuǎn)換命令子程序,計算溫度子程序,顯示數(shù)據(jù)刷新子程序,按鍵掃描處理子程序等。</p><p>  3.1 主程序流程圖</p><p>  主程序的主要功能是負責(zé)溫度的實時顯示、讀出并處理DS18B20 的測量的當(dāng)前溫度值,溫度測量每1s 進行一次。這樣可以在一秒之內(nèi)測量一次被測溫度,其程序流程見圖4.1 所示。</p>&

24、lt;p>  圖4.1 主程序流程圖</p><p><b>  3.2語言介紹</b></p><p>  3.2.1 匯編語言特點</p><p>  匯編語言是一種功能很強的程序設(shè)計語言,也是利用計算機所有硬件特性并能直接控制硬件的語言。匯編語言,作為一門語言,對應(yīng)于高級語言的編譯器,需要一個“匯編器”來把匯編語言原文件匯編成機器

25、可執(zhí)行的代碼。高級的匯編器如MASM,TASM等等為我們寫匯編程序提供了很多類似于高級語言的特征,比如結(jié)構(gòu)化、抽象等。在這樣的環(huán)境中編寫的匯編程序,有很大一部分是面向匯編器的偽指令,已經(jīng)類同于高級語言?,F(xiàn)在的匯編環(huán)境已經(jīng)如此高級,即使全部用匯編語言來編寫windows的應(yīng)用程序也是可行的,但這不是匯編語言的長處。匯編語言的長處在于編寫高效且需要對機器硬件精確控制的程序。</p><p>  MCS-51單片機的這

26、個指令系統(tǒng)中共包括111條指令,可以完成30多種功能。</p><p>  3.2.2 C語言特點</p><p>  它既具有高級語言的特點,又具有匯編語言的特點。它可以作為工作系統(tǒng)設(shè)計語言,編寫系統(tǒng)應(yīng)用程序,也可以作為應(yīng)用程序設(shè)計語言,編寫不依賴計算機硬件的應(yīng)用程序。因此,它的應(yīng)用范圍廣泛,不僅僅是在軟件開發(fā)上,而且各類科研都需要用到C語言,具體應(yīng)用比如單片機以及嵌入式系統(tǒng)開發(fā)。<

27、;/p><p>  1·語法限制不太嚴格,程序設(shè)計自由度大。生成目標(biāo)代碼質(zhì)量高,程序執(zhí)行效率高。C語言簡潔、緊湊,使用方便、靈活。</p><p>  2·運算符豐富。共有34種。C把括號、賦值、逗號等都作為運算符處理。從而使C的運算類型極為豐富,可以實現(xiàn)其他高級語言難以實現(xiàn)的運算。</p><p>  3·數(shù)據(jù)結(jié)構(gòu)類型豐富。具有結(jié)構(gòu)化的控

28、制語句。與匯編語言相比,用C語言寫的程序可移植性好。</p><p>  4·C語言允許直接訪問物理地址,能進行位(bit)操作,能實現(xiàn)匯編語言的大部分功能,可以直接對硬件進行操作。因此有人把它稱為中級語言。</p><p>  C語言對操作系統(tǒng)和系統(tǒng)使用程序以及需要對硬件進行操作的場合,用C語言明顯優(yōu)于其它解釋型高級語言,有一些大型應(yīng)用軟件也是用C語言編寫的。具有繪圖能力強,可

29、移植性,并具備很強的數(shù)據(jù)處理能力,因此適于編寫系統(tǒng)軟件,三維,二維圖形和動畫。它是數(shù)值計算的高級語言。</p><p>  本次實習(xí)運用C語言編程來對單片機進行顯示的控制、信號的傳輸轉(zhuǎn)換控制。</p><p>  3.2.3 Keil C51單片機軟件開發(fā)系統(tǒng)的整體結(jié)構(gòu)</p><p>  Keil C51是美國Keil Software公司出品的51系列兼容單片機

30、C語言軟件開發(fā)系統(tǒng),與匯編相比,C語言在功能上、結(jié)構(gòu)性、可讀性、可維護性上有明顯的優(yōu)勢,因而易學(xué)易用。用過匯編語言后再使用C來開發(fā),體會更加深刻。</p><p>  Keil C51軟件提供豐富的庫函數(shù)和功能強大的集成開發(fā)調(diào)試工具,全Windows界面。另外重要的一點,只要看一下編譯后生成的匯編代碼,就能體會到Keil C51生成的目標(biāo)代碼效率非常之高,多數(shù)語句生成的匯編代碼很緊湊,容易理解。在開發(fā)大型軟件時更

31、能體現(xiàn)高級語言的優(yōu)勢。下面詳細介紹Keil C51開發(fā)系統(tǒng)各部分功能和使用。</p><p>  程序編輯使用Keil,新建一個工程,然后新建一個C文件,并添加到工程中。</p><p>  C51的工具包非常豐富,其中uVision與Ishell分別是C51 for Windows和for Dos的集成開發(fā)環(huán)境(IDE),可以完成編輯、編譯、連接、調(diào)試、仿真等整個開發(fā)流程。開發(fā)人員可用I

32、DE本身或其它編輯器編輯C或匯編源文件。然后分別由C51及A51編譯器編譯生成目標(biāo)文件(.OBJ)。目標(biāo)文件可由LIB51創(chuàng)建生成庫文件,也可以與庫文件一起經(jīng)L51連接定位生成絕對目標(biāo)文件(.ABS)。ABS文件由OH51轉(zhuǎn)換成標(biāo)準(zhǔn)的Hex文件,以供調(diào)試器dScope51或tScope51使用進行源代碼級調(diào)試,也可由仿真器使用直接對目標(biāo)板進行調(diào)試,也可以直接寫入程序存貯器如EPROM中。</p><p><

33、b>  仿真如下:</b></p><p><b>  .第四章 調(diào)試</b></p><p>  本次設(shè)計系統(tǒng)的調(diào)試以程序的調(diào)試為主。</p><p>  先編寫顯示程序并進行硬件的正確性檢驗,然后分別進行主程序、讀出溫度子程序、溫度轉(zhuǎn)換命令子程序、計算溫度子程序和顯示數(shù)據(jù)刷新子程序等的編程及調(diào)試。</p>&

34、lt;p>  由于DS18B20與單片機采用串行數(shù)據(jù)傳送,因此,對DS18B20進行讀/寫編程時,必須嚴格的保證讀/寫時序,否則將無法讀取測量結(jié)果。本程序采用單片機C語言編寫,用Keil C編譯器編程調(diào)試。</p><p>  軟件調(diào)試到數(shù)碼管能顯示溫度值,而且在有溫度變化時(例如改變傳感器的溫度值)顯示溫度能改變。</p><p><b>  第五章 結(jié)論</b&g

35、t;</p><p>  本次課程設(shè)計即將進入尾聲,回想這兩周來的電子設(shè)計制作經(jīng)歷,我感觸甚是深刻。通過本次課程設(shè)計,使我對電子設(shè)計及制作產(chǎn)生了較為濃厚的興趣,這不僅加強了自己對理論知識的理解和鞏固,還能提高自己的動手能力,可以說受益匪淺。當(dāng)然更重要的是,激起了我學(xué)好單片機的斗志。</p><p>  本次課程設(shè)計主要分為四部分:設(shè)計、仿真、調(diào)試。這三個步驟在整個課程設(shè)計過程中起著重要的作

36、用。</p><p>  本次畢業(yè)設(shè)計是針對MCS-51系列的單片機芯片STC89C51來設(shè)計一個數(shù)字溫度計,該設(shè)計充分利用了溫度傳感器DS18B20功能強大的優(yōu)點,如DS18B20可以直接讀出被測溫度值,進行轉(zhuǎn)換;而且采用三線制與單片機相連,減少了外部的硬件電路,具有低成本和易使用的特點,大大簡化了硬件電路,也使得該數(shù)字溫度計不僅具有結(jié)構(gòu)簡單、成本低廉、精確度較高、反應(yīng)速度較快、數(shù)字化顯示和不易損壞等特點,而且

37、性能穩(wěn)定,適用范圍廣,因此特別適用于對測溫要求比較準(zhǔn)確的場所。</p><p><b>  第六章 參考文獻</b></p><p>  [1]單片機應(yīng)用技術(shù)(C語言版).電子工業(yè)出版社。</p><p>  [2] 模擬電子技術(shù)(第三版)胡宴如 主編。</p><p>  [3] 數(shù)字電子技術(shù)(第三版)楊志忠 主編。&

38、lt;/p><p>  [4] PROTEUS仿真軟件應(yīng)用 張文濤 主編。</p><p>  [5] C語言程序設(shè)計 清華大學(xué)出版社。</p><p>  [6] 張毅剛.MCS-51單片機應(yīng)用設(shè)計[M].高等教育出版社。2003-12-1。</p><p>  [7] 王仲 .單片機原理及其接口技術(shù) [M] 機械工業(yè)出版社,2001.89-1

39、20 </p><p>  [8] 郭力平.MCS-51系列單片機實用接口技術(shù)[M],人民郵電出版社,2003.23-56 </p><p>  [9] 李廣弟.單片機基礎(chǔ). 北京:北京航空航天大學(xué)出版社,2001.8-10</p><p>  [10] 康光華.電子技術(shù)基礎(chǔ)模擬部分(第五版),高等教育出版社,2006-1。</p><p>

40、  [11] 譚浩強.程序設(shè)計(第三版),清華大學(xué)出版社,2005-7。</p><p><b>  附錄</b></p><p>  #include <reg52.h></p><p>  #include <intrins.h> //_nop_();延時函數(shù)用</p><p>  #defi

41、ne dm P0 //段碼輸出口</p><p>  #define uchar unsigned char</p><p>  #define uint unsigned int</p><p>  sbit DQ=P2^7; //溫度輸入口</p><p>  sbit w0=P2^0; //數(shù)碼管4</p><p&g

42、t;  sbit w1=P2^1; //數(shù)碼管3</p><p>  sbit w2=P2^2; //數(shù)碼管2</p><p>  sbit w3=P2^3; //數(shù)碼管1</p><p>  sbit beep=P1^7; //蜂鳴器指示燈</p><p>  sbit LED=P1^0;// 指示燈</p><p&g

43、t;  sbit set=P2^6; //溫度設(shè)置切換鍵</p><p>  sbit add=P2^4; //溫度加</p><p>  sbit dec=P2^5; //溫度減</p><p>  int temp1=0; //顯示當(dāng)前溫度和設(shè)置溫度的標(biāo)志位為0 時顯示當(dāng)前溫度</p><p><b>  uint h;<

44、/b></p><p>  uint temp;</p><p><b>  uchar r;</b></p><p>  uchar high=35,low=20;</p><p>  uchar sign;</p><p>  uchar q=0;</p><p>

45、;  uchar tt=0;</p><p>  uchar scale;</p><p>  //**************溫度小數(shù)部分用查表法***********//</p><p>  uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08

46、,0x08,0x09,0x09};</p><p><b>  //小數(shù)斷碼表</b></p><p>  uchar code table_dm[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};</p><p>  //共陰LED 段碼表"0&quo

47、t; "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-"</p><p>  uchar table_dm1[]={0xbf,0x86,0xdb,0xcf,0

48、xe6,0xed,0xfd,0x87,0xff,0xef}; //個位帶小數(shù)點的斷碼表</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>&l

49、t;p>  /*****************11us 延時函數(shù)*************************/</p><p>  void delay(uint t)</p><p><b>  {</b></p><p>  for (;t>0;t--);</p><p><b>  }

50、</b></p><p>  void scan()</p><p><b>  {</b></p><p><b>  int j;</b></p><p>  for(j=0;j<4;j++)</p><p><b>  {</b>

51、</p><p>  switch (j)</p><p><b>  {</b></p><p>  case 0: dm=table_dm[display[0]];w0=0;delay(50);w0=1;//xiaoshu</p><p>  case 1: dm=table_dm1[display[1]];w1=0

52、;delay(50);w1=1;//gewei</p><p>  case 2: dm=table_dm[display[2]];w2=0;delay(50);w2=1;//shiwei</p><p>  case 3: dm=table_dm[display[3]];w3=0;delay(50);w3=1;//baiwei</p><p>  // else{

53、dm=table_dm[b3];w3=0;delay(50);w3=1;}</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  //***************DS18B20 復(fù)位函數(shù)**

54、**********************/</p><p>  ow_reset(void)</p><p><b>  {</b></p><p>  char presence=1;</p><p>  while(presence)</p><p><b>  {</b&

55、gt;</p><p>  while(presence)</p><p><b>  {</b></p><p>  DQ=1;_nop_();_nop_();//從高拉倒低</p><p><b>  DQ=0;</b></p><p>  delay(50); //55

56、0 us</p><p><b>  DQ=1;</b></p><p>  delay(6); //66 us</p><p>  presence=DQ; //presence=0 復(fù)位成功,繼續(xù)下一步</p><p><b>  }</b></p><p>  dela

57、y(45); //延時500 us</p><p>  presence=~DQ;</p><p><b>  }</b></p><p>  DQ=1; //拉高電平</p><p><b>  }</b></p><p>  /****************DS18B2

58、0 寫命令函數(shù)************************/</p><p>  //向1-WIRE 總線上寫1 個字節(jié)</p><p>  void write_byte(uchar val)</p><p><b>  {</b></p><p><b>  uchar i;</b><

59、/p><p>  for(i=8;i>0;i--)</p><p><b>  {</b></p><p>  DQ=1;_nop_();_nop_(); //從高拉倒低</p><p>  DQ=0;_nop_();_nop_();_nop_();_nop_(); //5 us</p><p>

60、;  DQ=val&0x01; //最低位移出</p><p>  delay(6); //66 us</p><p>  val=val/2; //右移1 位</p><p><b>  }</b></p><p><b>  DQ=1;</b></p><p>&

61、lt;b>  delay(1);</b></p><p><b>  }</b></p><p>  /****************DS18B20 讀1 字節(jié)函數(shù)************************/</p><p>  //從總線上取1 個字節(jié)</p><p>  uchar read

62、_byte(void)</p><p><b>  {</b></p><p><b>  uchar i;</b></p><p>  uchar value=0;</p><p>  for(i=8;i>0;i--)</p><p><b>  {<

63、/b></p><p>  DQ=1;_nop_();_nop_();</p><p>  value>>=1;</p><p>  DQ=0;_nop_();_nop_();_nop_();_nop_(); //4 us</p><p>  DQ=1;_nop_();_nop_();_nop_();_nop_(); //4

64、 us</p><p>  if(DQ)value|=0x80;</p><p>  delay(6); //66 us</p><p><b>  }</b></p><p><b>  DQ=1;</b></p><p>  return(value);</p>

65、;<p><b>  }</b></p><p>  /*****************讀出溫度函數(shù)************************/</p><p>  read_temp()</p><p><b>  {</b></p><p>  ow_reset(); //

66、總線復(fù)位</p><p>  delay(200);</p><p>  write_byte(0xcc); //發(fā)命令</p><p>  write_byte(0x44); //發(fā)轉(zhuǎn)換命令</p><p>  ow_reset();</p><p><b>  delay(1);</b><

67、;/p><p>  write_byte(0xcc); //發(fā)命令</p><p>  write_byte(0xbe);</p><p>  temp_data[0]=read_byte(); //讀溫度值的低字節(jié)</p><p>  temp_data[1]=read_byte(); //讀溫度值的高字節(jié)</p><p&g

68、t;  temp=temp_data[1];</p><p><b>  temp<<=8;</b></p><p>  temp=temp|temp_data[0]; // 兩字節(jié)合成一個整型變量。</p><p>  return temp; //返回溫度值</p><p><b>  }<

69、;/b></p><p>  /****************溫度數(shù)據(jù)處理函數(shù)************************/</p><p>  //二進制高字節(jié)的低半字節(jié)和低字節(jié)的高半字節(jié)組成一字節(jié),這個</p><p>  //字節(jié)的二進制轉(zhuǎn)換為十進制后,就是溫度值的百、十、個位值,而剩</p><p>  //下的低字節(jié)的低

70、半字節(jié)轉(zhuǎn)化成十進制后,就是溫度值的小數(shù)部分</p><p>  /********************************************************/</p><p>  work_temp(uint tem)</p><p><b>  {</b></p><p>  uchar n=0;

71、</p><p>  if(tem>6348) // 溫度值正負判斷</p><p>  {tem=65536-tem;n=1;} // 負溫度求補碼,標(biāo)志位置1</p><p>  display[4]=tem&0x0f; // 取小數(shù)部分的值</p><p>  display[0]=ditab[display[4]]; /

72、/ 存入小數(shù)部分顯示值</p><p>  display[4]=tem>>4; // 取中間八位,即整數(shù)部分的值</p><p>  display[3]=display[4]/100; // 取百位數(shù)據(jù)暫存</p><p>  display[1]=display[4]%100; // 取后兩位數(shù)據(jù)暫存</p><p>  d

73、isplay[2]=display[1]/10; // 取十位數(shù)據(jù)暫存</p><p>  display[1]=display[1]%10; //個位數(shù)據(jù)</p><p>  r=display[1]+display[2]*10+display[3]*100;</p><p>  /////符號位顯示判斷/////</p><p>  if

74、(!display[3])</p><p><b>  {</b></p><p>  display[3]=0x0a; //最高位為0 時不顯示</p><p>  if(!display[2])</p><p><b>  {</b></p><p>  display[

75、2]=0x0a; //次高位為0 時不顯示</p><p><b>  }</b></p><p><b>  }</b></p><p>  if(n){display[3]=0x0b;} //負溫度時最高位顯示"-"</p><p><b>  }</b>

76、;</p><p>  void BEEP()</p><p><b>  {</b></p><p>  if((r>=high&&r<129)||r<low)</p><p><b>  {</b></p><p>  beep=!bee

77、p;</p><p><b>  LED=!LED;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p><b>  bee

78、p=0;</b></p><p><b>  LED=0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  //*********設(shè)置溫度顯示轉(zhuǎn)換************//</p><

79、p>  void xianshi(int horl)</p><p><b>  {</b></p><p><b>  int n=0;</b></p><p>  if(horl>128)</p><p><b>  {</b></p><p

80、>  horl=256-horl;n=1;</p><p><b>  }</b></p><p>  display[3]=horl/100;</p><p>  display[3]=display[3]&0x0f;</p><p>  display[2]=horl%100/10;</p>

81、<p>  display[1]=horl%10;</p><p>  display[0]=0;</p><p>  if(!display[3])</p><p><b>  {</b></p><p>  display[3]=0x0a; //最高位為0 時不顯示</p><p&g

82、t;  if(!display[2])</p><p><b>  {</b></p><p>  display[2]=0x0a; //次高位為0 時不顯示</p><p><b>  }</b></p><p><b>  }</b></p><p>

83、;<b>  if(n)</b></p><p><b>  {</b></p><p>  display[3]=0x0b; //負溫度時最高位顯示"-"</p><p><b>  }</b></p><p><b>  }</b>

84、</p><p>  //*********按鍵查詢程序**************//</p><p>  void keyscan()</p><p><b>  {</b></p><p>  int temp1; //最高溫度和最低溫度標(biāo)志位</p><p>  if(set==0)<

85、;/p><p><b>  {</b></p><p><b>  while(1)</b></p><p><b>  {</b></p><p>  delay(500);//消抖</p><p>  if(set==0)</p><

86、p><b>  {</b></p><p><b>  temp1++;</b></p><p>  while(!set)</p><p><b>  scan();</b></p><p><b>  }</b></p><p

87、>  if(temp1==1)</p><p><b>  {</b></p><p>  xianshi(high);</p><p><b>  scan();</b></p><p>  if(add==0)</p><p><b>  {</b&

88、gt;</p><p>  while(!add)</p><p><b>  scan();</b></p><p><b>  high+=1;</b></p><p><b>  }</b></p><p>  if(dec==0)</p&g

89、t;<p><b>  {</b></p><p>  while(!dec)</p><p><b>  scan();</b></p><p><b>  high-=1;</b></p><p><b>  }</b></p>

90、;<p><b>  }</b></p><p>  if(temp1==2)</p><p><b>  {</b></p><p>  xianshi(low);</p><p>  if(add==0)</p><p><b>  {</b

91、></p><p>  while(!add)</p><p><b>  scan();</b></p><p><b>  low+=1;</b></p><p><b>  }</b></p><p>  if(dec==0)</p&g

92、t;<p><b>  {</b></p><p>  while(!dec)</p><p><b>  scan();</b></p><p><b>  low-=1;</b></p><p><b>  }</b></p>

93、<p><b>  scan();</b></p><p><b>  }</b></p><p>  if(temp1>=3)</p><p><b>  {</b></p><p><b>  temp1=0;</b></p&

94、gt;<p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p&

95、gt;<p>  /****************主函數(shù)************************/</p><p>  void main()</p><p><b>  {</b></p><p>  dm=0x00; //初始化端口</p><p><b>  w0=0;</b

96、></p><p><b>  w1=0;</b></p><p><b>  w2=0;</b></p><p><b>  w3=0;</b></p><p>  for(h=0;h<4;h++) //開機顯示"0000"</p>

97、<p><b>  {</b></p><p>  display[h]=0;</p><p><b>  }</b></p><p>  ow_reset(); //開機先轉(zhuǎn)換一次</p><p>  write_byte(0xcc); //Skip ROM</p>&

98、lt;p>  write_byte(0x44); //發(fā)轉(zhuǎn)換命令</p><p>  for(h=0;h<100;h++) //開機顯示"0000"</p><p><b>  {</b></p><p><b>  scan();</b></p><p><b

99、>  }</b></p><p><b>  while(1)</b></p><p><b>  {</b></p><p>  if (temp1==0)</p><p><b>  {</b></p><p>  work_tem

100、p(read_temp()); //處理溫度數(shù)據(jù)</p><p><b>  BEEP();</b></p><p>  scan(); //顯示溫度值</p><p>  keyscan();</p><p><b>  }</b></p><p><b>  e

101、lse</b></p><p>  keyscan();</p><p><b>  }</b></p><p><b>  }</b></p><p>  //***********************結(jié)束**************************//</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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論