国产成人精品三级麻豆,色综合天天综合高清网,亚洲精品夜夜夜,国产成人综合在线女婷五月99播放,色婷婷色综合激情国产日韩

當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > DS18B20時(shí)序分析

DS18B20時(shí)序分析 時(shí)間:2018-09-25      來(lái)源:未知

1、過(guò)程1、2是初始化過(guò)程,每次讀取都要初始化,否則18b20處于待機(jī)狀態(tài),無(wú)法成功讀取。過(guò)程1:拉低信號(hào)線480-700us,使它復(fù)位,然后釋放總線15-60us,18b20會(huì)拉低總線60-240us,然后它釋放總線。所以初始化成功的一個(gè)標(biāo)志就是能否讀到18b20這個(gè)先低后高的操作時(shí)序。

(注意:黑色部分表示主機(jī)操作,藍(lán)色部分表示18b20操作,每次主機(jī)操作完成之后等待18b20狀態(tài)時(shí),必須要釋放總線,比如將IO設(shè)置為高阻態(tài)什么的。否則18B20沒法把狀態(tài)寫到線上)

2、過(guò)程3、4是寫1bit數(shù)據(jù)過(guò)程。過(guò)程3是寫0 ,過(guò)程4是寫1。過(guò)程3:拉低總線60us,然后抬高總線5us,完成。過(guò)程4:拉低總線5us,然后抬高總線60us,完成

3、過(guò)程5、6是讀1bit過(guò)程。過(guò)程5是讀0,過(guò)程6是讀1。過(guò)程5、6:拉低總線5us,然后釋放總線,讀取總線,如果為0,則讀入0,如果為1,則讀入1。

DS18B20時(shí)序

初始化序列——復(fù)位和存在脈沖

DS18B20的所有通信都由由復(fù)位脈沖組成的初始化序列開始。該初始化序列由主機(jī)發(fā)出,后跟由DS18B20發(fā)出的存在脈沖(presence pulse)。下圖(插圖13,即如下截圖)闡述了這一點(diǎn)。當(dāng)發(fā)出應(yīng)答復(fù)位脈沖的存在脈沖后,DS18B20通知主機(jī)它在總線上并且準(zhǔn)備好操作了。

在初始化步驟中,總線上的主機(jī)通過(guò)拉低單總線至少480μs來(lái)產(chǎn)生復(fù)位脈沖。然后總線主機(jī)釋放總線并進(jìn)入接收模式。

當(dāng)總線釋放后,5kΩ的上拉電阻把單總線上的電平拉回高電平。當(dāng)DS18B20檢測(cè)到上升沿后等待15到60us,然后以拉低總線60-240us的方式發(fā)出存在脈沖。

如文檔所述,主機(jī)將總線拉低短480us,之后釋放總線。由于5kΩ上拉電阻的作用,總線恢復(fù)到高電平。DS18B20檢測(cè)到上升沿后等待15到60us,發(fā)出存在脈沖:拉低總線60-240us。至此,初始化和存在時(shí)序完畢。

根據(jù)上述要求編寫的復(fù)位函數(shù)為:

首先是延時(shí)函數(shù):(由于DS18B20延時(shí)均以15us為單位,故編寫了延時(shí)單位為15us的延時(shí)函數(shù),注意:以下延時(shí)函數(shù)晶振為12MHz)

/*

************************************

函數(shù):Delayxus_DS18B20

功能:DS18B20延時(shí)函數(shù)

參數(shù):t為定時(shí)時(shí)間長(zhǎng)度

返回:無(wú)

說(shuō)明: 延時(shí)公式:15n+15(近似),晶振12Mhz

******************************************

*/

void Delayxus_DS18B20(unsigned int t)

{

for(t;t>0;t--)

{

_nop_();_nop_();_nop_();_nop_();

}

_nop_(); _nop_();

}

延時(shí)函數(shù)反匯編代碼(方便分析延時(shí)公式)

C:0x0031 7F01 MOV R7,#0x01

C:0x0033 7E00 MOV R6,#0x00

C:0x0035 1206A6 LCALL delayxus(C:06A6)

38: void Delayxus_DS18B20(unsigned int t)

