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

下載本文檔

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

文檔簡介

1、<p><b>  摘要</b></p><p>  本設計是一個基于AT89S52單片機的“數(shù)字溫度計”。隨著科學技術的進步和發(fā)展,單片機技術已經(jīng)普及到我們的生活、學習、工作、科研等各個領域,已經(jīng)成為一種比較成熟的技術,因此,本文采用AT89S52單片機來實現(xiàn)這個測溫系統(tǒng)。此外,測溫系統(tǒng)的開發(fā)還利用了數(shù)字溫度傳感器DS18B20,可以方便的實現(xiàn)溫度的采集,并對傳感器在單片機下的硬

2、件連接,軟件編程以及各個模塊系統(tǒng)流程進行了分析,對各部分的電路也進行一一介紹。此測溫系統(tǒng)測量溫度的基本范圍是-50℃~110℃,精度誤差小于0.5℃,采用LED數(shù)碼直讀顯示,并且可以根據(jù)需要任意設定上下限的報警溫度以實現(xiàn)其超過報警值時給出提醒。其體積小、功耗低、結構簡單、讀數(shù)方便、測溫范圍廣、測溫準確、抗干擾能力強,主要用于對測溫比較準確的場所,或科研實驗室使用,有著很好的前景。</p><p>  關鍵詞:單片

3、機,數(shù)字控制,溫度計, DS18B20,AT89S51</p><p><b>  目錄</b></p><p>  第一章.概述- 3 -</p><p>  1.1、設計目的及意義- 3 -</p><p>  1.2、設計任務及要求- 3 -</p><p>  第二章.系統(tǒng)總體方案及

4、硬件設計- 4 -</p><p>  2.1、設計方案論證- 4 -</p><p>  2.1.1、方案一:使用熱敏電阻- 4 -</p><p>  2.1.2、方案二:采用數(shù)字溫度芯片DS18B20- 4 -</p><p>  2.2、總體設計框圖- 5 -</p><p>  2.3、主控電路器件

5、- 5 -</p><p>  2.4、時鐘電路和復位電路- 6 -</p><p>  2.5、按鈕輸入電路- 7 -</p><p>  2.6、顯示電路和驅動電路- 7 -</p><p>  2.7、數(shù)字溫度傳感器DS18B20- 8 -</p><p>  2.7.1、DS18B20簡單介紹- 8

6、 -</p><p>  2.7.2、DS18B20性能特點- 9 -</p><p>  2.7.3、DS18B20內部結構- 9 -</p><p>  2.7.4、DS18B20控制方法- 11 -</p><p>  2.8、溫度報警電路- 12 -</p><p>  第三章.軟件設計- 14 -&

7、lt;/p><p>  3.1、主程序流程圖- 14 -</p><p>  3.2、讀出溫度子程序- 15 -</p><p>  3.3、數(shù)據(jù)處理子程序- 16 -</p><p>  3.4、數(shù)據(jù)刷新子程序- 16 -</p><p>  3.5、報警子程序- 17 -</p><p&g

8、t;  第四章.實驗仿真- 18 -</p><p>  4.1、系統(tǒng)仿真設計- 18 -</p><p>  4.2、仿真結果分析- 18 -</p><p>  第五章.軟硬件系統(tǒng)的調試- 22 -</p><p>  第六章.課程設計體會- 23 -</p><p>  第七章. 參考文獻- 23 -

9、</p><p>  附1源程序代碼- 24 -</p><p>  附2系統(tǒng)原理圖- 36 -</p><p><b>  第一章</b></p><p><b>  概述</b></p><p>  1.1、設計目的及意義</p><p>  

10、1、理解單片機在自動化中的作用以及掌握單片機的編程方法和仿真軟件Proteus的使用方法。</p><p>  2、進一步熟悉和掌握單片機的內部結構和工作原理,了解單片機應用系統(tǒng)設計的基本方法和步驟。</p><p>  3、掌握鍵盤和顯示器在單片機控制系統(tǒng)中的應用。</p><p>  4、掌握撰寫課程設計報告的方法。</p><p>  

11、5、鍛煉自己的動手能力。</p><p>  1.2、設計任務及要求</p><p>  1、測量溫度的基本范圍是-50℃~110℃。</p><p>  2、測量精度誤差小于0.5℃。</p><p>  3、采用LED數(shù)碼直讀顯示。</p><p><b>  4、擴展功能。</b></

12、p><p>  5、可以任意設定溫度的上下限報警功能。</p><p><b>  第二章</b></p><p>  系統(tǒng)總體方案及硬件設計</p><p>  2.1、設計方案論證</p><p>  該系統(tǒng)主要由溫度測量和數(shù)據(jù)采集兩部分電路組成,實現(xiàn)的方法很多,下面將列出兩種在日常生活和工、農業(yè)

