C51联盟 —— DS18B20

版权声明: https://blog.csdn.net/JRK_CSDN/article/details/86601108

DS18B20

  • DALLAS公司成功的One-Wire温度传感器,后在2011年Maxim收购了DALLAS。

精度&&工作方式

在这里插入图片描述
数据格式分MSB(8位)、LSB(8位),其中MSB的高5位是不用做数值信息的,仅最高位用于表示符号。
每一个数表示0.0625℃,计数值×0.0625即可换算成摄氏度

常用控制编码

0xCC:跳过ROM读取

0x44:更新Scratchpad (便笺式高速Cache)

0xBE:读取Scratchpad ,先输出LSB,后输出MSB (先低后高)

驱动


  • 访问设备 是否 忙
bit Ack_18B20() //获取器件状态
{
 bit Ack;
 
 EA=0;
 OneWire_18B20 = 0;
 delayX0us(50);		//延时500us(未定义该函数,自己写)
 OneWire_18B20 = 1;
 delayX0us(6);
 Ack = OneWire_18B20;
 while(!OneWire_18B20); //等待信号结束
 EA=1;
 
 return Ack;  //“1”为 18B20在线
}

  • 写字节
void Write_18B20(u8 dat)  //器件写字节
{
 u8 mark;
 
 EA=0;
 for(mark=0x01;mark!=0;mark<<=1)
 {
  OneWire_18B20 = 0;  //拉低
  _nop_();
  _nop_();
  if(dat & mark)
   OneWire_18B20 = 1; //写数据
  else
   OneWire_18B20 = 0;
  delayX0us(6);
  OneWire_18B20 = 1;  //拉高
 }
 EA = 1;
}

  • 读字节
u8 Read_18B20()  //器件读字节
{
 u8 mark;
 u8 dat = 0;
 
 EA=0;
 for(mark=0x01;mark!=0;mark<<=1)
 {
  OneWire_18B20 = 0;
  _nop_();
  _nop_();
  OneWire_18B20 = 1;
  _nop_();
  _nop_();
  if(OneWire_18B20)
   dat |= mark;
  delayX0us(6);
 }
 EA = 1;
 
 return dat;
}

  • 更新Scratchpad (即 16位温度值寄存器)
bit Init_18B20() //器件温度转换
{
 bit Ack;
 
 Ack = Ack_18B20();
 if(Ack == 0)
 {
  Write_18B20(0xCC);
  Write_18B20(0x44);
 }
 
 return ~Ack;
}

  • 读取16位温度值
int GetTemp_18B20()  //获取16位温度数据
{
  bit Ack;
  u8 MSB, LSB;
  int temp = 0;
  Ack = Ack_18B20();
  if(Ack == 0)
  {
	Write_18B20(0xCC);
 	Write_18B20(0xBE);
 	LSB = Read_18B20();
 	MSB = Read_18B20();
 	temp = MSB;
 	temp <<= 8;
 	temp |= LSB;
  }
 return temp;
}

注:
①每次写操作必须从ROM开始,一般跳过(使用0xCC)。
②delayX0us(u8 num)延时函数未写,意义为延时num*10 微秒,具体请看DS18B20时序图。

猜你喜欢

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