標題: DS18B20 [打印本頁]
作者: 2019HOU 時間: 2018-3-9 08:27
標題: DS18B20
DS18B20時序詳解
初始化時序:
DS18B20的所有通信都是以由復(fù)位脈沖組成的初始化序列開始的。該初始化序列由主機發(fā)出,后跟由DS18B20發(fā)出的存在脈沖(presence pulse)。下圖闡述了這一點。
file:///C:\Users\houwanyou\AppData\Local\Temp\ksohtml\wps709D.tmp.jpg
DS18B20發(fā)出存在脈沖,以通知主機它在總線上并且準備好操作了。
在初始化時序中,總線上的主機通過拉低單總線至少480μs來發(fā)送復(fù)位脈沖。然后總線主機釋放總線并進入接收模式。總線釋放后,4.7kΩ的上拉電阻把單總線上的電平拉回高電平。當DS18B20檢測到上升沿后等待15到60us,然后以拉低總線60-240us的方式發(fā)出存在脈沖。
如上所述,主機將總線拉低最短480us,之后釋放總線。由4.7kΩ上拉電阻將總線恢復(fù)到高電平。DS18B20檢測到上升沿后等待15到60us,發(fā)出存在脈沖:拉低總線60-240us。至此,初始化和存在時序完畢。
/*延時函數(shù):(由于DS18B20延時均以15us為單位,故編寫了延時單位為15us的延時函數(shù),注意:以下延時函數(shù)晶振為12MHz)*/
/*
************************************
函數(shù):Delayxus_DS18B20
功能:DS18B20延時函數(shù)
參數(shù):t為定時時間長度
返回:無
說明: 延時公式:15n+15(近似),晶振12Mhz
******************************************
*/
void Delayxus_DS18B20(unsigned int t)
{
for(t;t>0;t--)
{
_nop_();_nop_();_nop_();_nop_();
}
_nop_(); _nop_();
}
/*
************************************
函數(shù):RST_DS18B20
功能:復(fù)位DS18B20,讀取存在脈沖并返回
參數(shù):無
返回:1:復(fù)位成功 ;0:復(fù)位失敗
說明: 拉低總線至少480us ;可用于檢測DS18B20工作是否正常
******************************************
*/
bit RST_DS18B20()
{
bit ret="1";
DQ=0;/*拉低總線 */
Delayxus_DS18B20(32);/*為保險起見,延時495us */
DQ=1;/*釋放總線 ,DS18B20檢測到上升沿后會發(fā)送存在脈沖*/
Delayxus_DS18B20(4);/*需要等待15~60us,這里延時75us后可以保證接受到的是存在脈沖 */
ret=DQ;
Delayxus_DS18B20(14);/*延時495us,讓ds18b20釋放總線,避免影響到下一 步的操作 */
DQ=1;/*釋放總線 */
return(~ret);
}
寫時序:
主機在寫時隙向DS18B20寫入數(shù)據(jù),在讀時隙從DS18B20讀取數(shù)據(jù)。在單總線上每個時隙只傳送一位數(shù)據(jù)。
有兩種寫時隙:寫“0”時間隙和寫“1”時間隙。總線主機使用寫“1”時間隙向DS18B20寫入邏輯1,使用寫“0”時間隙向DS18B20寫入邏輯0.所有的寫時隙必須有最少60us的持續(xù)時間,相鄰兩個寫時隙必須要有最少1us的恢復(fù)時間。兩種寫時隙都通過主機拉低總線產(chǎn)生(見下圖)。
file:///C:\Users\houwanyou\AppData\Local\Temp\ksohtml\wps709E.tmp.jpg
為了產(chǎn)生寫1時隙,在拉低總線后主機必須在15μs內(nèi)釋放總線。在總線被釋放后,由于4.7kΩ上拉電阻將總線恢復(fù)為高電平。為了產(chǎn)生寫0時隙,在拉低總線后主機必須繼續(xù)拉低總線以滿足時隙持續(xù)時間的要求(至少60μs)。
在主機產(chǎn)生寫時隙后,DS18B20會在其后的15到60us的一個時間窗口內(nèi)采樣單總線。在采樣的時間窗口內(nèi),如果總線為高電平,主機會向DS18B20寫入1;如果總線為低電平,主機會向DS18B20寫入0。
如上所述,所有的寫時隙必須至少有60us的持續(xù)時間。相鄰兩個寫時隙必須要有最少1us的恢復(fù)時間。所有的寫時隙(寫0和寫1)都由拉低總線產(chǎn)生。
寫函數(shù)為:
/*
************************************
函數(shù):WR_Bit
功能:向DS18B20寫一位數(shù)據(jù)
參數(shù):i為待寫的位
返回:無
說明: 總線從高拉到低產(chǎn)生寫時序
******************************************
*/
void WR_Bit(bit i)
{
DQ=0;//產(chǎn)生寫時序
_nop_();
_nop_();//總線拉低持續(xù)時間要大于1us
DQ=i;//寫數(shù)據(jù) ,0和1均可
Delayxus_DS18B20(3);//延時60us,等待ds18b20采樣讀取
DQ=1;//釋放總線
}
/*
/*
***********************************
函數(shù):WR_Byte
功能:DS18B20寫字節(jié)函數(shù),先寫最低位
參數(shù):dat為待寫的字節(jié)數(shù)據(jù)
返回:無
說明:無
******************************************
*/
void WR_Byte(unsigned char dat)
{
unsigned char i="0";
while(i++<8)
{
WR_Bit(dat&0x01);//從最低位寫起
dat>>=1; //注意不要寫成dat>>1
}
}
讀時序:
DS18B20只有在主機發(fā)出讀時隙后才會向主機發(fā)送數(shù)據(jù)。因此,在發(fā)出讀暫存器命令 [BEh]或讀電源命令[B4h]后,主機必須立即產(chǎn)生讀時隙以便DS18B20提供所需數(shù)據(jù)。另外,主機
| 歡迎光臨 (http://m.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |