详解温度传感器DS18B20编程与使用

DS18B20是由DALLAS半导体公司推出的一种的“一线总线”接口的温度传感器, 与传统的热敏电阻等测温元件相比,它是一种新型的体积小、适用电压宽、与微处理器接口简单的数字化温度传感器。

1.测量温度范围:-55~+125℃
2.精度:±0.5℃
3.数据传输:“一线总线”的数字方式传输
在这里插入图片描述
图1 硬件连接图

DS18B20共有6种信号类型:复位脉冲、应答脉冲、写0、写1、读0和读1

1.复位操作:
引脚拉低——延时480-960us——引脚高——延时15-60us
在这里插入图片描述
图2 红框为复位操作时序

void DS18B20_Rst(void)    
{                
   DS18B20_IO_OUT();     
   DS18B20_DQ_OUT=0;  
   delay_us(750);    
   DS18B20_DQ_OUT=1;   
   delay_us(15);     
}

2.应答操作
将引脚设置为输入模式——判断引脚低电平时间是否大于60us、小于240us——返回应答结果
在这里插入图片描述
图3 红框为应答操作时序

u8 DS18B20_Check(void)           
{  
    u8retry=0;
    DS18B20_IO_IN();   //SET PG11 INPUT    
    while (DS18B20_DQ_IN&&retry<200)
    {
       retry++;
       delay_us(1);
    };        
    if(retry>=200)return1;
         elseretry=0;
    while (!DS18B20_DQ_IN&&retry<240)
    {
         retry++;
         delay_us(1);
    }
    if(retry>=240)return1;       
         return0;
}

3. 读0、读1操作
将引脚设置为输出模式——引脚拉低——延时2us——引脚拉高——设置为输入模式——延时2us——读取引脚状态——返回读取结果
在这里插入图片描述
图4 读操作

u8 DS18B20_Read_Bit(void)   
{
   u8 data;
   DS18B20_IO_OUT();        //SET PG11 OUTPUT
   DS18B20_DQ_OUT=0;
   delay_us(2);
   DS18B20_DQ_OUT=1;
   DS18B20_IO_IN();   //SET PG11 INPUT
   delay_us(12);
   if(DS18B20_DQ_IN)data=1;
   else data=0;      
   delay_us(50);          
   return data;
}

4.写1操作
设置引脚为输出模式——引脚拉低——延时2us——引脚拉高——延时大于60us
在这里插入图片描述
图5 红框为写操作

void DS18B20_Write_Zero(void)
{
    DS18B20_IO_OUT();        //SET PG11 OUTPUT;
   DS18B20_DQ_OUT=0;    
   delay_us(2);                           
   DS18B20_DQ_OUT=1;
   delay_us(60);
}

5.写0操作
设置引脚为输出模式——引脚拉低——延时60-120us——引脚拉高——延时2us
在这里插入图片描述
图6 红框为写1操作

void DS18B20_Write_One(void)
{
   DS18B20_IO_OUT();        //SET PG11 OUTPUT;
   DS18B20_DQ_OUT=0;    
   delay_us(60);                           
   DS18B20_DQ_OUT=1;
   delay_us(2);
}

基本的操作完成后,再写4个功能函数

6.读取一个字节

u8 DS18B20_Read_Byte(void)    
{       
   u8 i,j,dat;
   dat=0;
   for(i=1;i<=8;i++)
   {
       j=DS18B20_Read_Bit();
       dat=(j<<7)|(dat>>1);
   }                                                          
   return dat;
}

7.写一个字节

void DS18B20_Write_Byte(u8 dat)    
 {            
   u8 j;
   u8 testb;
   DS18B20_IO_OUT();        //SET PG11 OUTPUT;
   for (j=1;j<=8;j++)
   {
       testb=dat&0x01;
       dat=dat>>1;
       if (testb)
           DS18B20_Write_One();
       else
          DS18B20_Write_Zero();
   }
}

8.开始读取数据

void DS18B20_Start(void)
{                                                                  
   DS18B20_Rst();          
   DS18B20_Check();    
   DS18B20_Write_Byte(0xcc);   // skiprom
   DS18B20_Write_Byte(0x44);  //convert
}

9.初始化DS18B20

u8 DS18B20_Init(void)
{
    GPIO_Init();     //此引脚需根据相应的单片机进行配置
    DS18B20_Rst();
    return DS18B20_Check();
} 

10.获取温度值
在这里插入图片描述
图7 程序流程图

short DS18B20_Get_Temp(void)
{
   u8 temp;
   u8 TL,TH;
   short tem;
   DS18B20_Start ();           //开始转换
   DS18B20_Rst();
   DS18B20_Check();    
   DS18B20_Write_Byte(0xcc);   //skip rom
   DS18B20_Write_Byte(0xbe);   //convert       
   TL=DS18B20_Read_Byte();     //LSB  
   TH=DS18B20_Read_Byte();     //MSB  
   if(TH>7)
   {
       TH=~TH;
       TL=~TL;
       temp=0;//温度为负 
   }
   else 
       temp=1;//温度为正                 
   tem=TH; //获得高八位
   tem<<=8;   
   tem+=TL;//获得底八位
   tem=(double)tem*0.625;//转换    
   if(temp)
   	return tem; //返回温度值
   else
   	return -tem;   
}

参考文献:
STM32F103开发指南-标准库版本_V1.1
DS18B20数据手册

猜你喜欢

转载自blog.csdn.net/lin5103151/article/details/84932787