39: {

40: for(t;t>0;t--)

C:0x06A6 D3 SETB C

C:0x06A7 EF MOV A,R7

C:0x06A8 9400 SUBB A,#0x00

C:0x06AA EE MOV A,R6

C:0x06AB 9400 SUBB A,#0x00

C:0x06AD 400B JC C:06BA

41: {

42: _nop_();_nop_();_nop_();_nop_();

C:0x06AF 00 NOP

C:0x06B0 00 NOP

C:0x06B1 00 NOP

C:0x06B2 00 NOP

43: }

C:0x06B3 EF MOV A,R7

C:0x06B4 1F DEC R7

C:0x06B5 70EF JNZ Delayxus_DS18B20 (C:06A6)

C:0x06B7 1E DEC R6

C:0x06B8 80EC SJMP Delayxus_DS18B20 (C:06A6)

44: _nop_(); _nop_();

C:0x06BA 00 NOP

C:0x06BB 00 NOP

45: }

C:0x06BC 22 RET

分析上述反匯編代碼,可知延時(shí)公式為15*(t+1)

/*

************************************

函數(shù):RST_DS18B20

功能:復(fù)位DS18B20,讀取存在脈沖并返回

參數(shù):無(wú)

返回:1:復(fù)位成功 ;0:復(fù)位失敗

說(shuō)明: 拉低總線至少480us ;可用于檢測(cè)DS18B20工作是否正常

******************************************

*/

bit RST_DS18B20()

{

bit ret="1";

DQ=0;/*拉低總線 */

Delayxus_DS18B20(32);/*為保險(xiǎn)起見,延時(shí)495us */

DQ=1;/*釋放總線 ,DS18B20檢測(cè)到上升沿后會(huì)發(fā)送存在脈沖*/

Delayxus_DS18B20(4);/*需要等待15~60us,這里延時(shí)75us后可以保證接受到的是存在脈沖(如果通信正常的話) */

ret=DQ;

Delayxus_DS18B20(14);/*延時(shí)495us,讓ds18b20釋放總線,避免影響到下一步的操作 */

DQ=1;/*釋放總線 */

return(~ret);

}

寫時(shí)序:

主機(jī)在寫時(shí)隙向DS18B20寫入數(shù)據(jù),并在讀時(shí)隙從DS18B20讀入數(shù)據(jù)。在單總線上每個(gè)時(shí)隙只傳送一位數(shù)據(jù)。

寫時(shí)間隙

有兩種寫時(shí)隙:寫“0”時(shí)間隙和寫“1”時(shí)間隙。總線主機(jī)使用寫“1”時(shí)間隙向DS18B20寫入邏輯1,使用寫“0”時(shí)間隙向DS18B20寫入邏輯0.所有的寫時(shí)隙必須有少60us的持續(xù)時(shí)間,相鄰兩個(gè)寫時(shí)隙必須要有少1us的恢復(fù)時(shí)間。兩種寫時(shí)隙都通過(guò)主機(jī)拉低總線產(chǎn)生(見插圖14)。

為產(chǎn)生寫1時(shí)隙,在拉低總線后主機(jī)必須在15μs內(nèi)釋放總線。在總線被釋放后,由于5kΩ上拉電阻的作用,總線恢復(fù)為高電平。為產(chǎn)生寫0時(shí)隙,在拉低總線后主機(jī)必須繼續(xù)拉低總線以滿足時(shí)隙持續(xù)時(shí)間的要求(至少60μs)。

在主機(jī)產(chǎn)生寫時(shí)隙后,DS18B20會(huì)在其后的15到60us的一個(gè)時(shí)間窗口內(nèi)采樣單總線。在采樣的時(shí)間窗口內(nèi),如果總線為高電平,主機(jī)會(huì)向DS18B20寫入1;如果總線為低電平,主機(jī)會(huì)向DS18B20寫入0。

如文檔所述,所有的寫時(shí)隙必須至少有60us的持續(xù)時(shí)間。相鄰兩個(gè)寫時(shí)隙必須要有少1us的恢復(fù)時(shí)間。所有的寫時(shí)隙(寫0和寫1)都由拉低總線產(chǎn)生。

為產(chǎn)生寫1時(shí)隙,在拉低總線后主機(jī)必須在15us內(nèi)釋放總線(拉低的電平要持續(xù)至少1us)。由于上拉電阻的作用,總線電平恢復(fù)為高電平,直到完成寫時(shí)隙。