13、生產(chǎn)中經(jīng)常用到的實現(xiàn)方案。</p><p>  2.1.1、方案一:使用熱敏電阻</p><p>  由于本設計是測溫電路,可以使用熱敏電阻之類的器件利用其感溫效應,在將隨被測溫度變化的電壓或電流采集過來,進行A/D轉換后,就可以用單片機進行數(shù)據(jù)的處理,在顯示電路上,就可以將被測溫度值顯示出來,這種設計需要用到A/D轉換電路,感溫電路比較麻煩。</p><p>  

14、2.1.2、方案二:采用數(shù)字溫度芯片DS18B20</p><p>  采用數(shù)字溫度芯片DS18B20 測量溫度,輸出信號全數(shù)字化。便于單片機處理及控制,省去傳統(tǒng)的測溫方法的很多外圍電路。且該芯片的物理化學性很穩(wěn)定,它能用做工業(yè)測溫元件,此元件線形較好。在0~100 攝氏度時,最大線形偏差小于1 攝氏度。DS18B20 的最大特點之一采用了單總線的數(shù)據(jù)傳輸,由數(shù)字溫度計DS18B20和微控制器AT89S52構成的

15、溫度測量裝置,它直接輸出溫度的數(shù)字信號,可直接與計算機連接。這樣,測溫系統(tǒng)的結構就比較簡單,體積也不大。采用單片機控制,軟件編程的自由度大,可通過編程實現(xiàn)各種各樣的算術算法和邏輯控制,而且體積小,硬件實現(xiàn)簡單,安裝方便。</p><p>  控制工作,還可以與PC 機通信上傳數(shù)據(jù),另外AT89S52在工業(yè)控制上也有著廣泛的應用,編程技術及外圍功能電路的配合使用都很成熟。</p><p> 

16、 該系統(tǒng)利用AT89S52芯片控制溫度傳感器DS18B20進行實時溫度檢測并顯示,能夠實現(xiàn)快速測量環(huán)境溫度,并可以根據(jù)需要設定上下限報警溫度。</p><p>  從以上兩種方案很容易看出,采用方案二,硬件電路比較簡單,軟件設計也比較簡單,因此,采用方案二進行“數(shù)字溫度計”的設計。</p><p>  2.2、總體設計框圖</p><p>  數(shù)字溫度計的原理框圖如

17、圖1所示。</p><p>  圖1 數(shù)字溫度計原理框圖</p><p>  數(shù)字溫度計主要是由單片機控制器AT89S52和溫度傳感器DS18B20以及LED顯示電路組成。由DS18B20溫度傳感器芯片測量當前的溫度,并將結果送入單片機,通過AT89S51單片機芯片對送來的測量溫度讀數(shù)進行計算和轉換,并將此結果送入顯示電路顯示。其中,DSI8B20溫度傳感器芯片采用“一線制”與單片機相連,

18、它獨立地完成溫度測量以及將溫度測量結果送到單片機的工作。</p><p><b>  元器件總清單</b></p><p>  2.3、主控電路器件</p><p>  對于單片機選用AT89S52。AT89S52 是美國ATMEL公司生產(chǎn)的一個低功耗,高性能CMOS 8位單片機,片內含8k Bytes ISP(In-system progra

19、mmable)的可反復擦寫1000次的Flash只讀程序存儲器,器件采用ATMEL公司的高密度、非易失性存儲技術制造,兼容標準MCS -51指令系統(tǒng)及80C51引腳結構,芯片內集成了通用8位中央處理器和ISP Flash存儲單元,功能強大的微型計算機的AT89S52可為許多嵌入式控制應用系統(tǒng)提供高性價比的解決方案。</p><p>  AT89S52具有如下特點:40個引腳,8k Bytes Flash片內程序存

20、儲器,256 bytes的隨機存取數(shù)據(jù)存儲器(RAM),32個外部雙向輸入/輸出(I/O)口,5個中斷優(yōu)先級2層中斷嵌套中斷,2個16位可編程定時計數(shù)器,2個 全雙工串行通信口,看門狗(WDT)電路,片內時鐘振蕩器。</p><p>  AT89S52單片機引腳圖如圖2所示。</p><p>  圖 2 AT89S52單片機引腳圖</p><p>  2.4、時鐘電

21、路和復位電路</p><p>  MCS-51內部有一個構成振蕩器的高增益反相放大器,此放大器的輸入端口和輸出端口分別是引腳 XTAL1 和 XTAL2,在 XTAL1 和 XTAL2 上外接時鐘源,即可構成時鐘電路。根據(jù)單片機的生產(chǎn)工藝不同,可以分為內部和外部兩種時鐘產(chǎn)生方式。本次設計采用內部時鐘產(chǎn)生方式,其電路圖如圖3所示。</p><p><b>  圖3 時鐘電路圖<

