




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
電子工業(yè)出版社單片機控制技術(shù)項目式教程
(C語言版)電子工業(yè)出版社項目10數(shù)字溫度采集系統(tǒng)的設(shè)計能了解A/D轉(zhuǎn)換器的相關(guān)技術(shù)指標;能理解ADC0809的工作原理與應用方法;能掌握ADC0809與51單片機的接口方法;能掌握DS18B20的工作原理和應用方法;能掌握數(shù)字溫度采集系統(tǒng)的硬件電路的分析與設(shè)計方法;能熟練編寫數(shù)字溫度采集系統(tǒng)的單片機控制程序。學習目標任務(wù)10.1數(shù)字電壓表的設(shè)計任務(wù)10.2數(shù)字溫度采集系統(tǒng)的設(shè)計項目拓展串行A/D轉(zhuǎn)換芯片PCF8591在實驗板上的應用項目小結(jié)思考與訓練項目10數(shù)字溫度采集系統(tǒng)的設(shè)計任務(wù)10.1數(shù)字電壓表的設(shè)計能夠?qū)⒛M量轉(zhuǎn)換成數(shù)字量的器件稱為模/數(shù)(A/D)轉(zhuǎn)換器。10.1.1A/D轉(zhuǎn)換器的基本原理
1.A/D轉(zhuǎn)換器的主要指標(1)分辨率:A/D轉(zhuǎn)換器能分辨的最小模擬輸入量。也就是指使輸出數(shù)字量變化一個相鄰數(shù)碼所需輸入模擬電壓的變化量。通常用能轉(zhuǎn)換成的數(shù)字量的位數(shù)來表示,如8位、10位、12位、16位等。位數(shù)越高,分辨率越高。(2)轉(zhuǎn)換時間:A/D轉(zhuǎn)換器完成一次轉(zhuǎn)換所需的時間。轉(zhuǎn)換時間是編程時必須考慮的參數(shù)。(3)量程:A/D轉(zhuǎn)換器所能轉(zhuǎn)換的輸入電壓范圍,如5V、10V等。(4)精度:與數(shù)字輸出量所對應的模擬輸入量的實際值與理論值之間的差值。有絕對精度和相對精度兩種表示方法。常用數(shù)字量的位數(shù)作為度量絕對精度的單位,如精度為±1/2LSB,而用百分比來表示滿量程時的相對誤差,如±0.05%。2.A/D轉(zhuǎn)換器的分類按轉(zhuǎn)換原理可分為逐次逼近(比較)式、雙積分式、計數(shù)式和并行式A/D轉(zhuǎn)換器;按其分辨率可分為8~16位的A/D轉(zhuǎn)換器芯片。目前最常用的是逐次逼近式和雙積分式。逐次逼近式A/D轉(zhuǎn)換器是一種速度較快、精度較高的轉(zhuǎn)換器,其轉(zhuǎn)換時間在幾微秒到幾百微秒之間。常用產(chǎn)品有ADC0801~ADC0805型8位MOS型A/D轉(zhuǎn)換器、ADC0808/0809型8位MOS型A/D轉(zhuǎn)換器、ADC0816/0817型8位MOS型A/D轉(zhuǎn)換器、AD574型快速12位A/D轉(zhuǎn)換器。雙積分式A/D轉(zhuǎn)換器的優(yōu)點是轉(zhuǎn)換精度高,抗干擾性能好,價格便宜,但轉(zhuǎn)換速度較慢。因此這種轉(zhuǎn)換器主要用于速度要求不高的場合。常用產(chǎn)品有ICL7106/ICL7107/ICL7126、MC14433/5G14433、ICL7135等。ADC開始轉(zhuǎn)換時,必須加一個啟動轉(zhuǎn)換信號,這一啟動信號要由單片機提供。不同型號的ADC,對于啟動轉(zhuǎn)換信號的要求也不同,一般分為脈沖啟動和電平啟動兩種。對于脈沖啟動型ADC,只要給其啟動控制端上加一個符合要求的脈沖信號即可,如ADC0809、AD574等。通常用WR和地址譯碼器的輸出經(jīng)一定的邏輯電路進行控制。對于電平啟動型ADC,當把符合要求的電平加到啟動控制端上時,立即開始轉(zhuǎn)換,在轉(zhuǎn)換過程中,必須保持這一電平,否則會終止轉(zhuǎn)換的進行。因此,在這種啟動方式下,單片機的控制信號必須經(jīng)過鎖存器保持一段時間,一般采用D觸發(fā)器、鎖存器或并行I/O接口等來實現(xiàn)。AD570、AD571等都屬于電平啟動型ADC。當ADC轉(zhuǎn)換結(jié)束時,ADC輸出一個轉(zhuǎn)換結(jié)束標志信號,通知單片機讀取轉(zhuǎn)換結(jié)果。單片機檢查判斷A/D轉(zhuǎn)換結(jié)束的方法一般有中斷和查詢兩種。對于中斷方式,可將轉(zhuǎn)換結(jié)束標志信號接到單片機的中斷請求輸入線上或允許中斷的I/O接口的相應引腳,作為中斷請求信號;對于查詢方式,可把轉(zhuǎn)換結(jié)束標志信號經(jīng)三態(tài)門送到單片機的某一位I/O口線上,作為查詢狀態(tài)信號。A/D轉(zhuǎn)換器的另一個重要連接信號是時鐘,其頻率是決定芯片轉(zhuǎn)換速度的基準。整個A/D轉(zhuǎn)換過程都是在時鐘的作用下完成的。A/D轉(zhuǎn)換時鐘的提供方法有兩種:一種是由芯片內(nèi)部提供(如AD574),一般不需外加電路;另一種是由外部提供,有的用單獨的振蕩電路產(chǎn)生,更多的則是把單片機輸出時鐘經(jīng)分頻后,送到A/D轉(zhuǎn)換器的相應時鐘端。1.ADC0809的性能ADC0809采用+5V電源供電。轉(zhuǎn)換時間:取決于芯片的工作時鐘。ADC0809為外接時鐘,轉(zhuǎn)換一次的時間為64個時鐘周期,當工作時鐘為500KHz時,轉(zhuǎn)換時間為128μs,最大允許值為800KHz。8位CMOS逐次逼近型的A/D轉(zhuǎn)換器。三態(tài)鎖定輸出。分辨率:8位??傉`差:±1LSB。模擬輸入電壓范圍:單極性0~+5V。10.1.2ADC0809芯片的介紹ADC0809有8個模擬量輸入通道IN0~IN7,在某一時刻,模擬開關(guān)只能與一路模擬量通道接通,對該通道進行A/D轉(zhuǎn)換。8路模擬開關(guān)與輸入通道的關(guān)系如表所示。ADDC、ADDB、ADDA是三條通道的地址線。當?shù)刂锋i存信號ALE為高電平時,ADDC、ADDB、ADDA三條線上的數(shù)據(jù)送入ADC0809內(nèi)部的地址鎖存器中,經(jīng)過譯碼器譯碼后選中某一通道。當ALE=0時,地址鎖存器處于鎖存狀態(tài),模擬開關(guān)始終與剛才選中的輸入通道接通。ADC0809是分時處理8路模擬量輸入信號的。注意:ADC0809通道的選擇比較靈活,根據(jù)應用的需要,可以固定選擇,也可以用CPU的端口動態(tài)選擇,這樣適合多路轉(zhuǎn)換時應用。IN7~IN0:模擬量輸入通道。ADDA、ADDB、ADDC:地址線。ALE:地址鎖存允許信號。
START:轉(zhuǎn)換啟動信號。D7~D0:數(shù)據(jù)輸出線。OE:輸出允許信號。CLK:時鐘信號。EOC:轉(zhuǎn)換結(jié)束狀態(tài)信號。Vcc:+5V電源。GND:為地。Vref+、Vref-:參考電壓。3.ADC0809的引腳ADC0809的轉(zhuǎn)換時鐘CLK由單片機的ALE提供。4.ADC0809與51單片機的接口51單片機通過地址線P2.0和讀、寫控制線RD、WR來控制轉(zhuǎn)換器的模擬輸入通道地址鎖存ALE、啟動START和輸出允許OE。模擬輸入通道地址的譯碼輸入ADDA~ADDC由P0.0~P0.2提供。根據(jù)P2.0和P0.0~P0.2的連接方法,8模擬輸入通道的地址依IN0~IN7順序為0xFEF8~0xFEFF。1.任務(wù)要求用AT89C51和ADC0809設(shè)計一只簡單的數(shù)字電壓表,可以測量0~+5V的電壓,并將測得的電壓數(shù)值顯示在4位共陰極的數(shù)碼管上,要求測量精度為0.01V,即保留兩位小數(shù)。10.1.3數(shù)字電壓表的設(shè)計2.任務(wù)分析要實現(xiàn)本任務(wù)的要求,ADC0809是作為讀取模擬電壓值的A/D轉(zhuǎn)換芯片,在其輸入通道IN3上接入被測電壓就可以了。由于ADC0809的供電電壓是+5V,所以其輸入通道只能輸入0~+5V的電壓,正好與任務(wù)要求符合,我們可以用一只簡單的可調(diào)電阻,其一端接+5V,一端接地,中間的可調(diào)腳接入ADC0809的IN3,只要滑動電阻的可調(diào)腳,IN3上就能輸出不同的電壓值,通過ADC0809A/D轉(zhuǎn)換成數(shù)字量后送入AT89C51的P3口,AT89C51再將接收到的電壓值的數(shù)字量還原為模擬量顯示在數(shù)碼管上。由于0~+5V的模擬電壓值轉(zhuǎn)換為8位數(shù)字量00000000~11111111(0~255),一個數(shù)字量單位的電壓值是5V/255,將數(shù)字量還原為模擬量時只要將P3口讀取的數(shù)值乘以5V/255就可以了。我們可以用T0的定時中斷為ADC0809提供CLK信號。3.任務(wù)設(shè)計(1)器件的選擇根據(jù)任務(wù)的要求和分析,采用AT89C51作為CPU,ADC0809作為A/D轉(zhuǎn)換芯片,一只可調(diào)電阻用來獲取不同的電壓,一只4位的共陰極數(shù)碼管顯示電壓,包括AT89C51工作的外圍電路,設(shè)計所用器件清單如表所列。(3)軟件程序設(shè)計
源程序如下://***************************************************************************//宏定義#include<reg51.h>#defineucharunsignedchar#defineuintunsignedint//***************************************************************************//數(shù)碼管碼表ucharcodeLEDData[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//ADC0809控制腳定義sbitOE=P1^0;sbitEOC=P1^1;sbitST=P1^2;sbitCLK=P1^3;//***************************************************************************//延時1ms子程序voidDelayMS(uintx){uchari;while(x--)for(i=0;i<120;i++);}//***************************************************************************//顯示轉(zhuǎn)換結(jié)果子程序voidDisplay(uchard){floata;uintb;a=d*5/255;//計算出電壓模擬量值
b=a*100+0.5;//保留兩位小數(shù),四舍五入P2=0xF7;//數(shù)碼管第4位顯示個位數(shù)
P0=LEDData[b%10];DelayMS(5);P0=0x00;P2=0xFB;//數(shù)碼管第3位顯示十位數(shù)
P0=LEDData[b%100/10];DelayMS(5);P0=0x00;P2=0xFD;//數(shù)碼管第2位顯示百位數(shù)和小數(shù)點
P0=LEDData[b/100]|0x80;//把小數(shù)點加入段碼
DelayMS(5);P0=0x00;}//主程序voidmain(){TMOD=0x02;//定時器0工作在方式2TH0=0x14;TL0=0x14;IE=0x82;//開T0中斷TR0=1;P1=0x3F;//選擇ADC0809的通道3(011)
//高4位設(shè)通道地址為011(3),低4位為ST,EOC,OE等
while(1){ST=0;ST=1;ST=0;//啟動轉(zhuǎn)換
while(EOC==0);//等待轉(zhuǎn)換結(jié)束
OE=1;//允許輸出
Display(P3);//顯示A/D轉(zhuǎn)換結(jié)果
OE=0;//關(guān)閉輸出
}}//T0中斷子程序voidTimer0_INT()interrupt1{CLK=!CLK;//ADC0809時鐘信號}任務(wù)10.2數(shù)字溫度采集系統(tǒng)的設(shè)計DS18B20是美國DALLAS(達拉斯)公司生產(chǎn)的一款單總線(1-Wire)數(shù)字溫度計,具有硬件線路簡單、體積超小、功耗低、抗干擾能力強、精度高、附加功能強、易配微處理器等特點,可直接將溫度轉(zhuǎn)化成串行數(shù)字信號供處理器處理。DS18B20將溫度傳感器、A/D轉(zhuǎn)換器等集于一身,從環(huán)境中采集了模擬的溫度,輸出數(shù)字溫度信號。DS18B20具有唯一的序列號,在一根通信線上,可以掛很多這樣的數(shù)字溫度計,十分方便。10.2.1DS18B20的工作原理DS18B20的主要特性全數(shù)字溫度轉(zhuǎn)換及輸出先進的單總線數(shù)據(jù)通信可編程分辨率9~12可選,精度可達土0.5°C12位分辨率時的最大工作周期為750ms電壓適應范圍寬,+3.3V~+5.5V,可選擇數(shù)據(jù)線寄生電源工作方式檢測溫度范圍為–55°C~+125°C內(nèi)置EEPROM,限溫報警功能64位光刻ROM,內(nèi)置產(chǎn)品序列號,方便多機掛接多樣封裝形式,適應不同硬件系統(tǒng)(1)64位光刻ROM出廠前被光刻好。低8位為產(chǎn)品類型號:單線系列編碼(DS18B20為19H)中間48位為產(chǎn)品唯一的序列號高8位是前面56位的CRC循環(huán)冗余校驗碼光刻ROM的作用:使每一個DS18B20各不相同,這樣可以實現(xiàn)一個總線上掛接多個DS18B20。8位檢驗CRC48位序列號8位工廠代碼(10H)MSBLSB(2)DS10B20內(nèi)部存儲器
包含一個9字節(jié)高速緩存RAM和一個3字節(jié)非易失性的電可擦除EEPROM。
DS18B20有9個字節(jié)的RAM,每個字節(jié)是8位。第2、3、4字節(jié)的上電狀態(tài)依賴于EEPROM的值測得的溫度值存儲溫度報警值設(shè)置溫度分辨率鏡像DS18B20的配置寄存器(byte4)通過設(shè)置配置寄存器的R0、R1來確定精度。注:精度和轉(zhuǎn)換時間有直接關(guān)系。(3)DS18B20溫度數(shù)據(jù)值格式DS18B20接收到溫度轉(zhuǎn)換命令后,啟動溫度轉(zhuǎn)換,并將轉(zhuǎn)換后的溫度值以16位帶符號二進制補碼形式存儲在高速緩存存儲器的每1、2字節(jié),單片機可通過單線接口讀到該數(shù)據(jù),讀取時低位在前,高位在后。出廠默認配置為12位,高5位為符號位,單片機讀取數(shù)據(jù)時,一次會讀取2字節(jié),讀完后將低11位的二進制數(shù)轉(zhuǎn)化為十進制數(shù)后再乘以0.0625才得到實際溫度值。當前5位為1時,讀取的溫度為負值,測得數(shù)據(jù)值需取反加1再乘以0.0625才得到實際溫度值。注:(1)溫度以補碼形式存放;(2)9位分辨率時,得到的十進制數(shù)乘以0.5;10位分辨率乘0.25;11位分辨率乘0.125DS18B20溫度值格式溫度/數(shù)據(jù)關(guān)系表注意:從DS18B20讀取的數(shù)字信號轉(zhuǎn)換成溫度值是我們應用DS18B20的關(guān)鍵。DS18B20完成溫度轉(zhuǎn)換后,就把測得的溫度值與TH、TL做比較,若T>TH或T<TL,則將該器件內(nèi)的告警標志置位,并對主機發(fā)出的告警搜索命令做出響應。3.DS18B20的指令1)控制DS18B20的指令(對ROM操作)①33H-讀ROM
讀DS18B20溫度傳感器ROM中的編碼②55H-匹配ROM
發(fā)出此命令后,接著發(fā)出64位ROM編碼,訪問單總線上與該編碼相對應DS18B20并使之做出響應,為下一步對該DS18B20的讀/寫做準備。③CCH-跳過ROM。
忽略64位ROM地址,直接向18B20發(fā)送溫度變換命令。適用于一個DS18B20的情況。DS18B20工作時,控制其工作的CPU(單片機)可以使用各種命令對DS18B20進行操作,操作過程為:初始化、發(fā)功能命令、發(fā)存儲器操作命令。④F0H-搜索ROM
用于確定掛接在同一總線上DS18B20的個數(shù),識別64位ROM地址,為操作各器件做好準備。⑤ECH-告警搜索命令
執(zhí)行此命令后,只有溫度超過設(shè)定值上限或下限的芯片才做出響應。注:只有一個DS18B20時,不需讀取ROM編碼和匹配ROM編碼,只要用跳過ROM(CCH)的指令就行了。2)溫度轉(zhuǎn)換和讀取指令(對RAM操作)指
令
約定代碼
操
作
說
明
寫暫存器
4EH將數(shù)據(jù)寫入暫存器的TH、TL字節(jié),可以在任何時刻發(fā)出復位命令來中止寫入。
讀暫存器
BEH讀取暫存器的內(nèi)容。讀取將從第一個字節(jié)開始,一直進行下去,直到第九(CRC)字節(jié)讀完。復制暫存器48H把暫存器的TH、TL字節(jié)寫到EEPROM中。溫度轉(zhuǎn)換44H啟動DS18B20進行溫度轉(zhuǎn)換。重新調(diào)出B8H把報警觸發(fā)器里的值拷貝回暫存器。這種拷貝操作在DS18B20上電時自動執(zhí)行,這樣器件一上電暫存器里馬上就存在有效的數(shù)據(jù)了。
讀電源供電方式
B4H啟動DS18B20發(fā)送電源供電方式的信號給主CPU。
4.DS18B20的工作時序
作為單總線器件,DS18B20與單片機間采用串行數(shù)據(jù)傳輸方式,要求嚴格按照時隙進行操作。主機使用時間隙來讀寫DS18B20的數(shù)據(jù)位和寫命令字的位。(1)初始化DS18B20
單片機發(fā)出復位脈沖,DS18B20以存在脈沖響應。當DS18B20發(fā)出存在脈沖對復位脈沖響應時,表明該器件已在總線上并作好操作準備。初始化時序圖主機總線發(fā)送一復位脈沖(最短為480μs的低電平信號),接著釋放總線并進入接收狀態(tài)。DS18B20在檢測到總線的上升沿之后等待15~60μs,接著DS18B20發(fā)出存在脈沖(低電平持續(xù)60~240μs),主機接收到高電平后初始化成功。(2)寫DS18B20
當主機總線從高拉至低電平時就產(chǎn)生寫時間隙。從開始15μs之內(nèi)應將所需寫的位送到總線上,DS18B20在15~60μs間對總線采樣,若為低電平,則寫入的位是0;若為高電平,則寫入的位是1。連續(xù)寫2位間的間隙應大于1μs。每一位的發(fā)送都應該有一個至少15μs的低電平起始位,隨后的數(shù)據(jù)“0”或“1”應該在45μs內(nèi)完成。整個位的發(fā)送時間應該保持在60~120μs,否則不能保證通信的正常。
DS18B20有兩種類型的寫時序:寫0時序和寫1時序,如圖。(3)讀DS18B20
當單片機發(fā)出讀時序時,DS18B20可發(fā)送數(shù)據(jù)到單片機。讀時間隙時控制的采樣時間應該更加的精確才行,所有讀時序必須持續(xù)60μs以上,每個時序之間必須有至少1μs的恢復時間。
注:必須在讀間隙開始的15μs內(nèi)讀取數(shù)據(jù)位才可以保證通信的正確。主機在將總線從高電平拉至低電平時,至少在1μs后將總線拉高,表示讀時間隙的起始,隨后在總線被釋放后的15μs中DS18B20會發(fā)送內(nèi)部數(shù)據(jù)位,這時控制如果發(fā)現(xiàn)總線為高電平表示讀出“1”,如果總線為低電平則表示讀出數(shù)據(jù)“0”,主機必須在45μs內(nèi)完成讀位,并在60~120μs內(nèi)釋放總線。注意:主機(單片機)對于DS18B20的操作都必須嚴格按照其初始化、讀時間隙和寫時間隙來完成,否則不能正常通信。在通信時是以8位“0”或“1”為一個字節(jié),字節(jié)的讀或?qū)懯菑牡臀婚_始的,即D0到D7。5.DS18B20與單片機的連接通常用單片機來控制DS18B20,它們的連接非常簡單,如圖,只要用單片機的1根I/O口線連接到DS18B20的DQ腳上就可以了,但是需要1只電阻上拉。圖中的DS18B20采用的是外部供電,將VDD腳接外部電源(+5V)。單總線上可以同時掛接其它的單總線器件。10.2.2數(shù)字溫度采集系統(tǒng)的設(shè)計1.任務(wù)要求設(shè)計一個數(shù)字溫度采集系統(tǒng),用AT89C51來控制DS18B20采集環(huán)境溫度,用一只共陰極的4位數(shù)碼管顯示采集的溫度,要求顯示的溫度精確到0.1℃,也就是保留一位小數(shù)位。2.任務(wù)分析根據(jù)任務(wù)要求,采用AT89C51單片機來控制DS18B20,任意用一個端口線與DS18B20的DQ連接,這里我們用P3.0口,對DS18B20寫數(shù)據(jù)和讀數(shù)據(jù)都從P3.0口串行讀寫。單片機的外接晶體采用實際中常用的22.1184MHz,這樣1個機器周期是0.54μs左右,在控制DS18B20的初始化、讀數(shù)據(jù)和寫數(shù)據(jù)時注意時間隙的長短。按照前面介紹的DS18B20的操作命令,AT89C51從P2.7口將相應的命令字寫給DS18B20,在按照初始化的過程對DS18B20進行初始化之后,AT89C51將溫度數(shù)據(jù)從P3.0口讀入,每次順序?qū)?位組合成1字節(jié),溫度數(shù)據(jù)的高8位和低8位都讀出后組合成16位的溫度數(shù)據(jù),按照12位分辨率,將數(shù)據(jù)乘以0.0625,就得到實際的溫度值。將溫度值四舍五入保留一位小數(shù)后,按位送到數(shù)碼管顯示。3.任務(wù)設(shè)計(1)器件的選擇根據(jù)任務(wù)的要求和分析,采用AT89C51作為CPU,DS18B20作為溫度采集芯片,一只4位的共陰極數(shù)碼管顯示溫度,包括AT89C51工作的外圍電路,設(shè)計所用器件清單如表所列。器件名稱數(shù)量(只)AT89C51122.1184MHz晶體122pF瓷片電容210uF電解電容110kΩ電阻14.7kΩ電阻11kΩX8排阻14位共陰極數(shù)碼管1DS18B201(2)硬件原理圖設(shè)計(2)軟件程序設(shè)計開始初始化DS18B20跳過ROM(0xCC)啟動溫度轉(zhuǎn)換(0x44)讀RAM(0xBE)獲取溫度并轉(zhuǎn)換結(jié)束
溫度采集系統(tǒng)軟件流程圖軟件源程序如下://***************************************************************************//宏定義#include<reg51.h>#defineucharunsignedchar#defineuintunsignedint//***************************************************************************//測溫口定義sbittemp_ds=P3^0;//定義全局變量uinttemp;//存儲整型溫度值floatf_temp;//存儲浮點型溫度值//定義共陰極段碼表unsignedcharcodetable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//ms延時子程序
voiddelay(uintx){uinty;while(x--) for(y=160;y>0;y--);}//DS18B20初始化子程序,成功返回1,否則返回0intDS18B20_init(void){uinti;temp_ds=0;//發(fā)復位脈沖
i=160;while(i>0)i--;temp_ds=1;i=8;
while(i>0)i--;}//從DS18B20讀1位數(shù)據(jù)bittempreadbit(void){uinti;bitdat;temp_ds=0;//拉低控制線
i++;temp_ds=1;//拉高控制線
i++;i++;dat=temp_ds;//讀1為數(shù)據(jù)
i=10;while(i>0)i--;temp_ds=1;//拉高控制線
return(dat);}//從DS18B20讀一個字節(jié)uchartempreadbyte(void){uchari,j,dat;dat=0;for(i=1;i<=8;i++)//讀到的8位組成1字節(jié)
{j=tempreadbit();dat=(j<<7)|(dat>>1);}return(dat);}//向DS18B20寫一位數(shù)據(jù)voidtempwritebit(bitinstruc_data){inttime;if(instruc_data){temp_ds=0;//拉低控制線
time=3;while(time>0)time--;temp_ds=1;//拉高控制線
time=8;while(time>0)time--;}else{temp_ds=0;//拉低控制線
time=14;while(time>0)time--;time--;}temp_ds=1;//拉高控制線
time++;time++;}//向DS18B20寫一個字節(jié)數(shù)據(jù)
voidtempwritebyte(ucharinstru){inti;for(i=1;i<=8;i++)//將1字節(jié)拆分位8位,1位1位地寫給DS18B20
{tempwritebit(instru&0x01);instru=instru>>1;}}//讀取寄存器中存儲的溫度數(shù)據(jù)uintget_temp(){uchartemp_L,temp_H;
DS18B20_init();delay(1);tempwritebyte(0xcc);//寫跳過ROM指令
tempwritebyte(0xbe);//寫入讀暫存器指令
temp_L=tempreadbyte();//讀溫度低8位
temp_H=tempreadbyte();//讀溫度高8位
temp=temp_H<<8|temp_L;//獲取溫度數(shù)據(jù)
f_temp=temp*0.0625;//12位溫度數(shù)據(jù),分辨率為0.0625;
temp=f_temp*10+0.5;//乘10是小數(shù)點后保留一位,加0.5是減小誤差
returntemp;}//顯示子程序voiddis_temp(uintt){uinti;i=t/100;//將百位顯示在數(shù)碼管第2位
P0=table[i];P2=0xFD;delay(5);P0=0x00;//消隱
i=t%100/10;//將十位和小數(shù)點顯示在數(shù)碼管第3位
P0=table[i]|0x80;P2=0xFB;delay(5);P0=0x00;//消隱
i=t%10;//將個位顯示在數(shù)碼管第4位
P0=table[i];P2=0xF7;delay(5);P0=0x00;//消隱}//主函數(shù)voidmain(){DS18B20_init();while(1){DS18B20_init();delay(1);tempwritebyte(0xcc);//寫跳過ROM指令
tempwritebyte(0x44);//啟動轉(zhuǎn)換
dis_temp(get_temp());//調(diào)用顯示子函數(shù)
}}(4)軟硬件聯(lián)合調(diào)試
把編寫好的溫度采集系統(tǒng)軟件在KeilC51中編譯成*.hex文件調(diào)入Proteus繪制的電路中,仿真運行電路,看到數(shù)碼管顯示的溫度與DS18B20上調(diào)節(jié)的溫度一致,如圖所示。調(diào)節(jié)DS18B20的兩個“-”、“+”按鈕改變溫度,數(shù)碼管上的溫度值會隨之變化。注意:在溫度采集系統(tǒng)中,單片機與DS18B20的硬件連接非常簡單,但是控制器工作的軟件相對復雜,尤其要嚴格遵循DS18B20的工作時序。項目拓展串行A/D轉(zhuǎn)換芯片PCF8591在實驗板上的應用在項目拓展9中我們用實驗板上的PCF8591設(shè)計了信號發(fā)生器,那時采用的是PCF8591的D/A轉(zhuǎn)換功能。其實PCF8591是一只帶有1路D/A轉(zhuǎn)換和4路A/D轉(zhuǎn)換的綜合數(shù)模/模數(shù)轉(zhuǎn)換芯片。在這個項目拓展中我們運用它的A/D轉(zhuǎn)換功能。附錄B中“數(shù)模/模數(shù)轉(zhuǎn)換”電路為實驗板上的PCF8591的連接圖,如下圖。雖然有AIN0~AIN34路模擬輸入,但只有W3和W4兩只可調(diào)電阻來改變模擬電壓值的輸入,所以每次只能有2路工作,由J31和J32來選擇。我們用實驗板的PCF8591來實現(xiàn)1路A/D轉(zhuǎn)換,將J31的跳線連接2、3,W4調(diào)節(jié)的電壓值(0~+5V)從AIN0輸入,有PCF8591A/D轉(zhuǎn)換后數(shù)字信號從I2C總線輸出傳送給STC89C52的P2.0、P2.1腳,由STC89C52控制的共陰極數(shù)碼管顯示轉(zhuǎn)換的數(shù)值(0~255)。實驗板的連接方法如下:用杜邦線將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連接給數(shù)碼管電路供電,如附錄B中“8位共陰極數(shù)碼管”電路所示。這樣硬件電路就連接好了。PCF8591進行A/D轉(zhuǎn)換并將轉(zhuǎn)換的數(shù)值顯示在數(shù)碼管上的程序如下:①主函數(shù)main()://宏定義#include<reg52.h>#include"i2c.h"#include"delay.h"#include"display.h"#defineAddWr0x90//寫數(shù)據(jù)地址#defineAddRd0x91//讀數(shù)據(jù)地址externbitack;unsignedcharReadADC(unsignedcharChl);bitWriteDAC(unsignedchardat);//PCF8591AD轉(zhuǎn)換主函數(shù)main(){unsignedcharnum=0;Init_Timer0();while(1)//主循環(huán)
{num=ReadADC(0);TempData[0]=dofly_DuanMa[num/100];
TempData[1]=dofly_DuanMa[(num%100)/10];TempData[2]=dofly_DuanMa[(num%100)%10];
//主循環(huán)中添加其他需要一直工作的程序DelayMs(100);}}//讀AD轉(zhuǎn)值程序,輸入?yún)?shù)Chl表示需要轉(zhuǎn)換的通道,范圍從0-3,返回值范圍0-255unsignedcharReadADC(unsignedcharChl){unsignedcharVal;Start_I2c();//啟動總線
SendByte(AddWr);//發(fā)送器件地址
if(ack==0)return(0);SendByte(0x40|Chl);//發(fā)送器件子地址
if(ack==0)return(0);Start_I2c();SendByte(AddWr+1);if(ack==0)return(0);Val=RcvByte();NoAck_I2c();//發(fā)送非應位
Stop_I2c();//結(jié)束總線
return(Val);}②延時子函數(shù):#include"delay.h"http://***************************************************************************//uS延時函數(shù)voidDelayUs2x(unsignedchart){while(--t);}//***************************************************************************//mS延時函數(shù)voidDelayMs(unsignedchart){while(t--){DelayUs2x(245); DelayUs2x(245); //大致延時1mS}}③數(shù)碼管顯示子函數(shù):#include"display.h"#include"delay.h"#defineDataPortP0 //定義數(shù)據(jù)端口程序中遇到DataPort則用P0替換sbitLATCH1=P2^0; //定義鎖存使能端口段鎖存sbitLATCH2=P2^3; //位鎖存unsignedcharcodedofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //顯示段碼值0~9unsignedcharcodedofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分別對應相應的數(shù)碼管點亮,即位碼unsignedcharTempData[8]; //存儲顯示值的全局變量//顯示函數(shù),用于動態(tài)掃描數(shù)碼管。輸入?yún)?shù)FirstBit
表示需要顯示的第一位,如賦值//2表示從第三個數(shù)碼管開始顯示,如輸入0表示從第一個顯示。//Num表示需要顯示的位數(shù),如需要顯示99兩位數(shù)值則該值輸入2voidDisplay(unsignedcharFirstBit,unsignedcharNum){staticunsignedchari=0;
DataPort=0;//清空數(shù)據(jù),防止有交替重影
LATCH1=1;//段鎖存
LATCH1=0;
DataPort=dofly_WeiMa[i+FirstBit];//取位碼
LATCH2=1;//位鎖存
LATCH2=0;
DataPort=TempData[i];//取顯示數(shù)據(jù),段碼
LATCH1=1;//段鎖存
LATCH1=0;i++;
if(i==Num)i=0;}//定時器初始化子程序voidInit_Timer0(void){TMOD=0x01; //使用模式1,16位定時器,
TH0=0x00; //給定初值
TL0=0x00;EA=1;//總中斷打開
ET0=1;//定時器中斷打開
TR0=1;//定時器開關(guān)打開}//***************************************************************************//
定時器中斷子程序voidTimer0_isr(void)interrupt1{TH0=(65536-2000)/256; //重新賦值2msTL0=(65536-2000)%256;Display(0,8);}④I2C子函數(shù):#include"i2c.h"#include"delay.h"#define_Nop()_nop_()//定義空指令bitack; //應答標志位sbitSDA=P2^1;sbitSCL=P2^0;//啟動總線voidStart_I2c(){SDA=1;//發(fā)送起始條件的數(shù)據(jù)信號
_Nop();SCL=1;_Nop();//起始條件建立時間大于4.7us,延時
_Nop();_Nop();_Nop();_Nop();SDA=0;//發(fā)送起始信號
_Nop();//起始條件鎖定時間大于4μ_Nop();_Nop();_Nop();_Nop();SCL=0;//鉗住I2C總線,準備發(fā)送或接收數(shù)據(jù)
_Nop();_Nop();}//
結(jié)束總線voidStop_I2c(){SDA=0;//發(fā)送結(jié)束條件的數(shù)據(jù)信號
_Nop();//發(fā)送結(jié)束條件的時鐘信號
SCL=1;//結(jié)束條件建立時間大于4μ_Nop();_Nop();_Nop();_Nop();_Nop();SDA=1;//發(fā)送I2C總線結(jié)束信號
_Nop();_Nop();_Nop();_Nop();}/*字節(jié)數(shù)據(jù)傳送函數(shù),函數(shù)原型:voidSendByte(unsignedcharc);功能:將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應答,并對此狀態(tài)位進行操作.(不應答或非應答都使ack=0假)發(fā)送數(shù)據(jù)正常,ack=1;ack=0表示被控器無應答或損壞。*/
voidSendByte(unsignedcharc){unsignedcharBitCnt;for(BitCnt=0;BitCnt<8;BitCnt++)//要傳送的數(shù)據(jù)長度為8位
{if((c<<BitCnt)&0x80)SDA=1;//判斷發(fā)送位
elseSDA=0;_Nop();SCL=1;//置時鐘線為高,通知被控器開始接收數(shù)據(jù)位
_Nop();_Nop();//保證時鐘高電平周期大于4μ_Nop();_Nop();_Nop();SCL=0;}_Nop();_Nop();SDA=1;//8位發(fā)送完后釋放數(shù)據(jù)線,準備接收應答位
_Nop();_Nop();SCL=1;_Nop();_Nop();_Nop();if(SDA==1)ack=0;elseack=1;//判斷是否接收到應答信號
SCL=0;_Nop();_Nop();}/*字節(jié)數(shù)據(jù)傳送函數(shù),函數(shù)原型:unsignedcharRcvByte();功能:用來接收從器件傳來的數(shù)據(jù),并判斷總線錯誤(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度產(chǎn)業(yè)園區(qū)招商引資合作計劃書
- 江西省港口集團有限公司20242025年度社會招聘【30人】筆試參考題庫附帶答案詳解
- 理財知識培訓課件
- 2025湖南高速工程咨詢有限公司招聘專業(yè)技術(shù)人員22人筆試參考題庫附帶答案詳解
- 2025河南中聯(lián)重科開封工業(yè)園招聘280人筆試參考題庫附帶答案詳解
- 教師禮儀知到智慧樹章節(jié)測試課后答案2024年秋瓊臺師范學院
- 2025年甘肅敦煌文旅集團有限公司招聘67人筆試參考題庫附帶答案詳解
- 2025年安徽省能源集團有限公司西北分公司招聘7人筆試參考題庫附帶答案詳解
- 第7課+古代的商業(yè)貿(mào)易+高中歷史統(tǒng)編版(2019)選擇性必修二
- 2025四川九洲建筑工程有限責任公司招聘工程管理崗(物資)等崗位11人筆試參考題庫附帶答案詳解
- 氣管鏡科室講課ppt課件(PPT 69頁)
- 小學生心理健康講座-(精)
- 蝴蝶豌豆花(課堂PPT)
- 無創(chuàng)呼吸機的應用(飛利浦偉康V60)課件
- 口腔修復學-第七章-牙列缺失的全口義齒修復
- Y-Y2系列電機繞組標準數(shù)據(jù)匯總
- 對于二氧化碳傳感器的現(xiàn)狀及發(fā)展趨勢的淺分析
- 麥語言函數(shù)手冊參考模板
- 知情同意書-北京大學腫瘤醫(yī)院
- 建筑材料碳排放因子查詢表
- 觀音神課三十二卦
評論
0/150
提交評論