ds18b20_drive_function.h

#ifndef __DS18B20_DRIVE_FUNCTION_H
#define __DS18B20_DRIVE_FUNCTION_H

#include "main.h"


//数据输入输出端    
#define DS18B20_DQ_GPIO_PORT        GPIOG
#define DS18B20_DQ_GPIO_PIN            GPIO_Pin_2


#define DS18B20_GPIO_CLK            RCC_APB2Periph_GPIOG
#define DS18B20_GPIO_ClockCmd          RCC_APB2PeriphClockCmd


#define DS18B20_DQ_L()                GPIO_ResetBits(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN)
#define DS18B20_DQ_H()                GPIO_SetBits(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN)


#define DS18B20_DQ_READ()              GPIO_ReadInputDataBit(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN)

#define DS18B20_Delay_US               SysTick_Delay_US 
#define DS18B20_Delay_MS               SysTick_Delay_MS 

extern float temperature;


void DS18B20_Config_Init(void);

void DS18B20_Read_Data(float* p_temp);

#endif

 

ds18b20_drive_function.c

#include "ds18b20_drive_function.h"


float temperature = 0;


/********************************************************************************
                                    引脚IO配置
*******************************************************************************/


/**********************************************************************
  * @ 函数名  :DS18B20_GPIO_Config
  * @ 功能说明:配置DS18B20的引脚
  * @ 参数    :无  
  * @ 返回值  :无
**********************************************************************/ 
static void DS18B20_GPIO_Config(void)
{    
    DS18B20_GPIO_ClockCmd(DS18B20_GPIO_CLK,ENABLE);            //开启引脚时钟

    GPIO_InitTypeDef GPIO_InitStructure;
        
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Pin = DS18B20_DQ_GPIO_PIN;
    GPIO_Init(DS18B20_DQ_GPIO_PORT, &GPIO_InitStructure);
}



/**********************************************************************
  * @ 函数名  :DS18B20_Config_Init
  * @ 功能说明:DS18B20引脚初始化
  * @ 参数    :无  
  * @ 返回值  :无
**********************************************************************/ 
void DS18B20_Config_Init(void)
{
    DS18B20_GPIO_Config();
}
 

/**********************************************************************
  * @ 函数名  :DS18B20_DQ_INTPUT
  * @ 功能说明:配置DQ引脚为输入
  * @ 参数    :无  
  * @ 返回值  :无
**********************************************************************/ 
static void DS18B20_DQ_INTPUT(void)
{
    DS18B20_GPIO_ClockCmd(DS18B20_GPIO_CLK, ENABLE);    //打开GPIO时钟

    GPIO_InitTypeDef GPIO_InitStructure;    

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;          

    GPIO_InitStructure.GPIO_Pin = DS18B20_DQ_GPIO_PIN;    
    GPIO_Init(DS18B20_DQ_GPIO_PORT, &GPIO_InitStructure); 
}


/**********************************************************************
  * @ 函数名  :DS18B20_DQ_INTPUT
  * @ 功能说明:配置DQ引脚为输出
  * @ 参数    :无  
  * @ 返回值  :无
**********************************************************************/ 
static void DS18B20_DQ_OUTPUT(void)
{
    DS18B20_GPIO_ClockCmd(DS18B20_GPIO_CLK, ENABLE);    //打开GPIO时钟

    GPIO_InitTypeDef GPIO_InitStructure;    

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;        //推挽输出 

    GPIO_InitStructure.GPIO_Pin = DS18B20_DQ_GPIO_PIN;    
    GPIO_Init(DS18B20_DQ_GPIO_PORT, &GPIO_InitStructure); 
}






/********************************************************************************
                                    驱动函数
*******************************************************************************/

/**********************************************************************
  * @ 函数名  :DS18B20_Reset
  * @ 功能说明:DS18B20复位
  * @ 参数    :无  
  * @ 返回值  :无
**********************************************************************/
static void DS18B20_Reset(void)       
{                 
    DS18B20_DQ_OUTPUT();
    DS18B20_DQ_L();
    DS18B20_Delay_US(750);
    DS18B20_DQ_H();
    DS18B20_Delay_US(15);
}



/**********************************************************************
  * @ 函数名  :DS18B20_Check
  * @ 功能说明:等待DS18B20的回应
  * @ 参数    :无  
  * @ 返回值  :0:正常    1:未检测到DS18B20的存在
**********************************************************************/
static uint8_t DS18B20_Check(void)        
{   
    uint8_t temp = 0;
    
    DS18B20_DQ_INTPUT();
    while(DS18B20_DQ_READ() && temp < 200)
    {
        temp++;
        DS18B20_Delay_US(1);
    };    
    if(temp >= 200)
    {
        return 1;
    }

    temp=0;
    
    while(!DS18B20_DQ_READ() && temp < 240)
    {
        temp++;
        DS18B20_Delay_US(1);
    };
    
    if(temp >= 240)
    {
        return 1;      
    }
    
    return 0;
}