為產(chǎn)生寫0時(shí)隙,在拉低總線后主機(jī)持續(xù)拉低總線即可,直到寫時(shí)隙完成后釋放總線(持續(xù)時(shí)間60-120us)。

寫時(shí)隙產(chǎn)生后,DS18B20會(huì)在產(chǎn)生后的15到60us的時(shí)間內(nèi)采樣總線,以此來(lái)確定寫0還是寫1。

滿足上述要求的寫函數(shù)為:

/*

************************************

函數(shù):WR_Bit

功能:向DS18B20寫一位數(shù)據(jù)

參數(shù):i為待寫的位

返回:無(wú)

說(shuō)明: 總線從高拉到低產(chǎn)生寫時(shí)序

******************************************

*/

void WR_Bit(bit i)

{

DQ=0;//產(chǎn)生寫時(shí)序

_nop_();

_nop_();//總線拉低持續(xù)時(shí)間要大于1us

DQ=i;//寫數(shù)據(jù) ,0和1均可

Delayxus_DS18B20(3);//延時(shí)60us,等待ds18b20采樣讀取

DQ=1;//釋放總線

}

/*

***********************************

函數(shù):WR_Byte

功能:DS18B20寫字節(jié)函數(shù),先寫低位

參數(shù):dat為待寫的字節(jié)數(shù)據(jù)

返回:無(wú)

說(shuō)明:無(wú)

******************************************

*/

void WR_Byte(unsigned char dat)

{

unsigned char i="0";

while(i++<8)

{

WR_Bit(dat&0x01);//從低位寫起

dat>>=1; //注意不要寫成dat>>1

}

}

讀時(shí)序:

DS18B20只有在主機(jī)發(fā)出讀時(shí)隙后才會(huì)向主機(jī)發(fā)送數(shù)據(jù)。因此,在發(fā)出讀暫存器命令 [BEh]或讀電源命令[B4h]后,主機(jī)必須立即產(chǎn)生讀時(shí)隙以便DS18B20提供所需數(shù)據(jù)。另外,主機(jī)可在發(fā)出溫度轉(zhuǎn)換命令T [44h]或Recall命令E 2[B8h]后產(chǎn)生讀時(shí)隙,以便了解操作的狀態(tài)(在 DS18B20操作指令這一節(jié)會(huì)詳細(xì)解釋)。

所有的讀時(shí)隙必須至少有60us的持續(xù)時(shí)間。相鄰兩個(gè)讀時(shí)隙必須要有少1us的恢復(fù)時(shí)間。所有的讀時(shí)隙都由拉低總線,持續(xù)至少1us后再釋放總線(由于上拉電阻的作用,總線恢復(fù)為高電平)產(chǎn)生。在主機(jī)產(chǎn)生讀時(shí)隙后,DS18B20開始發(fā)送0或1到總線上。DS18B20讓總線保持高電平的方式發(fā)送1,以拉低總線的方式表示發(fā)送0.當(dāng)發(fā)送0的時(shí)候,DS18B20在讀時(shí)隙的末期將會(huì)釋放總線,總線將會(huì)被上拉電阻拉回高電平(也是總線空閑的狀態(tài))。DS18B20輸出的數(shù)據(jù)在下降沿(下降沿產(chǎn)生讀時(shí)隙)產(chǎn)生后15us后有效。因此,主機(jī)釋放總線和采樣總線等動(dòng)作要在15μs內(nèi)完成。

插圖15表明了對(duì)于讀時(shí)隙,TINIT(下降沿后低電平持續(xù)時(shí)間), TRC(上升沿)和TSAMPLE(主機(jī)采樣總線)的時(shí)間和要在15μs以內(nèi)。

插圖16顯示了大化系統(tǒng)時(shí)間寬限的方法:讓TINIT 和TRC盡可能的短,把主機(jī)采樣總線放到15μs這一時(shí)間段的尾部。

由文檔可知,DS18B20只有在主機(jī)發(fā)出讀時(shí)隙時(shí)才能發(fā)送數(shù)據(jù)到主機(jī)。因此,主機(jī)必須在BE命令,B4命令后立即產(chǎn)生讀時(shí)隙以使DS18B20提供相應(yīng)的數(shù)據(jù)。另外,在44命令,B8命令后也要產(chǎn)生讀時(shí)隙。

