單片機中使用DS18B20溫度傳感器C語言程序_第1頁
單片機中使用DS18B20溫度傳感器C語言程序_第2頁
單片機中使用DS18B20溫度傳感器C語言程序_第3頁
單片機中使用DS18B20溫度傳感器C語言程序_第4頁
單片機中使用DS18B20溫度傳感器C語言程序_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、單片機中使用DS18B20溫度傳感器C語言程序(參考1),*DS18B20測溫程序硬件:AT89S52(1)單線ds18b20接P2.2(2)七段數(shù)碼管接P0口(3)使用外部電源給ds18b20供電,沒有使用寄生電源軟件:KeiuVision3*/#include"reg52.h"#include"intrins.h"#defineucharunsignedchar#defineuintunsignedintsbitds=P2A2;sbitdula=P2A6;sbitwela=P2A7;ucharflag;uinttemp;/參數(shù)temp一定要聲明為in

2、t型ucharcodetable=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;/不帶小數(shù)點數(shù)字編碼ucharcodetable1=0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef;/帶小數(shù)點數(shù)字編碼/*延時函數(shù)*/voidTempDelay(ucharus)while(us-);voiddelay(uintcount)/延時子函數(shù)uinti;while(count)i=200;while(i>0)i-;count-;/*串口

3、初始化,波特率9600,方式1*/voidinit_com()TMOD=0x20;/設(shè)置定時器1為模式2TH1=0xfd;/裝初值設(shè)定波特率TL1=0xfd;TR1=1;/啟動定時器SM0=0;/串口通信模式設(shè)置SM1=1;/REN=1;/串口允許接收數(shù)據(jù)PCON=0;/波特率不倍頻/SMOD=0;/波特率不倍頻/EA=1;/開總中斷/ES=1;/開串行中斷/*數(shù)碼管的顯示*/voiddisplay(uinttemp)ucharbai,shi,ge;bai=temp/100;shi=temp%100/10;ge=temp%100%10;dula=0;P0=tablebai;/顯示百位dula=

4、1;/從0到1,有個上升沿,解除鎖存,顯示相應(yīng)段dula=0;/從1到0再次鎖存wela=0;P0=0xfe;wela=1;wela=0;delay(1);/延時約2msP0=table1shi;/顯示十位dula=1;dula=0;P0=0xfd;wela=1;wela=0;delay(1);P0=tablege;/顯示個位dula=1;dula=0;P0=0xfb;wela=1;wela=0;delay(1);/*時序:初始化時序、讀時序、寫時序。所有時序都是將主機(單片機)作為主設(shè)備,單總線器件作為從設(shè)備。而每一次命令和數(shù)據(jù)的傳輸都是從主機主動啟動寫時序開始,如果要求單總線器件回送數(shù)據(jù),

5、在進行寫命令后,主機需啟動讀時序完成數(shù)據(jù)接收。數(shù)據(jù)和命令的傳輸都是低位在先。初始化時序:復(fù)位脈沖存在脈沖讀;1或0時序?qū)懀?或0時序只有存在脈沖信號是從18b20(從機)發(fā)出的,其它信號都是由主機發(fā)出的。存在脈沖:讓主機(總線)知道從機(18b20)已經(jīng)做好了準備。*/*初始化:檢測總線控制器發(fā)出的復(fù)位脈沖和ds18b20的任何通訊都要從初始化開始初始化序列包括一個由總線控制器發(fā)出的復(fù)位脈沖和跟在其后由從機發(fā)出的存在脈沖。初始化:復(fù)位脈沖+存在脈沖具體操作:總線控制器發(fā)出(TX)一個復(fù)位脈沖(一個最少保持480ds的低電平信號),然后釋放總線,進入接收狀態(tài)RX)。單線總線由5K上拉電阻拉到高電

6、平。探測到I/O引腳上的上升沿后DS1820等待1560仆然后發(fā)出存在脈沖(一個60240科由勺低電平信號)。具體看18b20單線復(fù)位脈沖時序和1-wirepresencedetect"的時序圖*/voidds_reset(void)ds=1;_nop_();/1usds=0;TempDelay(80);當總線停留在低電平超過480us,總線上所以器件都將被復(fù)位,這里延/時約530us總線停留在低電平超過480科§總線上的所有器件都將被復(fù)位。_nop_();ds=1;/產(chǎn)生復(fù)位脈沖后,微處理器釋放總線,讓總線處于空閑狀態(tài),原因查18b20中文資料TempDelay(5);/

7、釋放總線后,以便從機18b20通過拉低總線來指示其是否在線,/存在檢測高電平時間:1560us,所以延時44us,進行1-wirepresencedetec(t單線存在檢測)_nop_();_nop_();_nop_();if(ds=0)flag=1;/detect18b20successelseflag=0;/detect18b20failTempDelay(20);存在檢測低電平時間:60240us,所以延時約140us_nop_();_nop_();ds=1;/再次拉高總線,讓總線處于空閑狀態(tài)/*/原理解釋:控制器對18B20操作流程:1 ,復(fù)位:首先我們必須對DS18B20芯片進行復(fù)位

8、,復(fù)位就是由控制器(單片機)給DS18B20單總線至少480uS的低電平信號。當18B20接到此復(fù)位信號后則會在1560uS后回發(fā)一個芯片的存在脈沖??刂破鲬?yīng)該將數(shù)據(jù)單總線拉高 , 以便于 在60240uS 的低電平信號。至此,通信雙方已18B20 間的數(shù)據(jù)通信 。2 ,存在脈沖:在復(fù)位電平結(jié)束之后1560uS后接收存在脈沖,存在脈沖為一個經(jīng)達成了基本的協(xié)議,接下來將會是控制器與/*讀/寫時間隙:DS1820的數(shù)據(jù)讀寫是通過時間隙處理位和命令字來確認信息交換。*/bitds_read_bit(void)/讀一位bitdat;ds=0;/單片機(微處理器)將總線拉低_nop_();/讀時隙起始于