22、;/b></p><p>  復位是使CPU和系統(tǒng)中其他部件都處于一個確定的初始狀態(tài),并從這個狀態(tài)開始工作。MCS-51單片機通常采用上電自動復位、按鈕電平復位、外部脈沖復位、上電+按鈕電平復位、程序運行監(jiān)視復位等方式。本次設計采用上電+按鈕電平復位,其電路圖如圖4所示。</p><p><b>  圖4 復位電路圖</b></p><p&g

23、t;  2.5、按鈕輸入電路</p><p>  鍵盤可以分為獨立連接式和矩陣式兩類。獨立連接式按鍵是指直接用I/O口線構成的單個按鍵電路。每個鍵單獨占用一根I/O口線,每根I/O線的工作狀態(tài)不會影響其他I/O口線的工作狀態(tài)。</p><p>  未有按鍵按下時,所有的數(shù)據(jù)輸入線都處于高電平狀態(tài)。當任何一個鍵按下時,與之相連的數(shù)據(jù)輸入線將被拉成低電平,要判斷是否有鍵按下,只需要用微操作指令

24、即可。</p><p>  獨立連接式按鍵接口電路配置靈活,軟件結構簡單,但每個按鍵必須占用一根I/O口線,在按鍵較多時,I/O口線浪費較大,故只在按鍵數(shù)量不多時采用這種按鍵電路。</p><p>  于使用按鍵較少,本次設計采用獨立連接式按鍵。按鈕輸入電路如圖5所示。</p><p><b>  圖5 按鈕輸入電路</b></p>

25、<p>  2.6、顯示電路和驅動電路</p><p>  本次設計要求使用4位的七段LED數(shù)碼顯示,LED顯示器內部由7段發(fā)光二極管組成,因此亦稱之為七段LED顯示器,由于主要用于顯示各種數(shù)字符號,故又稱之為LED數(shù)碼管。每個顯示器還有一個圓點型發(fā)光二極管,用于顯示小數(shù)點。但其編程相對復雜,可顯示字符比較少。顯示電路如圖6所示。</p><p>  圖 6 顯示電路和驅動電

26、路</p><p>  2.7、數(shù)字溫度傳感器DS18B20</p><p>  由于傳統(tǒng)的熱敏電阻等測溫元件測出的一般都是電壓,再轉換成對應的溫度,需要比較多的外部元件支持,且硬件電路復雜,制作成本相對較高。因此,本設計采用DALLAS公司的數(shù)字溫度傳感器DS18B20作為測溫元件。</p><p>  2.7.1、DS18B20簡單介紹</p>&

27、lt;p>  DS18B20是DALLAS公司的一種新型的單線數(shù)字溫度傳感器,其體積更小、更適用于多種場合、且適用電壓更寬、更經(jīng)濟。溫度測量范圍為-55~+125 攝氏度,可編程為9位~12位轉換精度,測溫分辨率可達0.0625攝氏度,分辨率設定參數(shù)以及用戶設定的報警溫度存儲在EEPROM中,掉電后依然保存。被測溫度用符號擴展的16位數(shù)字量的方式串行輸出;其工作電源既可以在遠端引入,也可以采用寄生電源方式產(chǎn)生;多個DS18B20可

28、以并聯(lián)到3 根或2 根線上,CPU只需一根端口線就能與諸多DS18B20 通信,占用微處理器的端口較少,可節(jié)省大量的引線和邏輯電路。因此用它來組成一個測溫系統(tǒng),具有線路簡單,在一根通信線,可以連接很多這樣的數(shù)字溫度計,十分方便。</p><p>  2.7.2、DS18B20性能特點</p><p>  DS18B20 的性能特點:</p><p>  1、用單總線

29、專用技術,既可通過串行口線,也可通過其它I/O 口線與微機接口,無須經(jīng)過其它變換電路,直接輸出被測溫度值(9 位二進制數(shù),含符號位)。</p><p>  2、測溫范圍為-55℃-+125℃,測量分辨率為0.0625℃。</p><p>  3、內含64位經(jīng)過激光修正的只讀存儲器ROM。</p><p>  4、適配各種單片機或系統(tǒng)機。</p><

30、;p>  5、用戶可分別設定各路溫度的上、下限。</p><p><b>  6、內含寄生電源。</b></p><p>  2.7.3、DS18B20內部結構</p><p>  DS18B20內部結構主要由四部分組成:64位光刻ROM,溫度傳感器,非揮發(fā)的溫度報警觸發(fā)器TH和TL,高速暫存器。DS18B20的管腳排列如圖7所示。<

