在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

您好,歡迎來電子發燒友網! ,新用戶?[免費注冊]

您的位置:電子發燒友網>電子元器件>傳感器>

DS18B20的調試總結和程序 - 全文

2018年01月05日 08:57 網絡整理 作者: 用戶評論(0
關鍵字:DS18B20(80969)

DS18B20簡介

DS18B20是常用的數字溫度傳感器,具有體積小,硬件開銷低,抗干擾能力強,精度高的特點。 DS18B20數字溫度傳感器接線方便,封裝成后可應用于多種場合,如管道式,螺紋式,磁鐵吸附式,不銹鋼封裝式,型號多種多樣,有LTM8877,LTM8874等等。

主要根據應用場合的不同而改變其外觀。封裝后的DS18B20可用于電纜溝測溫,高爐水循環測溫,鍋爐測溫,機房測溫,農業大棚測溫,潔凈室測溫,彈藥庫測溫等各種非極限溫度場合。耐磨耐碰,體積小,使用方便,封裝形式多樣,適用于各種狹小空間設備數字測溫和控制領域。

單個18B20實現溫度測試步驟

該文檔所用程序為FREESCALE JM60單片機,總線時鐘為8M,若要移植到其它MCU上,需要將時間重新調節,或者更改總線時鐘頻率的輸出;

DS18B20的調試總結和程序

電路圖

DS18B20的調試總結和程序

DS18B20工作協議:初始化,存儲器操作命令,處理數據;

DS18B20的調試總結和程序

在關于時序的編寫中,for循環中的NOP指令,和單獨調用的NOP指令所用時間完全不同;NOP占用1/總線時

鐘的時間;如JM60的總線時鐘為8M,則NOP指令一定占用0.125US,而將NOP放在FOR循環中,由于FOR的判斷指令,加法指令,以及轉子程序等等消耗的時間很長,遠遠大于一個NOP的指令,此時,若要獲得執行代碼的精確時間,最好用示波器觀察,再得出最直接的結果;

在單片機的使用中,不要用浮點數,全部用整數代替,在數據進行移位作乘法時,一定要注意數據有沒有越界,算出來的數很容易出現錯誤,并且在出現浮點數時,可以將數據放大到一定的精度,然后在顯示時,將小數點移到對應的位置即可;

在數據做乘法容易越界時,一般將其賦給一個字節多的整數,作為中間變量運算,在確保數據不會越界后,再將其賦給最后結果;

初始化時序

DS18B20的調試總結和程序

初始化時序步驟:

1. 主機將端口設為輸出,先發送一個高電平,然后再拉低,維持480-960US;(推薦500-600US)

2. 主機將端口設為輸入,上拉電阻此時將電平拉高,主機等待60US-200US;(推薦100-150US)

3. 主機讀取端口數據,低電平則初始化成功;高電平表示初始化失敗;

4.讀取數據完畢后,主機等待至少400US; (推薦450-500US)

注:

l 第四步很重要,讀取初始化狀態后,仍然延時400US才可以初始化完畢,否則傳感器不能正常使用;

l 在這里注意端口需要不停地改變方向;在主機發送時,設為輸出,主機接收時,設為輸出;

/*****************18B20的初始化程序***************************/

byte INIT_18B20() {

byte DQ_RETURN=2;

DQ_OUT=1; //引腳設置為輸出

DQ=1;

DELAY1(); //稍微延時,即可

DQ=0; //將電平拉低至少480uS,最大為960US

DELAY9(70);

DQ_OUT=0;

//設置為輸入,設為輸入15到60US

DELAY9(6); //等待18B20響應,如果為低電平表示初始化成功,維持60到240 //微秒

DQ_RETURN=DQ;

DELAY9(70); //讀完數據后,仍然延時,至少480US

return(DQ_RETURN); //返回值為1,表示失敗,返回值為0表示成功

}

端口寫數據時序

DS18B20的調試總結和程序

1. 主機將電平拉高,稍微延時(推薦值:2US),然后拉低電平,產生一個下降沿,表示寫數據開始;低電平維持至少1US;(此時推薦2US)

2. 此時,將要寫的1或0放在數據線上;(從寫數據第一步開始到現在,整個過程在15US之內完成;

3. 然后主機延時等待至少50US;(推薦60US)

4. 主機最后將電平拉高;

5. 每寫兩位數據之間的間隔要大于1US;

注:

l 在寫步驟中,整個過程端口方向均為輸出;

這里對時序要求高,最好用示波器調整出精確的時序;

/*****************向18B20寫數據********************************/

void WRITE_18B20(unsigned char ch){

byte i;

for(i=0;i《8;i++) {

DQ_OUT=1; //端口設為輸出,并給個拉低電平的下降沿

DQ=1;

DELAY1();

DQ=0; //拉低電平,并維持一微秒以上,表示要發送數據

DELAY1();

DELAY1();

//在15US內將要寫的電平寫在線上

if((ch&0x01)==1) //將數據按位取出,從LSB到MSB依次送出

DQ=1;

else

DQ=0;

ch=ch》》1;

DELAY9(8); //電平維持40US以上,18B20將在此時將數取出

DQ=1;

}

DQ=1; //最后將電平重新拉高

}

讀數據時序

DS18B20的調試總結和程序

1. 主機將電平拉高,稍微延時(推薦2US),然后將電平拉低,產生一個下降沿,表示讀數據;這個低電平至少維持1US,此處推薦2US;

2. 將端口方向設為輸入,必須在下降沿之后的15US內將端口數據讀??;此處推薦端口方向設為輸入后,延時5US,讀取端口數據;

3. 讀取數據完畢后,延時60US即可;

4. 每兩個數據位之間間隔大于1US;

注:

在這個時序內,要不斷改變端口方向;

如果上拉電阻阻值合理設置,可以小于4.7K歐姆,利于提高時序速度; l

讀數據和寫數據都是8位,從LSB開始發送;

/***************從18B20取出字符*******************************/

byte READ_18B20(){

byte ch=0;

byte i;

for(i=0;i《8;i++){

DQ_OUT=1; //端口輸出

DQ=1;

DELAY1(); //產生下降沿,至少維持一微秒

DQ=0;

DELAY1(); //將端口設為輸入,等待讀取

DQ_OUT=0; //在15US之內讀取數據

ch=ch》》1;

//延時大概5US

DELAY5();

if(DQ)

ch=ch|0x80;

else

ch=ch&0x7f;

DELAY9(8);

//每兩個讀數據之間間隔要大于60US }

return(ch); //返回讀到的數據

}

以上三段為底層基本函數;DELAY后面的數字DELAY1,DELAY5,DELAY9為延時的微秒時長; DQ設置為硬件連接的端口,DQ_OUT為端口方向的設置

然后就是調用函數了:

當數據線上還有一個18B20時,通常步驟如下:

初始化;

跳過ROM;

溫度開始轉換命令;

等待溫度轉換完成;//當使用18B20默認的12位轉換精度,用時750MS,經檢驗,一般耗時比理論稍長;

初始化;

跳過ROM;

讀暫存器命令;

將溫度數據低八位,高八位依次取出;

初始化;//注:最后仍然要進行初始化

結束;

對應的函數如下

/********************溫度開始轉換命令程序*******************************/

byte TEMP_DETECT_18B20(){

byte dummy=2;

dummy=INIT_18B20(); //初始化

if(dummy==0){

WRITE_18B20(0XCC); //跳過ROM,不讀地址,直接通訊

WRITE_18B20(0x44); //溫度開始轉換命令

}

return(dummy); //返回0表示成功初始化,開始轉換溫度

}

注:在開始轉換命令和讀取溫度之間,若18B20忙于轉換溫度,電平為低電位;

轉換完畢將電平拉高;若不想用DELAY等待溫度轉換,可讀取DQ值,為1則表示轉換完畢,可以開始讀取數據了;

/****************讀取溫度命令程序***************************************/

uint TEMP_READ_18B20(){

byte dummy=0;

byte TEMH=0,TEML=0;

uint TEM_RESULT;

dummy=INIT_18B20(); //初始化

if(dummy==0){

WRITE_18B20(0XCC); //跳過ROM

WRITE_18B20(0xBE); //讀暫存存儲器的值命令

TEML=READ_18B20();

TEMH=READ_18B20(); //讀溫度的高8位和低八位

dummy=INIT_18B20(); //最后初始化,表示讀取溫度結束

}

TEM_RESULT=(TEML》》3)+(TEMH《《5); //分辨率為0.5°

TEM_RESULT=TEM_RESULT*5;

if((TEMH&0X80)!=0)

//最高位為1,則為負溫度 ;;

// TEM_RESULT=~TEMP_RESULT+1; //溫度為負,取補碼

return(TEM_RESULT); //返回值為溫度的十倍,小數點后一位

}

主函數中調用:

SIGNAL=TEMP_DETECT_18B20();

if(SIGNAL==0){

if(DQ) //此時端口為1,則表示轉換完成

TEMP_RESULT=TEMP_READ_18B20(); //返回溫度的十倍值

若時序錯誤,很有可能讀出的數據位0XFF;若溫度傳感器燒壞,容易讀到85°; l

使用默認12位轉換精度,分辨率為0.0625°,此處不需要這么高的精度因此:

TEM_RESULT=(TEML》》3)+(TEMH《《5); //分辨率為0.5°

舍棄后面三位數據,并且只有11位是溫度值,高八位中的前五位是符號位;

讀取為1時溫度為負;讀取為0時,溫度為正;

DS18B20的調試總結和程序

上一頁123全文

非常好我支持^.^

(87) 93.5%

不好我反對

(6) 6.5%

( 發表人:李倩 )

      發表評論

      用戶評論
      評價:好評中評差評

      發表評論,獲取積分! 請遵守相關規定!

      ?
      主站蜘蛛池模板: 日本黄色免费片 | 你懂在线| 午夜亚洲视频 | 国产香蕉久久精品综合网 | 亚洲一区日本 | 午夜影院免费 | 国产午夜精品理论片免费观看 | 国产精品资源在线观看 | 在线你懂的 | 亚洲国产香蕉视频欧美 | 日本福利片午夜免费观着 | 久久国产精品无码网站 | 曰本福利写真片视频在线 | 久久亚洲一级毛片 | 欧美精品一区二区三区视频 | 成年人视频黄色 | 好硬好湿好爽再深一点h视频 | 国产午夜免费视频 | 97蜜桃| 午夜男人天堂 | 美女被网站免费看九色视频 | 亚洲一区二区三区在线 | 午夜精品免费 | 午夜tv| 日本在线不卡免 | 毛片啪啪| 国产精品美女一级在线观看 | 天堂网免费 | 加勒比一木道|视频在线看 加勒比在线免费视频 | 在线免费观看一级片 | 免费被视频网站在线观看 | 久久人人做人人玩人精品 | 午夜一级毛片不卡 | 萝l在线精品社区资源 | 国产卡1卡2卡三卡网站免费 | 免费观看老外特级毛片 | 午夜传媒| xxxx性xxxx| 成人羞羞视频国产 | 亚洲第七页 | 亚洲一区二区精品视频 |