天天看點

DS18B20溫度傳感器随筆DS18B20溫度傳感器

DS18B20溫度傳感器

  • 複位

    時序圖如下所示:低電平持續時間為480-960us,高電平持續時間為15-60us,然後低電平持續60-240us。

DS18B20溫度傳感器随筆DS18B20溫度傳感器

代碼如下:

void ds18b20_rst(void)
{
  IO_OUT;                //輸出模式
  DQ_OUT=0;              //拉低DQ引腳
  delay_us(600);         //延時480-960us
  DQ_OUT=1;              //拉高DQ引腳
  while(DQ_OUT);         //等待器件應答(器件拉低),約15-60us後
  while(!DQ_OUT);        //應答脈沖出現後,等待器件拉高,約60-240us後
}
           
  • 寫0操作

    時序圖如下所示:

DS18B20溫度傳感器随筆DS18B20溫度傳感器

代碼如下:

void ds18b20_write_zero(void)
{
  IO_OUT;                    //輸出模式
  DQ_OUT=0                   //拉低引腳
  delay_us(80);              //延時60-120us
  DQ_OUT=1;                  //拉高引腳
  delay_us(2);
}
           
  • 寫1操作
    DS18B20溫度傳感器随筆DS18B20溫度傳感器

代碼如下:

void ds18b20_write_one(void)
{
  IO_OUT;                           //輸出模式
  DQ_OUT=0
  delay_us(2);
  DQ_OUT=1;
  delay_us(80);
}
           
  • 讀0、1操作
DS18B20溫度傳感器随筆DS18B20溫度傳感器

代碼如下:

unsigned char ds18b20_read_bit(void)
{
  unsigned char data;
  IO_OUT;
  DQ_OUT=0;
  delay_us(2);
  DQ_OUT=1;
  DQ_IN;
  delay_us(2);
  if(DQ_IN)
    data=1;
  else
    data=0;
  delay_us(500);  
  return data;
}
           
  • 寫1位元組

代碼如下:

void ds18b20_write_byte(unsigned char data)
{
  unsigned char i,testb;
  IO_OUT;
  for(i=0;i<8;i++)
  {
    testb=data&0x01;                 //從低位開始寫
    data>>=1;
    if(testb)
      ds18b20_write_one();
    else
      ds18b20_write_zero();
  }
}
           
  • 讀一位元組

代碼如下:

unsigned char ds18b20_read_byte(void)
{
  unsigned char i,j,data=0;
  for(i=0;i<8;i++)
  {
    j=ds18b20_read_bit();
    data=(j<<7)|(data>>1);      //從低位開始讀
  }
  return data;
}
           
  • 開始讀取資料

代碼如下:

void ds18b20_start(void)
{                                                                  
   ds18b20_rst();              
   ds18b20_write_byte(0xcc);   // 跳過ROM
   ds18b20_write_byte(0x44);   //溫度轉換
}
           
  • 初始化

代碼如下:

unsigned char ds18b20_init(void)
{
  gpio_init();     //此引腳需根據相應的單片機進行配置
  ds18b20_rst();
} 
           
  • .讀取溫度

代碼如下:

short get_tempetature(void)
{
  unsigned char TL,TH;
   short tem;
   ds18b20_start();           //開始轉換
   delay_ms(700);             //等待轉換完成
   ds18b20_init();    
   ds18b20_write_byte(0xcc);   //跳過ROM
   ds18b20_write_byte(0xbe);   //讀取暫存寄存器    
   TL=ds18b20_read_byte();     //低八位 
   TH=ds18b20_read_Byte();     //高八位,注意前五位為符号位隻有全為0的時候溫度是正的     
   tem=TH;                      //獲得高八位
   tem<<=8;   
   tem+=TL;                     //獲得底八位
   return tem;    
}
           

繼續閱讀