/**********************************************************************
  * @ 函数名  :DS18B20_Read_Bit
  * @ 功能说明:从DS18B20读取一位数据
  * @ 参数    :无
  * @ 返回值  :0或1
**********************************************************************/
static uint8_t DS18B20_Read_Bit(void)      
{
    uint8_t Data;
    
    DS18B20_DQ_OUTPUT();    //SET PG11 OUTPUT
    DS18B20_DQ_L(); 
    DS18B20_Delay_US(2);
    DS18B20_DQ_H();
    
    DS18B20_DQ_INTPUT();    //SET PG11 INPUT
    DS18B20_Delay_US(12);
    if(DS18B20_DQ_READ())
    {
        Data=1;
    }
    else 
    {
        Data=0;    
    }        
    DS18B20_Delay_US(50);    
    
    return Data;
}



/**********************************************************************
  * @ 函数名  :DS18B20_ReceiveData
  * @ 功能说明:从DS18B20读取数据
  * @ 参数    :无
  * @ 返回值  :读取的数据
**********************************************************************/
static uint8_t DS18B20_ReceiveData(void)     
{        
    uint8_t Data=0;
    uint8_t temp=0;
    for(uint8_t i=0;i<8;i++) 
    {
        temp = DS18B20_Read_Bit();
        Data=(temp << 7) | (Data >> 1);
    }
    
    return Data;
}


/**********************************************************************
  * @ 函数名  :DS18B20_SendData
  * @ 功能说明:向DS18B20发送数据
  * @ 参数    :Data:要发送的数据 
  * @ 返回值  :无
**********************************************************************/
static void DS18B20_SendData(uint8_t Data)
{             
    DS18B20_DQ_OUTPUT();
    
    for(uint8_t i=0;i<8;i++) 
    {  
        if(Data & 0x01) 
        {
            DS18B20_DQ_L();
            DS18B20_Delay_US(2);                            
            DS18B20_DQ_H();
            DS18B20_Delay_US(60);             
        }
        else 
        {
            DS18B20_DQ_L();
            DS18B20_Delay_US(60);             
            DS18B20_DQ_H();
            DS18B20_Delay_US(2);                          
        }
        Data = Data >> 1;
    }
}




/**********************************************************************
  * @ 函数名  :DS18B20_Write_Byte
  * @ 功能说明:读取一个字节数据
  * @ 参数    :无
  * @ 返回值  :读取的数据
**********************************************************************/
static uint8_t DS18B20_Read_Byte(void)     
{        
    uint8_t Read_Data;

    Read_Data = DS18B20_ReceiveData();
    
    return Read_Data;
}



/**********************************************************************
  * @ 函数名  :DS18B20_Write_Byte
  * @ 功能说明:写入一个字节数据
  * @ 参数    :Write_Data:要写入的数据 
  * @ 返回值  :无
**********************************************************************/
static  void DS18B20_Write_Byte(uint8_t Write_Data)     
{             
    DS18B20_SendData(Write_Data);
}




/**********************************************************************
  * @ 函数名  :DS18B20_Temp_Transform
  * @ 功能说明:发送温度转换指令
  * @ 参数    :无
  * @ 返回值  :无
**********************************************************************/
static void DS18B20_Temp_Transform_Instruct(void) 
{                                          
    DS18B20_Reset();       
    DS18B20_Check();     
    DS18B20_Write_Byte(0xcc);    // 发送忽略指令
    DS18B20_Write_Byte(0x44);    // 发送温度转换指令
} 



/**********************************************************************
  * @ 函数名  :DS18B20_Read_Temp_Instruct
  * @ 功能说明:发送读取温度指令
  * @ 参数    :无
  * @ 返回值  :无
**********************************************************************/
static void DS18B20_Read_Temp_Instruct(void) 
{                                          
    DS18B20_Reset();
    DS18B20_Check();     
    DS18B20_Write_Byte(0xcc);    // 发送忽略指令
    DS18B20_Write_Byte(0xbe);    // 发送读取数据指令
} 



/**********************************************************************
  * @ 函数名  :DS18B20_Read_Data
  * @ 功能说明:从ds18b20读取温度值
  * @ 参数    :无
  * @ 返回值  :读取的温度值(-550~1250) 
**********************************************************************/ 
void DS18B20_Read_Data(float* p_temp)
{
    uint8_t temp1 = 0; 
    short temp2 = 0;
    float temp3 = 0;
    uint8_t TL = 0,TH = 0;
    
    DS18B20_Temp_Transform_Instruct();
    DS18B20_Read_Temp_Instruct();
    
    TL = DS18B20_Read_Byte();
    TH = DS18B20_Read_Byte();
              
    if(TH > 7)//温度为负 
    {
        TH = ~TH;
        TL = ~TL; 
        temp1 = 0;
    }
    else //温度为正    
    {
        temp1 = 1;
    }
    
    temp2 = TH;//获得高八位
    temp2 <<= 8;    
    temp2 += TL;//获得低八位
    
    
    temp3 = (float)temp2 * 0.625;//转换 
 
    
    if(temp1 == 0)
    {
        temp3 = -temp3;    //温度值
    }

    temp3 = temp3 / 10;
    
    *p_temp = temp3;

    return ;    
}

 

版权声明:本文为The-explosion原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/The-explosion/p/13499241.html