DS18B20 & OneWire

版权声明: 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;
}

猜你喜欢

转载自blog.csdn.net/JRK_CSDN/article/details/87915196