31、;/p><p>  圖7 DS18B20 引腳分布圖</p><p>  64 位光刻ROM 是出廠前被光刻好的,它可以看作是該DS18B20 的地址序列號。不同的器件地址序列號不同。</p><p>  DS18B20 高速暫存器共9個存儲單元,如表1所示:</p><p>  表1 DS18B20高速暫存器</p><p

32、>  以12 位轉化為例說明溫度高低字節(jié)存放形式及計算:12 位轉化后得到的12 位數(shù)據(jù),存儲在18B20 的兩個高低兩個8 位的RAM 中,二進制中的前面5 位是符號位。如果測得的溫度大于0,這5 位為0,只要將測到的數(shù)值乘于0.0625 即可得到實際溫度;如果溫度小于0,這5 位為1,測到的數(shù)值需要取反加1 再乘于0.0625 才能得到實際溫度。</p><p>  2.7.4、DS18B20控制方法&

33、lt;/p><p>  在硬件上,DS18B20 與單片機的連接有兩種方法,一種是VCC接外部電源,GND 接地,I/O 與單片機的I/O 線相連;另一種是用寄生電源供電,此時UDD、GND 接地,I/O 接單片機I/O。無論是內部寄生電源還是外部供電,I/O 口線要接5KΩ左右的上拉電阻。</p><p>  DS18B20 有六條控制命令,如表2所示:</p><p&g

34、t;  表2 DS18B20 有六條控制命令</p><p>  CPU 對DS18B20 的訪問流程是:先對DS18B20 初始化,再進行ROM 操作命令,最后才能對存儲器操作,數(shù)據(jù)操作。DS18B20 每一步操作都要遵循嚴格的工作時序和通信協(xié)議。如主機控制DS18B20 完成溫度轉換這一過程,根據(jù)DS18B20 的通訊協(xié)議,須經(jīng)三個步驟:每一次讀寫之前都要對DS18B20 進行復位,復位成功后發(fā)送一條ROM

35、 指令,最后發(fā)送RAM 指令,這樣才能對DS18B20 進行預定的操作。</p><p>  2.8、溫度報警電路</p><p>  本設計采用軟件處理報警,直流供電,利用有源蜂鳴器進行報警輸出。當所測溫度超過或低于所預設的溫度值時,數(shù)據(jù)口的電平將會被拉高,報警輸出。同時,所測溫度超過上限溫度時,紅燈亮;低于下限溫度時,黃燈亮;正常工作時,綠燈亮。報警電路了硬件連接如圖8所示。</

36、p><p><b>  圖8 報警電路圖</b></p><p><b>  第三章</b></p><p><b>  軟件設計</b></p><p>  由于KeilC是一種結構化的語言,具有靈活、高效等優(yōu)點,并且C語言比匯編語言更具有可讀性,因此,本程序是在KeilC的編譯

37、環(huán)境下進行編譯連接的。其軟件窗口界面如圖10所示。</p><p>  圖10 KeilC軟件窗口界面</p><p>  本系統(tǒng)程序主要包括主程序,讀出溫度子程序,溫度數(shù)據(jù)處理子程序,顯示數(shù)據(jù)刷新子程序,報警子程序等。</p><p>  3.1、主程序流程圖</p><p>  主程序的主要功能是負責溫度的實時顯示、讀出并處理DS18B

38、20的測量的當前溫度值,溫度每隔一定時間測量進行一次,這樣可以實時的顯示當前的溫度值。主程序流程見圖11所示。</p><p>  圖11 主程序流程圖 圖12 讀出溫度子程序流程圖</p><p>  3.2、讀出溫度子程序</p><p>  讀出溫度子程序的主要功能是讀出RAM中9字節(jié)的內容,并將其整合成一整數(shù)存儲在

39、暫存器中。其程序流程圖如圖12所示.</p><p>  3.3、數(shù)據(jù)處理子程序</p><p>  溫度數(shù)據(jù)處理子程序將從RAM中讀取的值進行BCD碼的轉換運算,并進行溫度值正負的判定,其程序流程圖如圖13所示。</p><p>  圖13 數(shù)據(jù)處理子程序流程圖</p><p>  3.4、數(shù)據(jù)刷新子程序</p><p

40、>  顯示數(shù)據(jù)刷新子程序主要是對顯示緩沖器中的顯示數(shù)據(jù)進行刷新操作,當最高位顯示為0時,將符號顯示位移入下一位。程序流程圖如圖14所示。</p><p>  圖14 數(shù)據(jù)刷新子程序流程圖</p><p><b>  3.5、報警子程序</b></p><p>  報警子程序主要實現(xiàn)當測量的實際溫度高于設定溫度的上限時,蜂鳴器響,并且紅色

