項目數字溫度采集系統的設計_第1頁
項目數字溫度采集系統的設計_第2頁
項目數字溫度采集系統的設計_第3頁
項目數字溫度采集系統的設計_第4頁
項目數字溫度采集系統的設計_第5頁
已閱讀5頁,還剩71頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、電子工業出版社單片機控制技術 項目式教程 (C語言版)1電子工業出版社項目10 數字溫度采集系統的設計2 能了解A/D轉換器的相關技術指標; 能理解ADC0809的工作原理與應用方法; 能掌握ADC0809與51單片機的接口方法; 能掌握DS18B20的工作原理和應用方法; 能掌握數字溫度采集系統的硬件電路的分析與設計方法; 能熟練編寫數字溫度采集系統的單片機控制程序。 學習目標 3 敘述A/D轉換器的技術指標要求; 敘述ADC0809的工作原理; 敘述DS18B20的工作原理; 設計單片機控制的數字溫度采集系統的工作電路; 編寫數字溫度采集系統的單片機控制程序。 工作任務 4任務10.1 數

2、字電壓表的設計任務10.2 數字溫度采集系統的設計 項目拓展 串行A/D轉換芯片PCF8591 在實驗板上的應用項目小結思考與訓練項目10 數字溫度采集系統的設計5任務10.1 數字電壓表的設計 能夠將模擬量轉換成數字量的器件稱為模數(A/D)轉換器。10.1.1 A/D轉換器的基本原理1A/D轉換器的主要指標(1)分辨率:A/D轉換器能分辨的最小模擬輸入量。也就是指使輸出數字量變化一個相鄰數碼所需輸入模擬電壓的變化量。通常用能轉換成的數字量的位數來表示,如8位、10位、12位、16位等。位數越高,分辨率越高。(2)轉換時間:A/D轉換器完成一次轉換所需的時間。轉換時間是編程時必須考慮的參數。

3、(3)量程:A/D轉換器所能轉換的輸入電壓范圍,如5V、10V等。(4)精度:與數字輸出量所對應的模擬輸入量的實際值與理論值之間的差值。有絕對精度和相對精度兩種表示方法。常用數字量的位數作為度量絕對精度的單位,如精度為1/2LSB,而用百分比來表示滿量程時的相對誤差,如0.05%。62A/D轉換器的分類按轉換原理可分為逐次逼近(比較)式、雙積分式、計數式和并行式A/D轉換器;按其分辨率可分為816位的A/D轉換器芯片。目前最常用的是逐次逼近式和雙積分式。逐次逼近式A/D轉換器是一種速度較快、精度較高的轉換器,其轉換時間在幾微秒到幾百微秒之間。常用產品有ADC0801ADC0805型8位MOS型

4、A/D轉換器、ADC08080809型8位MOS型A/D轉換器、ADC08160817型8位MOS型A/D轉換器、AD574型快速12位A/D轉換器。雙積分式A/D轉換器的優點是轉換精度高,抗干擾性能好,價格便宜,但轉換速度較慢。因此這種轉換器主要用于速度要求不高的場合。常用產品有ICL7106ICL7107ICL7126、MC144335G14433、ICL7135等。73A/D轉換器與單片機的接口方法A/D轉換器與單片機的接口主要考慮的是數字量輸出線的連接、ADC啟動方式、轉換結束信號處理方法以及時鐘的連接等。A/D轉換器數字量輸出線與單片機的連接方法與其內部結構有關。對于內部帶有三態鎖存

5、數據輸出緩沖器的ADC(如ADC0809、AD574等),可直接與單片機相連。對于內部不帶鎖存器ADC,一般通過鎖存器或并行I/O接口與單片機相連。在某些情況下,為了增強控制功能,那些帶有三態鎖存數據輸出緩沖器的ADC也常采用I/O接口連接。隨著位數的不同,ADC與單片機的連接方法也不同。對于8位ADC,其數字輸出線可與8位單片機數據線對應相接。對于8位以上的ADC,必須增加讀取控制邏輯,把8位以上的數據分兩次或多次讀取。 8ADC開始轉換時,必須加一個啟動轉換信號,這一啟動信號要由單片機提供。不同型號的ADC,對于啟動轉換信號的要求也不同,一般分為脈沖啟動和電平啟動兩種。對于脈沖啟動型ADC