所有的讀時(shí)隙必須至少有60us的持續(xù)時(shí)間。相鄰兩個(gè)讀時(shí)隙必須要有少1us的恢復(fù)時(shí)間。所有的讀時(shí)隙都由拉低總線,持續(xù)至少1us后再釋放總線(由于上拉電阻的作用,總線恢復(fù)為高電平)產(chǎn)生。DS18B20輸出的數(shù)據(jù)在下降沿產(chǎn)生后15us后有效。因此,釋放總線和主機(jī)采樣總線等動(dòng)作要在15us內(nèi)完成。

滿足以上要求的函數(shù)為:

/*

***********************************

函數(shù):Read_Bit

功能:向DS18B20讀一位數(shù)據(jù)

參數(shù):無(wú)

返回:bit i

說(shuō)明: 總線從高拉到低,持續(xù)至1us以上,再釋放總線為高電平空閑狀態(tài)產(chǎn)生讀時(shí)序

******************************************

*/

unsigned char Read_Bit()

{

unsigned char ret;

DQ=0;//拉低總線

_nop_(); _nop_();

DQ=1;//釋放總線

_nop_(); _nop_();

_nop_(); _nop_();

ret=DQ;//讀時(shí)隙產(chǎn)生7 us后讀取總線數(shù)據(jù)。把總線的讀取動(dòng)作放在15us時(shí)間限制的后面是為了保證數(shù)據(jù)讀取的有效性

Delayxus_DS18B20(3);//延時(shí)60us,滿足讀時(shí)隙的時(shí)間長(zhǎng)度要求

DQ=1;//釋放總線

return ret; //返回讀取到的數(shù)據(jù)

}

/*

************************************

函數(shù):Read_Byte

功能:DS18B20讀一個(gè)字節(jié)函數(shù),先讀低位

參數(shù):無(wú)

返回:讀取的一字節(jié)數(shù)據(jù)

說(shuō)明: 無(wú)

******************************************

*/

unsigned char Read_Byte()

{

unsigned char i;

unsigned char dat="0";

for(i=0;i<8;i++)

{

dat>>=1;//先讀低位

if(Read_Bit())

dat|=0x80;

}

return(dat);

}

/*

************************************

函數(shù):Start_DS18B20

功能:?jiǎn)?dòng)溫度轉(zhuǎn)換

參數(shù):無(wú)

返回:無(wú)

說(shuō)明: 復(fù)位后寫44H命令

******************************************

*/

void Start_DS18B20()

{

DQ=1;

RST_DS18B20();

WR_Byte(0xcc);// skip

WR_Byte(0x44);//啟動(dòng)溫度轉(zhuǎn)換

}

/*

************************************

函數(shù):Read_Tem

功能:讀取溫度

參數(shù):無(wú)

返回:int型溫度數(shù)據(jù),高八位為高八位溫度數(shù)據(jù),低八位為低八位溫度數(shù)據(jù)

說(shuō)明: 復(fù)位后寫B(tài)E命令

******************************************

*/

int Read_Tem()

{

int tem="0";

RST_DS18B20();

WR_Byte(0xcc);// skip

WR_Byte(0xbe);//發(fā)出讀取命令

tem=Read_Byte();//讀出溫度低八位

tem|=(((int)Read_Byte())<<8);//讀出溫度高八位

return tem;

}

注: DS18B20官方文檔中沒有說(shuō)明讀寫數(shù)據(jù)位的順序,查了下資料,DS18B20讀寫數(shù)據(jù)都是從低位讀寫的。

上一篇:AS(Android Studio)中使用NDK

下一篇:Android中傳感器的使用

熱點(diǎn)文章推薦
華清學(xué)員就業(yè)榜單
高薪學(xué)員經(jīng)驗(yàn)分享
熱點(diǎn)新聞推薦
前臺(tái)專線:010-82525158 企業(yè)培訓(xùn)洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠(yuǎn)見科技集團(tuán)有限公司 版權(quán)所有 ,京ICP備16055225號(hào)-5京公海網(wǎng)安備11010802025203號(hào)

回到頂部