41、指示燈亮;當測量的實際溫度低于設定溫度的下限時,蜂鳴器響,黃色指示燈亮;當測量的實際溫度介于設定溫度的上下限時,蜂鳴器不響,綠色指示燈亮。其流程圖如圖15所示。</p><p>  圖15 報警子程序流程圖</p><p><b>  第四章</b></p><p><b>  實驗仿真</b></p>&

42、lt;p>  4.1、系統(tǒng)仿真設計</p><p>  對于單片機這一門實踐性非常強、非常抽象的課程,Proteus是一個非常好的仿真軟件。因此,本次設計采用Proteus對數(shù)字溫度計進行仿真。Proteus軟件窗口界面如圖16所示。</p><p>  圖16 Proteus軟件窗口界面</p><p>  將與真實元件對應的虛擬元件調出,繪制在窗口的圖紙

43、上。連接好線路并保證沒有問題時,將編譯生成的(*.hex)文件調入虛擬單片機中,點擊運行,即可通過仿真電路了解真實電路的運行結果。</p><p>  4.2、仿真結果分析</p><p>  此數(shù)字溫度計可以測量溫度范圍為-50℃~110℃,溫度誤差小于0.5℃,并且可以任意設定上下限溫度。假設上限溫度設定為40℃,下限溫度設定為15℃。如圖17、圖18所示。</p>&l

44、t;p>  圖17 上限溫度設定為40℃</p><p>  圖18 下限溫度設定為15℃</p><p>  當溫度傳感器測量的實際溫度超過上限溫度時,蜂鳴器響、紅色指示燈亮。如圖19所示。</p><p>  圖19 實際溫度超過40℃</p><p>  當實際溫度低于下限溫度時,蜂鳴器響、黃色指示燈亮。如圖20所示。<

45、;/p><p>  圖20 實際溫度低于15℃</p><p>  當實際溫度介于上下限溫度之間時,蜂鳴器不響、綠色指示燈亮。如圖21所示。</p><p>  圖21 實際溫度介于15℃~40℃</p><p><b>  第五章</b></p><p><b>  軟硬件系統(tǒng)的調試&

46、lt;/b></p><p>  DS18B20最大的特點是單總線數(shù)據(jù)傳輸方式,DS18B20的數(shù)據(jù)I/O均由同一條線來完成。DS18B20的電源供電方式有2種:外部供電方式和寄生電源方式。工作于寄生電源方式時,VDD和GND均接地,這在需要遠程溫度探測和空間受限的場合特別有用,原理是當1Wire總線的信號線DQ為高電平時,竊取信號能量給DS18B20供電,同時一部分能量給內部電容充電;當DQ為低電平時釋放

47、能量為DS18B20供電。但寄生電源方式需要上啦電路,軟件控制變得復雜(特別是在完成溫度轉換和拷貝數(shù)據(jù)到E2PROM時),同時芯片的性能也有所降低。因此,在條件允許的場合,盡量采用外部供電方式。無論是內部寄生電源還是外部電源,I/O口線要接5K左右的上拉電阻。在這里采用外部電源供電方式。DS18B20與芯片連接電路如圖22所示。</p><p>  圖22 DS18B20與單片機的連接</p>&l

48、t;p>  外部電源供電方式是DS18B20最佳的工作方式,工作穩(wěn)定可靠,抗干擾能力強,而且電路也比較簡單,可以開發(fā)出穩(wěn)定可靠的多點溫度監(jiān)控系統(tǒng)。一般在發(fā)中使用外部電源供電方式,畢竟比寄生電源方式只多接一根VCC引線。在外接電源方式下,可以充分發(fā)揮DS18B20寬電源電壓范圍的優(yōu)點,即使電源電壓VCC降到3V時,依然能夠保證溫度量精度。</p><p><b>  第六章</b><

49、;/p><p><b>  課程設計體會</b></p><p>  經(jīng)過兩周的時間,終于完成了數(shù)字溫度計的單片機課程設計,雖然完成的效果沒有想象的那么完美,但我們已經(jīng)盡力做了,雖然在硬件電路的連接和調試上出現(xiàn)了一定的問題我們還是努力的研究去解決了。從中我們也學到了很多課本中沒有的東西。軟件設計方面,程序不是最簡潔的,算法也不是最優(yōu)的,但我們通過努力認真地去完成了它,讓我