6、,只要給其啟動控制端上加一個符合要求的脈沖信號即可,如ADC0809、AD574等。通常用WR和地址譯碼器的輸出經一定的邏輯電路進行控制。對于電平啟動型ADC,當把符合要求的電平加到啟動控制端上時,立即開始轉換,在轉換過程中,必須保持這一電平,否則會終止轉換的進行。因此,在這種啟動方式下,單片機的控制信號必須經過鎖存器保持一段時間,一般采用觸發器、鎖存器或并行I/O接口等來實現。AD570、AD571等都屬于電平啟動型ADC。9當ADC轉換結束時,ADC輸出一個轉換結束標志信號,通知單片機讀取轉換結果。單片機檢查判斷A/D轉換結束的方法一般有中斷和查詢兩種。對于中斷方式,可將轉換結束標志信號接

7、到單片機的中斷請求輸入線上或允許中斷的I/O接口的相應引腳,作為中斷請求信號;對于查詢方式,可把轉換結束標志信號經三態門送到單片機的某一位I/O口線上,作為查詢狀態信號。A/D轉換器的另一個重要連接信號是時鐘,其頻率是決定芯片轉換速度的基準。整個A/D轉換過程都是在時鐘的作用下完成的。A/D轉換時鐘的提供方法有兩種:一種是由芯片內部提供(如AD574),一般不需外加電路;另一種是由外部提供,有的用單獨的振蕩電路產生,更多的則是把單片機輸出時鐘經分頻后,送到A/D轉換器的相應時鐘端。101ADC0809的性能ADC0809采用5V電源供電。轉換時間:取決于芯片的工作時鐘。ADC0809為外接時鐘

8、,轉換一次的時間為64個時鐘周期,當工作時鐘為500KHz時,轉換時間為128s,最大允許值為800KHz。8位CMOS逐次逼近型的A/D轉換器。三態鎖定輸出。分辨率:8位。總誤差:1LSB。模擬輸入電壓范圍:單極性05V。10.1.2 ADC0809芯片的介紹112ADC0809的內部結構逐次逼近式A/D轉換器,由控制與時序電路、逐次逼近寄存器、樹狀開關以及256R電阻階梯網絡等組成。 用于存放和輸出轉換得到的數字量。可實現8路模擬信號的分時采集,轉換后的數字量的輸出是三態的(總線型輸出),可直接與單片機數據總線相連接。12ADC0809有8個模擬量輸入通道IN0IN7,在某一時刻,模擬開關

9、只能與一路模擬量通道接通,對該通道進行A/D轉換。8路模擬開關與輸入通道的關系如表所示。ADDC、ADDB、ADDA是三條通道的地址線。當地址鎖存信號ALE為高電平時,ADDC、ADDB、ADDA三條線上的數據送入ADC0809內部的地址鎖存器中,經過譯碼器譯碼后選中某一通道。當ALE0時,地址鎖存器處于鎖存狀態,模擬開關始終與剛才選中的輸入通道接通。ADC0809是分時處理8路模擬量輸入信號的。 注意:ADC0809通道的選擇比較靈活,根據應用的需要,可以固定選擇,也可以用CPU的端口動態選擇,這樣適合多路轉換時應用。13IN7IN0:模擬量輸入通道。 ADDA、ADDB、ADDC:地址線。

10、 ALE:地址鎖存允許信號。 START:轉換啟動信號。 D7D0:數據輸出線。 OE:輸出允許信號。 CLK:時鐘信號。 EOC:轉換結束狀態信號。 Vcc:5V電源。GND:為地。Vref、Vref:參考電壓。 3ADC0809的引腳14 ADC0809的轉換時鐘CLK由單片機的ALE提供。 4ADC0809與51單片機的接口 51單片機通過地址線P2.0和讀、寫控制線RD、WR來控制轉換器的模擬輸入通道地址鎖存ALE、啟動START和輸出允許OE。 模擬輸入通道地址的譯碼輸入ADDAADDC由P0.0P0.2提供。 根據P2.0和P0.0P0.2的連接方法,8模擬輸入通道的地址依IN0I