9、微處理器將總線拉低至少1usds=1;/拉低總線后接著釋放總線,讓從機18b20能夠接管總線,輸出有效數(shù)據(jù)_nop_();_nop_();小延時一下,讀取18b20上的數(shù)據(jù),因為從ds18b20上輸出的數(shù)據(jù)/在讀"時間隙"下降沿出現(xiàn)15us內(nèi)有效dat=ds;/主機讀從機18b20輸出的數(shù)據(jù),這些數(shù)據(jù)在讀時隙的下降沿出現(xiàn)/15us內(nèi)有效TempDelay(10);所有讀"時間隙"必須60120us,這里77usreturn(dat);/返回有效數(shù)據(jù)原理:圖8讀時間隙時控制時的采樣時間應(yīng)該更加的精確才行,讀時間隙時也是必須先由主機產(chǎn)生至少1uS的低電平,表

10、示讀時間的起始。隨后在總線被釋放后的15uS中DS18B20會發(fā)送內(nèi)部數(shù)據(jù)位,這時控制如果發(fā)現(xiàn)總線為高電平表示讀出“1”,如果總線為低電平則表示讀出數(shù)據(jù)“0”。每一位的讀取之前都由控制器加一個起始信號。注意:如圖8所示,必須在讀間隙開始的15uS內(nèi)讀取數(shù)據(jù)位才可以保證通信的正確。在通信時是以8位“0”或“1”為一個字節(jié),字節(jié)的讀或?qū)懯菑母呶婚_始的,即A7到A0.字節(jié)的讀寫順序也是如圖2自上而下的。uchards_read_byte(void)/讀一字節(jié)ucharvalue,i,j;value=0;/一定別忘了給初值for(i=0;i<8;i+)j=ds_read_bit();value=

11、(j<<7)|(value>>1);/這一步的說明在一個word文檔里面?return(value);/返回一個字節(jié)的數(shù)據(jù)voidds_write_byte(uchardat)/寫一個字節(jié)uchari;bitonebit;/一定不要忘了,onebit是一位for(i=1;i<=8;i+)onebit=dat&0x01;dat=dat>>1;/由低到高傳送數(shù)據(jù)if(onebit)/寫1ds=0;_nop_();_nop_();看時序圖,至少延時1us,才產(chǎn)生寫"時間隙”ds=1;寫時間隙開始后的15科s內(nèi)允許數(shù)據(jù)線拉到高電平TempDe

12、lay(5);/所有寫時間隙必須最少持續(xù)60uselse/寫0ds=0;TempDelay(8);/主機要生成一個寫0時間隙,必須把數(shù)據(jù)線拉到低電平并保持至少60科§這里64usds=1;_nop_();_nop_();I*主機(單片機)控制18B20完成溫度轉(zhuǎn)換要經(jīng)過三個步驟:每一次讀寫之前都要18B20進行復(fù)位操作,復(fù)位成功后發(fā)送一條ROM指令,最后發(fā)送RAM指令,這樣才能對DS18b20進行預(yù)定的操作。復(fù)位要求主CPU將數(shù)據(jù)線下拉500US,然后釋放,當ds18B20受到信號后等待1660us,后發(fā)出60240us的存在低脈沖,主CPU收到此信號表示復(fù)位成功*/*進行溫度轉(zhuǎn)換:

13、先初始化然后跳過ROM:跳過64位ROM地址,直接向ds18B20發(fā)溫度轉(zhuǎn)換命令,適合單片工作發(fā)送溫度轉(zhuǎn)換命令*/voidtem_change()ds_reset();delay(1);/約2msds_write_byte(0xcc);/單線情況下,跳躍ROM指令ds_write_byte(0x44);/溫度轉(zhuǎn)換指令/*獲得溫度:*/uintget_temperature()floatwendu;uchara,b;ds_reset();delay(1);/約2msds_write_byte(0xcc);ds_write_byte(0xbe);/發(fā)送讀溫度命令a=ds_read_byte();讀出溫度低8位b=ds_read_byte();/讀書溫度高8位temp=b;temp<<=8;temp=temp|a;wendu=temp*0.0625;/得到真實十進制溫度值,因為DS18B20/0.0625 度/可以精確到0.0625度,所以讀回數(shù)據(jù)的最低位代表的是temp=wendu*10+0.5;/放大十倍,這樣做的目的將小數(shù)點后第一位/也轉(zhuǎn)換為可顯示數(shù)字,同時進行一個四舍五入操作。returntemp;/*讀ROM*/*vo

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論