50、們嘗試了那種程序設計中的難點重點,為我們以后的編程設計打下了一定的基礎。通過本次溫度計的設計,我們對單片機有了進一步的熟悉和掌握,同時也熟悉了Proteus、KeilC等軟件的基本操作、了解了如何撰寫課程設計報告、和對word長文檔的排版方式,并且在此過程中我們還學會了利用各種資源查找我們所需要的資料,提高了我們的判斷和分析問題的能力。</p><p>  這次課程設計讓我們重新體驗到理論與實際相結合的重要性,不

51、僅鍛煉了我們的動手能力,并且為以后的工作和學習積累了經(jīng)驗,為以后我們參加工作打下了良好的基礎。</p><p><b>  第七章</b></p><p><b>  參考文獻</b></p><p>  [1]余發(fā)山 王福忠.《單片機原理及應用技術》.中國礦業(yè)大學出版社.2008</p><p>

52、  [2]彭偉.《單片機C語言程序設計實訓》電子工業(yè)出版社.2010. </p><p>  [3]楊凌霄.《微型計算機原理與應用》.中國電力出版社2003 </p><p>  [4]李朝青.單片機原理及接口技術(簡明修訂版).杭州:北京航空航天大學出版社,1998</p><p>  [5]李廣弟.單片機基礎[M].北京:北京航空航天大學出版社,1994<

53、/p><p>  [6]閻石.數(shù)字電子技術基礎(第三版). 北京:高等教育出版社,1989</p><p>  [7]DS18B20數(shù)據(jù)手冊</p><p><b>  附1源程序代碼</b></p><p>  /***************************************************/<

54、;/p><p>  #include "reg51.h"</p><p>  #include "intrins.h"//_nop_();延時函數(shù)用</p><p>  #include "math.h"</p><p>  #define disdata P0

55、 //段碼輸出口</p><p>  #define discan P2 //掃描口</p><p>  #define uchar unsigned char</p><p>  #define uint unsigned int</p><p>  sbit duqu=P3^

56、6; //溫度輸入口</p><p>  sbit dian=P0^7; //LED小數(shù)點控制</p><p>  sbit beep=P1^6;//蜂鳴器</p><p>  sbit key0=P3^0;</p><p>  sbit

57、key1=P3^1;</p><p>  sbit key02=P3^2;</p><p>  sbit key03=P3^3;</p><p>  sbit led0=P1^0;//紅燈</p><p>  sbit led1=P1^1;//綠燈</p><p>  s

58、bit led2=P1^2;//黃燈</p><p>  uint h; </p><p>  uint temp;</p><p>  uchar r;</p><p>  char high=40,low=15;</p><p>  uchar sign;</p>

59、;<p>  uchar st=1;</p><p>  uchar ti;</p><p>  uchar pp;</p><p>  uchar ee;</p><p>  uchar nn;</p><p>  //**************溫度小數(shù)部分用查表法*****

60、******//</p><p>  uchar code ditab[16]=</p><p>  {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};</p><p><b>  //</b></p><p&g

61、t;  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" "4" &q

62、uot;5" "6" "7" "8" "9" "不亮" "-" "H" "L" "C" </p><p>  uchar code scan_con[4]={0x70,0xb0,0xd0,0xe0}

63、; //列掃描控制字</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>  /*****

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