11、N7順序為0 xFEF80 xFEFF。15ADC0809工作時的時序關系如圖所示。在進行A/D轉換時,通道地址應先送到ADDAADDC輸入端。然后在ALE輸入端加一個正跳變脈沖,將通道地址鎖存到ADC0809內部的地址鎖存器中,這樣對應的模擬電壓輸入就和內部變換電路接通。為了啟動,必須在START端加一個負跳變信號。此后,變換工作就開始進行,標志ADC0809正在工作的狀態信號EOC由高電平(空閑狀態)變為低電平(工作狀態)。一旦變換結束,EOC信號就又由低電平變成高電平,此時只要在OE端加一個高電平,即可打開數據線的三態緩沖器從D0D7數據線讀得一次變換后的數據。 注意:ADC0809的幾

12、根控制腳和其工作時序在應用時非常重要,一定要掌握,否則不能正確應用ADC0809來實現A/D轉換。16 1任務要求 用AT89C51和ADC0809設計一只簡單的數字電壓表,可以測量0+5V的電壓,并將測得的電壓數值顯示在4位共陰極的數碼管上,要求測量精度為0.01V,即保留兩位小數。10.1.3 數字電壓表的設計17 2任務分析 要實現本任務的要求,ADC0809是作為讀取模擬電壓值的A/D轉換芯片,在其輸入通道IN3上接入被測電壓就可以了。由于ADC0809的供電電壓是+5V,所以其輸入通道只能輸入0+5V的電壓,正好與任務要求符合,我們可以用一只簡單的可調電阻,其一端接+5V,一端接地,

13、中間的可調腳接入ADC0809的IN3,只要滑動電阻的可調腳,IN3上就能輸出不同的電壓值,通過ADC0809A/D轉換成數字量后送入AT89C51的P3口,AT89C51再將接收到的電壓值的數字量還原為模擬量顯示在數碼管上。 由于0+5V的模擬電壓值轉換為8位數字量0000000011111111(0255),一個數字量單位的電壓值是5V/255,將數字量還原為模擬量時只要將P3口讀取的數值乘以5V/255就可以了。我們可以用T0的定時中斷為ADC0809提供CLK信號。183任務設計(1)器件的選擇 根據任務的要求和分析,采用AT89C51作為CPU,ADC0809作為A/D轉換芯片,一只

14、可調電阻用來獲取不同的電壓,一只4位的共陰極數碼管顯示電壓,包括AT89C51工作的外圍電路,設計所用器件清單如表所列。19(2)硬件原理圖設計20(3)軟件程序設計 源程序如下:/*/宏定義#include#define uchar unsigned char#define uint unsigned int/*/數碼管碼表uchar code LEDData = 0 x3F, 0 x06, 0 x5B, 0 x4F, 0 x66, 0 x6D, 0 x7D, 0 x07, 0 x7F, 0 x6F;/ADC0809控制腳定義sbit OE=P10;sbit EOC=P11;sbit ST=

