1.單總線通信初始化
初始化時序包括:主機發出的複位脈沖和從機發出的應答脈沖。主機通過拉低單總線480-960μs産生複位脈沖;然後由主機釋放總線,并進入接收模式。主機釋放總線時,會産生一由低電平跳變為高電平的上升沿,單總線器件檢測到該上升沿後,延時15~60μs,接着單總線器件通過拉低總線60~240μsμ來産生應答脈沖。主機接收到從機的以應答脈沖後,說明有單總線器件線上,到此初始化完成。然後主機就可以開始對從機進行ROM指令和功能指令操作。
void Init_DS18B20(void)
{
DQ = ; //DQ拉低
Delay480us(); //延時480~960us
DQ = ; //DQ拉高
Delay60us(); //延時15~60us
if(DQ == )//器件應答正确 //如果DQ等于0,則從機應答正确
{
Delay240us(); //延時240us
DQ = ; //DQ拉高
}
}
2.寫時序:
當主機把資料線從邏輯高電平拉到邏輯低電平的時候,寫時間隙開始。有兩種寫時間隙:寫1的時間隙和寫0時間隙。所有寫時間隙必須最少持續60us,包括兩個寫周期間至少1us的恢複時間。DQ引腳上的電平變低後,DS18B20在一個15us到60us的時間視窗内對DQ引腳采樣。如果DQ引腳是高電平,就是寫1,如果DQ引腳是低電平,就是寫0。主機要生成一個寫1時間隙,必須把資料線拉到低電平然後釋放,在寫時間隙開始後的15us内允許資料線拉到高電平。主機要生成一個寫0時間隙,必須把資料線拉到低電平并保持60us。
/******************************************************************/
/* 寫一個位元組 先寫低位 */
/******************************************************************/
void WriteOneByte(unsigned char dat)
{
unsigned char i;
for(i = ; i < ; i++)
{
DQ = ; //DQ先拉低
_nop_(); //在15us以内寫對應值,從機進行采樣
if(dat & ) //如果是寫1則DQ變為1
{
DQ = ;
}
else
{
DQ = ; //否則DQ為0
}
Delay60us(); //延時60us
DQ = ; //釋放總線
dat >>= ; //寫下一位資料
}
}
3.讀時序:
當主機把總線從高電平拉低,并保持至少1us後釋放總線;并在15us内讀取從DS18B20輸出的資料。
/******************************************************************/
/* 讀一個位元組 , 低位開始 */
/******************************************************************/
unsigned char ReadOneByte(void)
{
unsigned char i;
unsigned char value = ;
for(i = ; i < ; i++)
{
value >>= ;
DQ = ;
_nop_();
DQ = ;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
if(DQ)
{
value |= ;
}
Delay60us();
}
return value;
}
4.溫度處理過程
1.初始化
2.0XCC
3.0X44
4.延時一段時間
5.初始化
6.0XCC
7.0XBE
8.讀取溫度寄存器低位元組和高位元組值
9.數值處理
/******************************************************************/
/* 讀取溫度 */
/******************************************************************/
unsigned int ReadTemperature(void)
{
unsigned int a, b, t;
Init_DS18B20();
WriteOneByte(0xcc);
WriteOneByte(0x44);
delay_ms(200);
Init_DS18B20();
WriteOneByte(0xcc);
WriteOneByte(0xbe);
a = ReadOneByte(); //低位元組
b = ReadOneByte(); //高位元組
b = b << 8;
t = a + b;
return t;
}