温度传感器DS18B20的引脚功能及驱动程序
tencentUser 2024-05-30

1、参数特性

  • 供电电压:3.0V-5.5V。

  • 测量温度范围:-55~+125℃

  • 精度:±0.5℃

  • 数据传输:“一线总线”的数字方式传输

  • 采集精度:可以由用户自定义为9-Bits至12-Bits。


2、引脚功能

如下图所示,DS18B20的三种封装类型,

图片.png

对应的引脚功能如下

图片.png



3、STM32HAL库驱动程序

//复位DS18B20
void DS18B20_Rst(void)       
{                 
    DS18B20_IO_OUT();   //设置为输出
    DS18B20_DQ_OUT=0;      //拉低DQ
    delay_us(750);      //拉低750us
    DS18B20_DQ_OUT=1;      //DQ=1 
    delay_us(15);       //15US
}

//等待DS18B20的回应
//返回1:未检测到DS18B20的存在
//返回0:存在
u8 DS18B20_Check(void)        
{   
    u8 retry=0;
    DS18B20_IO_IN();    //设置为输入
    while (DS18B20_DQ_IN&&retry<200)
    {
        retry++;
        delay_us(1);
    };     
    if(retry>=200)return 1;
    else retry=0;
    while (!DS18B20_DQ_IN&&retry<240)
    {
        retry++;
        delay_us(1);
    };
    if(retry>=240)return 1;        
    return 0;
}

//从DS18B20读取一个位
//返回值:1/0
u8 DS18B20_Read_Bit(void) 
{
    u8 data;
    DS18B20_IO_OUT();   //设置为输出
    DS18B20_DQ_OUT=0; 
    delay_us(2);
    DS18B20_DQ_OUT=1; 
    DS18B20_IO_IN();    //设置为输入
    delay_us(12);
    if(DS18B20_DQ_IN)data=1;
    else data=0;     
    delay_us(50);           
    return data;
}

//从DS18B20读取一个字节
//返回值:读到的数据
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;
}

//写一个字节到DS18B20
//dat:要写入的字节
void DS18B20_Write_Byte(u8 dat)     
 {             
    u8 j;
    u8 testb;
    DS18B20_IO_OUT();     //设置为输出
    for (j=1;j<=8;j++) 
    {
        testb=dat&0x01;
        dat=dat>>1;
        if(testb)       // 写1
        {
            DS18B20_DQ_OUT=0;
            delay_us(2);                            
            DS18B20_DQ_OUT=1;
            delay_us(60);             
        }
        else            //写0
        {
            DS18B20_DQ_OUT=0;
            delay_us(60);             
            DS18B20_DQ_OUT=1;
            delay_us(2);                          
        }
    }
}
 
//开始温度转换
void DS18B20_Start(void)
{                                          
    DS18B20_Rst();       
    DS18B20_Check();     
    DS18B20_Write_Byte(0xcc);// skip rom
    DS18B20_Write_Byte(0x44);// convert
}

//初始化DS18B20的IO口 DQ 同时检测DS的存在
//返回1:不存在
//返回0:存在         
u8 DS18B20_Init(void)
{
    GPIO_InitTypeDef GPIO_Initure;
    __HAL_RCC_GPIOG_CLK_ENABLE();            //开启GPIOB时钟
    
    GPIO_Initure.Pin=GPIO_PIN_9;               //PG9
    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出
    GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
    HAL_GPIO_Init(GPIOG,&GPIO_Initure);     //初始化
 
    DS18B20_Rst();
    return DS18B20_Check();
}

//从ds18b20得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250) 
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;    
}

4、RT_Thread studio驱动包

通常对于一些常用的传感器的驱动,在开发中都不需要我们亲自动手去写,都有现成的,重复造轮子效率很低,所以我们知道哪里有,怎么用就行了,如果是用RT Thread studio就能用现成的软件包,如下

图片.png

点添加之后生成pack包,直接调用相应函数就OK。

图片.png

声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 相关技术文库
  • DIY
  • 开源
  • 自制
  • 树莓派
下载排行榜
更多
评测报告
更多
EE直播间
更多
广告