15、P12;sbit CLK=P13;/*/延時1ms子程序void DelayMS(uint x) uchar i; while(x-) for(i=0; i120; i+);/*21/顯示轉換結果子程序void Display(uchar d) float a; uint b; a = d*5/255; /計算出電壓模擬量值 b = a*100+0.5 ; /保留兩位小數,四舍五入 P2=0 xF7; /數碼管第4位顯示個位數 P0= LEDData b%10; DelayMS(5); P0=0 x00; P2=0 xFB; /數碼管第3位顯示十位數 P0= LEDData b%100/10;

16、 DelayMS(5); P0=0 x00; P2=0 xFD; /數碼管第2位顯示百位數和小數點 P0= LEDData b/100|0 x80; /把小數點加入段碼 DelayMS(5); P0=0 x00;22/主程序void main( ) TMOD=0 x02; /定時器0工作在方式2 TH0=0 x14; TL0=0 x14; IE=0 x82; /開T0中斷 TR0=1; P1=0 x3F; /選擇ADC0809的通道3(011) /高4位設通道地址為011(3),低4位為ST,EOC,OE等 while(1) ST=0; ST=1; ST=0; /啟動轉換 while(EOC=

17、0); /等待轉換結束 OE=1; /允許輸出 Display(P3); /顯示A/D轉換結果 OE=0; /關閉輸出 /T0中斷子程序void Timer0_INT( ) interrupt 1 CLK=!CLK; /ADC0809時鐘信號23 (4)軟硬件聯合調試 將編寫的程序在Keil C51中編譯成*.hex后調入Proteus硬件電路圖的AT89C51中運行,就能實現簡單的數字電壓表功能。運行后,滑動RV1的可調腳,數碼管會顯示不同的電壓值,測量范圍為0+5V,精確度為0.01V。注意:在運用ADC0809與51單片機配合完成A/D轉換時要注意單片機對ADC0809的控制信號的控制過

18、程。24任務10.2 數字溫度采集系統的設計 DS18B20是美國DALLAS(達拉斯)公司生產的一款單總線(1Wire)數字溫度計,具有硬件線路簡單、體積超小、功耗低、抗干擾能力強、精度高、附加功能強、易配微處理器等特點,可直接將溫度轉化成串行數字信號供處理器處理。 DS18B20將溫度傳感器、A/D轉換器等集于一身,從環境中采集了模擬的溫度,輸出數字溫度信號。 DS18B20具有唯一的序列號,在一根通信線上,可以掛很多這樣的數字溫度計,十分方便。10.2.1 DS18B20的工作原理25DS18B20的主要特性全數字溫度轉換及輸出 先進的單總線數據通信 可編程分辨率912可選,精度可達土0

19、.5C12位分辨率時的最大工作周期為750ms電壓適應范圍寬,+3.3V+5.5V,可選擇數據線寄生電源工作方式檢測溫度范圍為55C +125C內置EEPROM,限溫報警功能 64位光刻ROM,內置產品序列號,方便多機掛接 多樣封裝形式,適應不同硬件系統26DS18B20 引腳介紹兩種封裝形式:DS18B20的引腳定義:TO-92直插式八腳SO或SOP貼片式序號名稱功能1GND電源地2DQ為數據(數字信號)輸入輸出引腳。開漏單總線接口引腳。當被用著在寄生電源下,也可以向器件提供電源3VDD為外接供電電源輸入端(在寄生電源接線方式時此引腳必須接地)272. DS18B20 內部結構 DS18B2

20、0主要由64位光刻ROM、高速緩存RAM(Scratchpad)、溫度傳感器、非易失性溫度報警觸發器TH和TL及配置寄存器 (EEPROM)等組成 。28(1)64位光刻ROM出廠前被光刻好。低8位為產品類型號:單線系列編碼(DS18B20為19H)中間48位為產品唯一的序列號高8位是前面56位的CRC循環冗余校驗碼光刻ROM的作用:使每一個DS18B20各不相同,這樣可以實現一個總線上掛接多個DS18B20。8位檢驗CRC48位序列號8位工廠代碼(10H)MSB LSB29(2)DS10B20內部存儲器包含一個9字節高速緩存RAM和一個3字節非易失性的電可擦除EEPROM。 DS18B20有

21、9個字節的RAM,每個字節是8位。第2、3、4字節的上電狀態依賴于EEPROM的值測得的溫度值存儲溫度報警值設置溫度分辨率鏡像30DS18B20的配置寄存器(byte 4)通過設置配置寄存器的R0、R1來確定精度。注:精度和轉換時間有直接關系。31(3)DS18B20溫度數據值格式DS18B20接收到溫度轉換命令后,啟動溫度轉換,并將轉換后的溫度值以16位帶符號二進制補碼形式存儲在高速緩存存儲器的每1、2字節,單片機可通過單線接口讀到該數據,讀取時低位在前,高位在后。 32出廠默認配置為12位,高5位為符號位,單片機讀取數據時,一次會讀取2字節,讀完后將低11位的二進制數轉化為十進制數后再乘以

22、0.0625才得到實際溫度值。當前5位為1時,讀取的溫度為負值,測得數據值需取反加1再乘以0.0625才得到實際溫度值。注:(1)溫度以補碼形式存放;(2)9位分辨率時,得到的十進制數乘以0.5;10位分辨率乘0.25;11位分辨率乘0.125DS18B20溫度值格式33溫度/數據關系表注意:從DS18B20讀取的數字信號轉換成溫度值是我們應用DS18B20的關鍵。DS18B20完成溫度轉換后,就把測得的溫度值與TH、TL做比較,若TTH或TTL,則將該器件內的告警標志置位,并對主機發出的告警搜索命令做出響應。343.DS18B20的指令1)控制DS18B20的指令(對ROM操作)33H讀RO

23、M 讀DS18B20溫度傳感器ROM中的編碼55H匹配ROM 發出此命令后,接著發出64位ROM編碼,訪問單總線上與該編碼相對應DS18B20并使之做出響應,為下一步對該DS18B20的讀/寫做準備。CCH跳過ROM。 忽略64位ROM地址,直接向18B20發送溫度變換命令。適用于一個DS18B20的情況。DS18B20工作時,控制其工作的CPU(單片機)可以使用各種命令對DS18B20進行操作,操作過程為:初始化、發功能命令、發存儲器操作命令。35F0H搜索ROM 用于確定掛接在同一總線上DS18B20的個數,識別64位ROM地址,為操作各器件做好準備。ECH告警搜索命令 執行此命令后,只有

24、溫度超過設定值上限或下限的芯片才做出響應。注:只有一個DS18B20時,不需讀取ROM編碼和匹配ROM編碼,只要用跳過ROM(CCH)的指令就行了。362)溫度轉換和讀取指令(對RAM操作)指 令 約定代碼 操 作 說 明 寫暫存器 4EH 將數據寫入暫存器的TH、TL字節,可以在任何時刻發出復位命令來中止寫入。 讀暫存器 BEH 讀取暫存器的內容。讀取將從第一個字節開始,一直進行下去,直到第九(CRC)字節讀完。 復制暫存器48H 把暫存器的TH、TL字節寫到EEPROM中。溫度轉換44H 啟動DS18B20進行溫度轉換。重新調出B8H 把報警觸發器里的值拷貝回暫存器。這種拷貝操作在DS18

25、B20上電時自動執行,這樣器件一上電暫存器里馬上就存在有效的數據了。 讀電源供電方式 B4H 啟動DS18B20發送電源供電方式的信號給主CPU 。37 4. DS18B20的工作時序 作為單總線器件,DS18B20與單片機間采用串行數據傳輸方式,要求嚴格按照時隙進行操作。主機使用時間隙來讀寫DS18B20的數據位和寫命令字的位。38(1)初始化DS18B20 單片機發出復位脈沖,DS18B20以存在脈沖響應。當DS18B20發出存在脈沖對復位脈沖響應時,表明該器件已在總線上并作好操作準備。初始化時序圖主機總線發送一復位脈沖(最短為480s的低電平信號),接著釋放總線并進入接收狀態。DS18B

26、20在檢測到總線的上升沿之后等待1560s,接著DS18B20發出存在脈沖(低電平持續60240s),主機接收到高電平后初始化成功。39(2)寫DS18B20 當主機總線從高拉至低電平時就產生寫時間隙。從開始15s之內應將所需寫的位送到總線上,DS18B20在1560s間對總線采樣,若為低電平,則寫入的位是0;若為高電平,則寫入的位是1。連續寫2位間的間隙應大于1s。每一位的發送都應該有一個至少15s的低電平起始位,隨后的數據“0”或“1”應該在45s內完成。整個位的發送時間應該保持在60120s,否則不能保證通信的正常。 DS18B20有兩種類型的寫時序:寫0時序和寫1時序,如圖。40(3)

27、讀DS18B20 當單片機發出讀時序時,DS18B20可發送數據到單片機。讀時間隙時控制的采樣時間應該更加的精確才行,所有讀時序必須持續60s以上,每個時序之間必須有至少1s的恢復時間。 注:必須在讀間隙開始的15s內讀取數據位才可以保證通信的正確。主機在將總線從高電平拉至低電平時,至少在1s后將總線拉高,表示讀時間隙的起始,隨后在總線被釋放后的15s中DS18B20會發送內部數據位,這時控制如果發現總線為高電平表示讀出“1”,如果總線為低電平則表示讀出數據“0”,主機必須在45s內完成讀位,并在60120s內釋放總線。41注意:主機(單片機)對于DS18B20的操作都必須嚴格按照其初始化、讀

28、時間隙和寫時間隙來完成,否則不能正常通信。在通信時是以8位“0”或“1”為一個字節,字節的讀或寫是從低位開始的,即D0到D7。425. DS18B20與單片機的連接 通常用單片機來控制DS18B20,它們的連接非常簡單,如圖,只要用單片機的1根I/O口線連接到DS18B20的DQ腳上就可以了,但是需要1只電阻上拉。 圖中的DS18B20采用的是外部供電,將VDD腳接外部電源(+5V)。單總線上可以同時掛接其它的單總線器件。4310.2.2 數字溫度采集系統的設計1任務要求 設計一個數字溫度采集系統,用AT89C51來控制DS18B20采集環境溫度,用一只共陰極的4位數碼管顯示采集的溫度,要求顯

29、示的溫度精確到0.1,也就是保留一位小數位。442任務分析 根據任務要求,采用AT89C51單片機來控制DS18B20,任意用一個端口線與DS18B20的DQ連接,這里我們用P3.0口,對DS18B20寫數據和讀數據都從P3.0口串行讀寫。單片機的外接晶體采用實際中常用的22.1184MHz,這樣1個機器周期是0.54s左右,在控制DS18B20的初始化、讀數據和寫數據時注意時間隙的長短。 按照前面介紹的DS18B20的操作命令,AT89C51從P2.7口將相應的命令字寫給DS18B20,在按照初始化的過程對DS18B20進行初始化之后,AT89C51將溫度數據從P3.0口讀入,每次順序將8位

30、組合成1字節,溫度數據的高8位和低8位都讀出后組合成16位的溫度數據,按照12位分辨率,將數據乘以0.0625,就得到實際的溫度值。將溫度值四舍五入保留一位小數后,按位送到數碼管顯示。453任務設計(1)器件的選擇根據任務的要求和分析,采用AT89C51作為CPU,DS18B20作為溫度采集芯片,一只4位的共陰極數碼管顯示溫度,包括AT89C51工作的外圍電路,設計所用器件清單如表所列 。器件名稱數量(只)AT89C51122.1184MHz晶體122pF瓷片電容210uF電解電容110k電阻14.7k電阻11kX8排阻14位共陰極數碼管1DS18B20146(2)硬件原理圖設計47(2)軟件

31、程序設計開始初始化DS18B20跳過ROM(0 xCC)啟動溫度轉換 (0 x44)讀RAM(0 xBE)獲取溫度并轉換結束 溫度采集系統軟件流程圖48軟件源程序如下:/*/宏定義#include#define uchar unsigned char#define uint unsigned int/*/測溫口定義sbit temp_ds=P30; /定義全局變量uint temp; /存儲整型溫度值float f_temp; /存儲浮點型溫度值/定義共陰極段碼表unsigned char code table=0 x3F,0 x06,0 x5B,0 x4F,0 x66,0 x6D,0 x7D

