版权声明: https://blog.csdn.net/JRK_CSDN/article/details/87915196
One - Wire协议
DS18B20 使用OneWire协议,时序要求严格,不可被打断。
第一步:初始化
主机(Master)发出(Tx)最低480μs
,最高960μs
的低
电平信号。期间DS18B20主动拉高总线,共15 - 60μs
。然后DS18B20发出“存在脉冲
”,即将总线拉低
总线 60 - 240μs
。主机接收(Rx)这样的脉冲即可认为DS18B20初始化成功。接收过程不低于480μs
。
bit OneWire_Online() // 1 online 0 offline
{
bit Ack;
EA = 0;
OneWire_Port = 0;
OneWire_Delay(480);
OneWire_Port = 1;
OneWire_Delay(15);
Ack = OneWire_Port;
while(!OneWire_Port);
EA = 1;
return ~Ack;
}
第二步:写字节
主机发出低
电平1 - 15μs
(最低1μs,最高15μs)典型值为2μs
。 然后18B20开始采样 1 - 45μs 典型值为15μs
。
发0即保持低电平,发1即保持高电平。整个过程限时 60 - 120μs
。
void OneWire_Write(u8 dat)
{
u8 mask;
EA = 0;
for(mask = 0x01;mask != 0x80;mask <<= 1)
{
OneWirePort = 0;
OneWire_Delay(2);
if(dat & mask)
OneWirePort = 1;
else
OneWirePort = 0;
OneWire_Delay(10);
OneWirePort = 1;
}
EA = 1;
}
第三步:读字节
主机发出低
电平1 - 15μs
(最低1μs,最高15μs)。然后主机拉高电平等待。 随后主机开始采样 1 - 14μs
。
整个过程限时 15μs
。
u8 OneWire_Read()
{
u8 mask;
u8 dat = 0;
EA = 0;
for(mask = 0x01;mask != 0x80;mask <<= 1)
{
OneWirePort = 0;
OneWire_Delay(1);
OneWirePort = 1;
OneWire_Delay(1);
if(OneWirePort)
dat |= mask;
OneWire_Delay(10);
}
EA = 1;
return dat;
}
第四步:更新Cache
void Update_18B20_Cache()
{
if(OneWire_Online())
{
OneWire_Write(0xCC);
OneWire_Write(0x44);
}
}
第五步:读取温度
u16 Get_18B20_Temp()
{
u8 MSB,LSB;
u16 Temp = 0;
if(OneWire_Online())
{
OneWire_Write(0xCC);
OneWire_Write(0xBE);
LSB = OneWire_Read();
MSB = OneWire_Read();
temp = MSB;
temp <<= 8;
temp |= LSB;
}
return Temp;
}