单总线温度传感器DS18B20通信

DS18B20是一款单总线通信的温度传感器芯片。也就是说只需要一个GPIO就能实现通信。它的典型应用电路如下图所示。
单总线温度传感器DS18B20通信_第1张图片

下面讲解一下单总线通信协议的实现。
单总线温度传感器DS18B20通信_第2张图片

/*DQ--->P9.7
温度传感器的分辨率可由用户配置为9、10、11或12位,
分别对应0.5℃、0.25 ℃、0.125℃和0.0625℃的增量。
开机时的默认分辨率是12位。*/
#include "ds18b20.h"
uint8 temp[10] = {0};
void Ds18b20_Init(void)
{
    DQ_OUT;//将GPIO配置为输出
    P9OUT |= BIT7;//首先DQ是高电平
    delay_us(15);//延时,等DQ稳定
    P9OUT &= ~BIT7;//拉低
    delay_us(600);//延时大概600US
    P9OUT |= BIT7;//拉高(释放)
    delay_us(15);//15US左右
    delay_us(500);//延时
}

单总线温度传感器DS18B20通信_第3张图片

void Ds18b20_WriteByte(uint8 date)
{   
    uint8 i;
    DQ_OUT;//输出
    for(i=0;i<8;i++)
    {
      //
      if(date&0x01)//写1
      {
      P9OUT &= ~BIT7;
      delay_us(2);
      P9OUT |= BIT7;
      delay_us(60);
      }       
      else//写0
      {
      P9OUT &= ~BIT7;
      delay_us(60);
      P9OUT |= BIT7;//拉高
      delay_us(2);
      } 
      date>>=1;	
    }
   	
}
uint8 ReadByte(void)
{
  uint8 value=0,dat=0;  
  for(uint8 i=0;i<8;i++)
  {
    DQ_OUT;//输出
    P9OUT &= ~BIT7;//拉低
    delay_us(2);
    P9OUT |= BIT7;//拉高   
    DQ_IN;//输入
    delay_us(12);
    if((P9IN&BIT7)==BIT7)
      dat=0x01;
    else
      dat=0x00;
     value=(dat<<7)|(value>>1);	
    delay_us(50);	
  }
  return value;
}

读取温度值

uint8 ReadTemperature(void)
{
  uint8 TH,TL;
  Ds18b20_Init();//初始化
  Ds18b20_WriteByte(0xcc);//跳过ROM
  Ds18b20_WriteByte(0x44);//启动转换
  delay_us(350);
  Ds18b20_Init();//初始化
  Ds18b20_WriteByte(0xcc);//跳过ROM
  Ds18b20_WriteByte(0xbe);//准备读取
  TL=ReadByte();
  TH=ReadByte();
  TL>>=4;//读温度的整数部分
  TH<<=4;
  TH+=TL;
  return (TH);
}

你可能感兴趣的:(嵌入式硬件)