65、><p>  /****************顯示掃描函數(shù)***************************/</p><p>  void scan()</p><p><b>  {</b></p><p><b>  char k;</b></p><p>  for

66、(k=0;k<4;k++) //4位LED掃描控制</p><p><b>  {</b></p><p>  discan=scan_con[k]; //位選</p><p>  disdata=dis_7[display[k]]; //數(shù)據(jù)顯示</p><p&g

67、t;  if (k==1){dian=1;} //小數(shù)點顯示</p><p>  delay(200);</p><p><b>  }</b></p><p><b>  }</b></p><p>  /****************DS18B20復位函數(shù)*********

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

69、/p><p>  while(presence)</p><p><b>  {</b></p><p>  duqu=1;_nop_();_nop_(); //從高拉倒低</p><p>  duqu=0; </p><p>

70、;  delay(50); //550 us</p><p>  duqu=1; </p><p>  delay(6); //66 us</p><p>  presence=duqu; //presence=0 復

71、位成功,繼續(xù)下一步</p><p><b>  } </b></p><p>  delay(45); //延時500 us</p><p>  presence=~duqu; </p><p><b>  }</b></p><

72、p>  duqu=1; //拉高電平</p><p><b>  }</b></p><p>  /****************DS18B20寫命令函數(shù)************************/</p><p>  //向1-WIRE 總線上寫1個字節(jié)</p>&l

73、t;p>  void write_byte(uchar val)</p><p><b>  { </b></p><p><b>  uchar i;</b></p><p>  for(i=8;i>0;i--)</p><p><b>  {</b></p

74、><p>  duqu=1;_nop_();_nop_(); //從高拉倒低</p><p>  duqu=0;_nop_();_nop_();_nop_();_nop_(); //5 us</p><p>  duqu=val&0x01; //最低位移出</p>

75、<p>  delay(6); //66 us</p><p>  val=val/2; //右移1位</p><p><b>  }</b></p><p><b>  duqu=1;</b&

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

77、<p>  uchar read_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><

78、;p><b>  {</b></p><p>  duqu=1;_nop_();_nop_();</p><p>  value>>=1;</p><p>  duqu=0;_nop_();_nop_();_nop_();_nop_(); //4 us</p><p>  duqu=1;_n

79、op_();_nop_();_nop_();_nop_(); //4 us</p><p>  if(duqu)value|=0x80;</p><p>  delay(6); //66 us</p><p><b>  }</b></p><

80、;p><b>  duqu=1;</b></p><p>  return(value);</p><p><b>  }</b></p><p>  /****************讀出溫度函數(shù)************************/</p><p>  uint read_te

81、mp()</p><p><b>  {</b></p><p>  ow_reset(); //總線復位</p><p>  delay(200);</p><p>  write_byte(0xcc); //發(fā)命令</p><p>  w

82、rite_byte(0x44); //發(fā)轉換命令</p><p>  ow_reset(); </p><p><b>  delay(1);</b></p><p>  write_byte(0xcc); //發(fā)命令</p><p>  write_byte(0xbe);&l

83、t;/p><p>  temp_data[0]=read_byte(); //讀溫度值的第字節(jié)</p><p>  temp_data[1]=read_byte(); //讀溫度值的高字節(jié)</p><p>  temp=temp_data[1];</p><p>  temp<<=8;

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

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

86、;<p>  /********************************************************/</p><p>  work_temp(uint tem)</p><p><b>  {</b></p><p>  uchar n=0;</p><p><b>

87、  nn=0;</b></p><p>  if(tem>6348) // 溫度值正負判斷</p><p>  {tem=65536-tem;n=1;nn=1;} // 負溫度求補碼,標志位置1</p><p>  display[4]=tem&0x0f; // 取

88、小數(shù)部分的值</p><p>  display[0]=ditab[display[4]]; // 存入小數(shù)部分顯示值</p><p>  display[4]=tem>>4; // 取中間八位,即整數(shù)部分的值</p><p>  display[3]=display[4]/100; // 取百位數(shù)據(jù)暫存</p&g

89、t;<p>  display[1]=display[4]%100; // 取后兩位數(shù)據(jù)暫存</p><p>  display[2]=display[1]/10; // 取十位數(shù)據(jù)暫存</p><p>  display[1]=display[1]%10;</p><p>  r=display[1]+display[2]*10+d

90、isplay[3]*100;</p><p>  /******************符號位顯示判斷**************************/</p><p>  if(!display[3]) </p><p><b>  {</b></p><p>  display[3]=0x0a; //

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

92、lt;/b></p><p>  if(n){display[3]=0x0b;} //負溫度時最高位顯示"-"</p><p><b>  }</b></p><p>  /******************蜂鳴器報警函數(shù)**************************/</p><p&

93、gt;  void BEEP()</p><p><b>  {</b></p><p>  if(r>=high||r<=low)</p><p><b>  {</b></p><p>  beep=0;led1=1;</p><p>  if(r>=h

94、igh)</p><p><b>  {</b></p><p>  led0=0;led2=1;</p><p><b>  }</b></p><p>  else if(r<=low)</p><p><b>  {</b></p&g

95、t;<p>  led2=0;led0=1;</p><p><b>  }</b></p><p><b>  }</b></p><p>  else if((nn==1)&&(r>=abs(low)))</p><p><b>  {</b

96、></p><p>  led2=0;led0=1;beep=0;led1=1;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  beep=1;led

97、1=0;led0=1;led2=1;</p><p><b>  }</b></p><p><b>  }</b></p><p>  /******************初始化函數(shù)**************************/</p><p>  void init()</p&g

98、t;<p><b>  {</b></p><p><b>  beep=0;</b></p><p><b>  EA=1;</b></p><p><b>  EX0=0;</b></p><p><b>  EX1=0;&l

99、t;/b></p><p><b>  IT0=1;</b></p><p><b>  IT1=1;</b></p><p>  TMOD=0x11;</p><p>  TH0=(65536-10000)/256;</p><p>  TL0=(65536-1000

100、0)%256;</p><p>  TH1=(65536-833)/256;</p><p>  TL1=(65536-833)%256;</p><p><b>  sign=0;</b></p><p><b>  ti=high;</b></p><p><b&

101、gt;  }</b></p><p>  /******************溫度/上下限調整切換**************************/</p><p>  void key11()</p><p><b>  {</b></p><p>  while(key1==0)</p>

102、<p><b>  {</b></p><p>  delay(300);</p><p>  if(key1==0)</p><p><b>  {</b></p><p><b>  st++;</b></p><p><b&

103、gt;  if(st==4)</b></p><p><b>  st=1;</b></p><p><b>  }</b></p><p>  while(!key1);</p><p>  delay(300);</p><p>  while(!key1);

104、</p><p><b>  }</b></p><p><b>  }</b></p><p>  /******************切換調整上下限**************************/</p><p>  void key10()</p><p>&l

105、t;b>  {</b></p><p>  while(key0==0)</p><p>  { </p><p>  delay(300); //消抖動</p><p>  if(key0==0)</p><p><b>  {&

106、lt;/b></p><p>  sign=!sign;</p><p><b>  }</b></p><p>  while(!key0);</p><p>  delay(300);</p><p>  while(!key0);</p><p><b&g

107、t;  }</b></p><p><b>  }</b></p><p>  /******************上下限加1**************************/</p><p>  void key2() </p><p><b>  {</b></p>

108、<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(si

109、gn)</b></p><p>  {low=low+1;</p><p>  if(low>high)</p><p>  {pp=low;low=high;high=pp;}</p><p><b>  }</b></p><p><b>  else</b

110、></p><p>  {high=high+1;ti=high;}</p><p><b>  }</b></p><p>  while(!key02);</p><p>  delay(400);</p><p>  while(!key02);</p><p&g

111、t;<b>  }</b></p><p><b>  }</b></p><p>  /******************上下限減1**************************/</p><p>  void key3() </p><p><b>  {</b>&

112、lt;/p><p>  while(key03==0)</p><p><b>  {</b></p><p>  delay(400);</p><p>  if(key03==0)</p><p><b>  {</b></p><p><b&g

113、t;  if(sign)</b></p><p>  low=low-1;</p><p><b>  else</b></p><p>  {high=high-1;ti=high;</p><p>  if(low>high)</p><p>  {pp=low;low=h

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

115、<p><b>  } </b></p><p><b>  }</b></p><p>  /******************上限溫度顯示**************************/</p><p>  void high1()</p><p><b>  

116、{</b></p><p><b>  uchar k;</b></p><p>  if(high<100)</p><p>  {display[0]=high%10;</p><p>  display[1]=high/10;</p><p>  display[2]=1

117、0;</p><p>  display[3]=12;</p><p>  for(k=0;k<4;k++) </p><p><b>  {</b></p><p>  discan=scan_con[k]; </p><

118、;p>  disdata=dis_7[display[k]]; </p><p>  if (k==1){dian=0;} </p><p>  delay(300);</p><p>  disdata=0x00;</p><p>  delay(100);</p>&

119、lt;p><b>  }</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  display[0]=high%10;</p><

120、;p>  display[1]=high%100/10;</p><p>  display[2]=high/100;</p><p>  display[3]=12;</p><p>  for(k=0;k<4;k++) </p><p><b>  {</b>

121、;</p><p>  discan=scan_con[k]; </p><p>  disdata=dis_7[display[k]]; </p><p>  if (k==1){dian=0;} </p><p>  delay(300);</p>

122、<p>  disdata=0x00;</p><p>  delay(100);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  /********

123、**********下限溫度顯示**************************/</p><p>  void low1()</p><p><b>  {</b></p><p><b>  uchar ki;</b></p><p>  if(low>=0)</p>&

124、lt;p>  { display[0]=low%10;</p><p>  display[1]=low/10;</p><p>  display[2]=10;</p><p>  display[3]=13;</p><p>  for(ki=0;ki<4;ki++) </p&

125、gt;<p><b>  {</b></p><p>  discan=scan_con[ki]; </p><p>  disdata=dis_7[display[ki]]; </p><p>  if (ki==1){dian=0;} </p>

126、<p>  delay(100);</p><p>  disdata=0x00;</p><p>  delay(100);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  else</

127、b></p><p><b>  {</b></p><p>  ee=abs(low);</p><p>  display[0]=ee%10;</p><p>  display[1]=ee/10;</p><p>  display[2]=11;</p><p>

128、;  display[3]=13;</p><p>  for(ki=0;ki<4;ki++) </p><p><b>  {</b></p><p>  discan=scan_con[ki]; </p><p>  disdata=dis_7[

129、display[ki]]; </p><p>  if (ki==1){dian=0;} </p><p>  delay(100);</p><p>  disdata=0x00;</p><p>  delay(100);</p><p><b>  }<

溫馨提示

  • 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

提交評論