32、,0 x07,0 x7F,0 x6F;49/ms延時子程序 void delay(uint x) uint y; while(x-) for(y=160;y0;y-);/DS18B20初始化子程序,成功返回1,否則返回0int DS18B20_init(void) uint i; temp_ds=0; /發復位脈沖 i=160; while(i0) i-; temp_ds=1; i=8; while(i0)i-;50/從DS18B20讀1位數據bit tempreadbit(void) uint i; bit dat; temp_ds=0; /拉低控制線 i+; temp_ds=1; /拉高控

33、制線 i+; i+; dat=temp_ds; /讀1為數據 i=10; while(i0) i-; temp_ds=1; /拉高控制線 return (dat);51/從DS18B20讀一個字節uchar tempreadbyte(void) uchar i,j,dat; dat=0; for(i=1;i=8;i+) /讀到的8位組成1字節 j=tempreadbit(); dat=(j1); return(dat);52/向DS18B20寫一位數據void tempwritebit(bit instruc_data) int time; if(instruc_data) temp_ds=0

34、; /拉低控制線 time=3; while(time0) time-; temp_ds=1; /拉高控制線 time=8; while(time0) time-; else temp_ds=0; /拉低控制線 time=14; while(time0) time-; time-; temp_ds=1; /拉高控制線 time+ ; time+; 53/向DS18B20寫一個字節數據 void tempwritebyte(uchar instru) int i; for(i=1;i1; 54/讀取寄存器中存儲的溫度數據uint get_temp() uchar temp_L,temp_H; D

35、S18B20_init(); delay(1); tempwritebyte(0 xcc); / 寫跳過ROM指令 tempwritebyte(0 xbe); /寫入讀暫存器指令 temp_L=tempreadbyte(); /讀溫度低8位 temp_H=tempreadbyte(); /讀溫度高8位 temp=temp_H8|temp_L; /獲取溫度數據 f_temp=temp*0.0625; /12位溫度數據,分辨率為0.0625; temp=f_temp*10+0.5; /乘10是小數點后保留一位,加0.5是減小誤差 return temp; 55/顯示子程序void dis_temp

36、(uint t) uint i; i=t/100; /將百位顯示在數碼管第2位 P0=tablei; P2=0 xFD; delay(5); P0=0 x00; /消隱 i=t%100/10; /將十位和小數點顯示在數碼管第3位 P0=tablei|0 x80; P2=0 xFB; delay(5); P0=0 x00; /消隱 i=t%10; /將個位顯示在數碼管第4位 P0=tablei; P2=0 xF7; delay(5); P0=0 x00; /消隱56/主函數void main() DS18B20_init();while(1) DS18B20_init(); delay(1);

37、tempwritebyte(0 xcc); / 寫跳過ROM指令 tempwritebyte(0 x44); / 啟動轉換 dis_temp(get_temp(); / 調用顯示子函數 57(4)軟硬件聯合調試 把編寫好的溫度采集系統軟件在Keil C51中編譯成*.hex文件調入Proteus繪制的電路中,仿真運行電路,看到數碼管顯示的溫度與DS18B20上調節的溫度一致,如圖所示。調節DS18B20的兩個“-”、“+”按鈕改變溫度,數碼管上的溫度值會隨之變化。注意:在溫度采集系統中,單片機與DS18B20的硬件連接非常簡單,但是控制器工作的軟件相對復雜,尤其要嚴格遵循DS18B20的工作時

38、序。58項目拓展 串行A/D轉換芯片PCF8591在實驗板上的應用在項目拓展9中我們用實驗板上的PCF8591設計了信號發生器,那時采用的是PCF8591的D/A轉換功能。其實PCF8591是一只帶有1路D/A轉換和4路A/D轉換的綜合數模/模數轉換芯片。在這個項目拓展中我們運用它的A/D轉換功能。附錄B中“數模/模數轉換”電路為實驗板上的PCF8591的連接圖,如下圖。雖然有AIN0AIN3 4路模擬輸入,但只有W3和W4兩只可調電阻來改變模擬電壓值的輸入,所以每次只能有2路工作,由J31和J32來選擇。59我們用實驗板的PCF8591來實現1路A/D轉換,將J31的跳線連接2、3,W4調節

39、的電壓值(0+5V)從AIN0輸入,有PCF8591A/D轉換后數字信號從I2C總線輸出傳送給STC89C52的P2.0、P2.1腳,由STC89C52控制的共陰極數碼管顯示轉換的數值(0255)。實驗板的連接方法如下:用杜邦線將J23的P2.0與J8的SCL相連,J23的P2.1與J8的SDA相連,J23的P0與J3相連,J23的P2.2與J2的B相連(段鎖存),J23的P2.3與J2的A相連(位鎖存),J31用跳線連接2、3選擇AIN0輸入。用跳帽將J50連接給數碼管電路供電,如附錄B中“8位共陰極數碼管”電路所示。這樣硬件電路就連接好了。60PCF8591進行A/D轉換并將轉換的數值顯示

40、在數碼管上的程序 如下:主函數main():/宏定義#include #include i2c.h#include delay.h#include display.h#define AddWr 0 x90 /寫數據地址 #define AddRd 0 x91 /讀數據地址extern bit ack;unsigned char ReadADC(unsigned char Chl);bit WriteDAC(unsigned char dat);61/PCF8591 AD轉換主函數main() unsigned char num=0; Init_Timer0(); while (1) /主循環

41、num=ReadADC(0); TempData0=dofly_DuanManum/100; TempData1=dofly_DuanMa(num%100)/10; TempData2=dofly_DuanMa(num%100)%10; /主循環中添加其他需要一直工作的程序 DelayMs(100); 62/ 讀AD轉值程序,輸入參數 Chl 表示需要轉換的通道,范圍從0-3,返回值范圍0-255unsigned char ReadADC(unsigned char Chl) unsigned char Val; Start_I2c(); /啟動總線 SendByte(AddWr); /發送器

42、件地址 if(ack=0) return(0); SendByte(0 x40|Chl); /發送器件子地址 if(ack=0) return(0); Start_I2c(); SendByte(AddWr+1); if(ack=0) return(0); Val=RcvByte(); NoAck_I2c(); /發送非應位 Stop_I2c(); /結束總線 return(Val); 63延時子函數:#include delay.h/*/ uS延時函數void DelayUs2x(unsigned char t) while(-t);/*/ mS延時函數void DelayMs(unsign

43、ed char t) while(t-) DelayUs2x(245); DelayUs2x(245); /大致延時1mS 64數碼管顯示子函數:#includedisplay.h#includedelay.h#define DataPort P0 /定義數據端口 程序中遇到DataPort 則用P0 替換sbit LATCH1=P20; /定義鎖存使能端口 段鎖存sbit LATCH2=P23; /位鎖存unsigned char code dofly_DuanMa10=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f;/

44、 顯示段碼值09unsigned char code dofly_WeiMa=0 xfe,0 xfd,0 xfb,0 xf7, 0 xef, 0 xdf, 0 xbf,0 x7f;/分別對應相應的數碼管點亮,即位碼unsigned char TempData8; /存儲顯示值的全局變量65/顯示函數,用于動態掃描數碼管。 輸入參數 FirstBit 表示需要顯示的第一位,如賦值/2表示從第三個數碼管開始顯示,如輸入0表示從第一個顯示。/Num表示需要顯示的位數,如需要顯示99兩位數值則該值輸入2void Display(unsigned char FirstBit,unsigned char

45、Num) static unsigned char i=0; DataPort=0; /清空數據,防止有交替重影 LATCH1=1; /段鎖存 LATCH1=0; DataPort=dofly_WeiMai+FirstBit; /取位碼 LATCH2=1; /位鎖存 LATCH2=0; DataPort=TempDatai; /取顯示數據,段碼 LATCH1=1; /段鎖存 LATCH1=0; i+; if(i=Num) i=0;66/定時器初始化子程序void Init_Timer0(void) TMOD = 0 x01; /使用模式1,16位定時器, TH0=0 x00; /給定初值 TL

46、0=0 x00; EA=1; /總中斷打開 ET0=1; /定時器中斷打開 TR0=1; /定時器開關打開/*/ 定時器中斷子程序void Timer0_isr(void) interrupt 1 TH0=(65536-2000)/256; /重新賦值 2ms TL0=(65536-2000)%256; Display(0,8);67I2C子函數:#include i2c.h#include delay.h#define _Nop() _nop_() /定義空指令bit ack; /應答標志位sbit SDA=P21;sbit SCL=P20;/啟動總線void Start_I2c() SDA

47、=1; /發送起始條件的數據信號 _Nop(); SCL=1; _Nop(); /起始條件建立時間大于4.7us,延時 _Nop(); _Nop(); _Nop(); _Nop(); SDA=0; /發送起始信號 _Nop(); /起始條件鎖定時間大于4 _Nop(); _Nop(); _Nop(); _Nop(); SCL=0; /鉗住I2C總線,準備發送或接收數據 _Nop(); _Nop();68/ 結束總線void Stop_I2c() SDA=0; /發送結束條件的數據信號 _Nop(); /發送結束條件的時鐘信號 SCL=1; /結束條件建立時間大于4 _Nop(); _Nop()

48、; _Nop(); _Nop(); _Nop(); SDA=1; /發送I2C總線結束信號 _Nop(); _Nop(); _Nop(); _Nop();69/* 字節數據傳送函數 ,函數原型: void SendByte(unsigned char c);功能: 將數據c發送出去,可以是地址,也可以是數據,發完后等待應答,并對此狀態位進行操作.(不應答或非應答都使ack=0 假)發送數據正常,ack=1; ack=0表示被控器無應答或損壞。 */ void SendByte(unsigned char c) unsigned char BitCnt; for(BitCnt=0;BitCnt8

49、;BitCnt+) /要傳送的數據長度為8位 if(cBitCnt)&0 x80)SDA=1; /判斷發送位 else SDA=0; _Nop(); SCL=1; /置時鐘線為高,通知被控器開始接收數據位 _Nop(); _Nop(); /保證時鐘高電平周期大于4 _Nop(); _Nop(); _Nop(); SCL=0; _Nop(); _Nop(); SDA=1; /8位發送完后釋放數據線,準備接收應答位 _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); _Nop(); if(SDA=1)ack=0; else ack=1; /判斷是否接收到應答信號 SCL=0; _Nop(); _Nop();70/* 字節數據傳送函數 ,函數原型: u

溫馨提示

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

評論

0/150

提交評論