STM32驱动DS18B20,数据的计算都是通过放大转换成整数计算的

#ifndef DS18B20_CFG_H_
#define DS18B20_CFG_H_
//////////////////////////////////////////////////////////////////////////////////////
#ifdef __cplusplus
extern "C" {
#endif
    //////////////////////////////////////////////////////////////////////////////////////
    #include "complier_lib.h"
    #include "delay_task.h"
    #include "one_wire_task.h"
    //////////////////////////////////////////////////////////////////////////////////////
    //===定义结构体
    typedef struct _DS18B20_HandlerType                DS18B20_HandlerType;

    //===定义指针结构
    typedef struct _DS18B20_HandlerType                *pDS18B20_HandlerType;

    //===结构定义
    struct _DS18B20_HandlerType
    {
        UINT8_T                    msgIsPositive;        //0---无数据,1---是负数,2---是正值
        UINT16_T                msgTempX100;        //---温度的值,放大100倍的值
        UINT32_T                msgTempX10000;        //---温度的值,放大1000倍的值
        OneWire_HandlerType        msgOneWire;            //---一线通信
        void(*msgFuncDelayms)(UINT32_T delay);        //---ms延时函数
    };

    //===定义的任务函数
    #define DS18B20_TASK_ONE                        pDS18B20Device0
    #define DS18B20_TASK_TWO                        0
    #define DS18B20_TASK_THREE                        0

//===外部调用接口
    extern DS18B20_HandlerType g_DS18B20Device0;
    extern pDS18B20_HandlerType pDS18B20Device0;

    //===函数的定义
    UINT8_T  DS18B20_OneWire_Init(DS18B20_HandlerType *DS18B20x, void(*pFuncDelayus)(UINT32_T delay), void(*pFuncDelayms)(UINT32_T delay));
    UINT8_T  DS18B20_OneWire_Device0_Init(DS18B20_HandlerType *DS18B20x);
    UINT8_T  DS18B20_OneWire_Device1_Init(DS18B20_HandlerType *DS18B20x);
    UINT8_T  DS18B20_OneWire_Device2_Init(DS18B20_HandlerType *DS18B20x);
    UINT8_T  DS18B20_OneWire_DeInit(DS18B20_HandlerType *DS18B20x);
    UINT8_T  DS18B20_OneWire_ReadDeviceID(DS18B20_HandlerType *DS18B20x, UINT8_T *_id);
    UINT16_T DS18B20_OneWire_ReadTemp(DS18B20_HandlerType *DS18B20x);
    UINT16_T DS18B20_OneWire_ReadTempByID(DS18B20_HandlerType *DS18B20x, UINT8_T *_id);
    //////////////////////////////////////////////////////////////////////////////////////
#ifdef __cplusplus
}
#endif
//////////////////////////////////////////////////////////////////////////////////////
#endif /*DS18B20_CFG_H_ */

#include "ds18b20_cfg.h"

//---变量定义
DS18B20_HandlerType g_DS18B20Device0 = { 0 };
pDS18B20_HandlerType pDS18B20Device0 = &g_DS18B20Device0;

///////////////////////////////////////////////////////////////////////////////
//////函        数:
//////功        能:
//////输入参数:
//////输出参数:
//////说        明:
//////////////////////////////////////////////////////////////////////////////
UINT8_T DS18B20_OneWire_Device0_Init(DS18B20_HandlerType *DS18B20x)
{
    DS18B20x->msgOneWire.msgDAT.msgGPIOBit = LL_GPIO_PIN_2;
    DS18B20x->msgOneWire.msgDAT.msgGPIOPort = GPIOC;
    return OK_0;
}

///////////////////////////////////////////////////////////////////////////////
//////函        数:
//////功        能:
//////输入参数:
//////输出参数:
//////说        明:
//////////////////////////////////////////////////////////////////////////////
UINT8_T DS18B20_OneWire_Device1_Init(DS18B20_HandlerType *DS18B20x)
{
    return OK_0;
}

///////////////////////////////////////////////////////////////////////////////
//////函        数:
//////功        能:
//////输入参数:
//////输出参数:
//////说        明:
//////////////////////////////////////////////////////////////////////////////
UINT8_T DS18B20_OneWire_Device2_Init(DS18B20_HandlerType *DS18B20x)
{
    return OK_0;
}

///////////////////////////////////////////////////////////////////////////////
//////函        数:
//////功        能:
//////输入参数:
//////输出参数:
//////说        明:
//////////////////////////////////////////////////////////////////////////////
UINT8_T DS18B20_OneWire_Init(DS18B20_HandlerType *DS18B20x, void(*pFuncDelayus)(UINT32_T delay), void(*pFuncDelayms)(UINT32_T delay))
{
    if ((DS18B20x != NULL) && (DS18B20x == DS18B20_TASK_ONE))
    {
        DS18B20_OneWire_Device0_Init(DS18B20x);
    }
    else if ((DS18B20x != NULL) && (DS18B20x == DS18B20_TASK_TWO))
    {
        DS18B20_OneWire_Device1_Init(DS18B20x);
    }
    else if ((DS18B20x != NULL) && (DS18B20x == DS18B20_TASK_THREE))
    {
        DS18B20_OneWire_Device2_Init(DS18B20x);
    }
    else
    {
        return  ERROR_1;
    }

    //---注册延时函数
    if (pFuncDelayms != NULL)
    {
        DS18B20x->msgFuncDelayms = pFuncDelayms;
    }
    else
    {
        DS18B20x->msgFuncDelayms = DelayTask_ms;
    }
    return OneWireTask_Init(&(DS18B20x->msgOneWire), pFuncDelayus);
}

///////////////////////////////////////////////////////////////////////////////
//////函       数:
//////功       能:
//////输入参数:
//////输出参数:
//////说       明:
//////////////////////////////////////////////////////////////////////////////
UINT8_T DS18B20_OneWire_DeInit(DS18B20_HandlerType *DS18B20x)
{
    return OneWireTask_DeInit(&(DS18B20x->msgOneWire));
}
///////////////////////////////////////////////////////////////////////////////
//////函       数: UINT8_T Ds18b20Cfg_Start(void)
//////功       能: 启动Ds18b20Cfg
//////输入参数:
//////输出参数: 0---失败;1---表示成功
//////说       明:
//////////////////////////////////////////////////////////////////////////////
UINT8_T DS18B20_OneWire_START(DS18B20_HandlerType *DS18B20x)
{
    return OneWireTask_START(&(DS18B20x->msgOneWire));
}

///////////////////////////////////////////////////////////////////////////////
//////函       数: void Ds18b20Cfg_WriteByte(UINT8_T val)
//////功       能: 写入一字节的数据
//////输入参数: 写入的值
//////输出参数: 无
//////说       明:
///////////////////////////////////////////////////////////////////////////////
UINT8_T DS18B20_OneWire_WriteByte(DS18B20_HandlerType *DS18B20x, UINT8_T val)
{
    return OneWireTask_WriteByte(&(DS18B20x->msgOneWire), val);
}

///////////////////////////////////////////////////////////////////////////////
//////函       数: UINT8_T Ds18b20Cfg_ReadByte(void)
//////功       能: 读取一字节的数据
//////输入参数: 无
//////输出参数: 读取的数据
//////说       明:
///////////////////////////////////////////////////////////////////////////////
UINT8_T DS18B20_OneWire_ReadByte(DS18B20_HandlerType *DS18B20x)
{
    return OneWireTask_ReadByte(&(DS18B20x->msgOneWire));
}

///////////////////////////////////////////////////////////////////////////////
//////函        数:
//////功        能:
//////输入参数:
//////输出参数:
//////说        明:
//////////////////////////////////////////////////////////////////////////////
UINT8_T DS18B20_OneWire_ReadDeviceID(DS18B20_HandlerType *DS18B20x, UINT8_T *id)
{
    UINT8_T i;

    //---总线复位
    if (DS18B20_OneWire_START(DS18B20x) == 0)
    {
        return ERROR_1;
    }

    //---发命令
    DS18B20_OneWire_WriteByte(DS18B20x, 0x33);

    //---读取设备的ID信息
    for (i = 0; i < 8; i++)
    {
        id[i] = DS18B20_OneWire_ReadByte(DS18B20x);
    }

    //----总线复位
    DS18B20_OneWire_START(DS18B20x);
    return 0;
}

///////////////////////////////////////////////////////////////////////////////
//////函       数: UINT16_T DS18B20_GetWenDu(DS18B20_HandlerType *DS18B20HandlerType)
//////功       能: 获取温度值
//////输入参数: 无
//////输出参数: 放大100倍之后的温度的值
//////说       明:
///////////////////////////////////////////////////////////////////////////////
UINT16_T DS18B20_OneWire_ReadTemp(DS18B20_HandlerType *DS18B20x)
{
    UINT16_T _return = 0, temH = 0;
    UINT8_T temL;

    //---读取数据之前首先设置为数据无效,避免其他设备使用
    DS18B20x->msgIsPositive = 0;

    //---启动温度传感器---总线复位
    DS18B20_OneWire_START(DS18B20x);

    //---忽略地址
    DS18B20_OneWire_WriteByte(DS18B20x, 0xCC);

    //---启动转换
    DS18B20_OneWire_WriteByte(DS18B20x, 0x44);

    //---延时等待
    DS18B20x->msgFuncDelayms(1);

    //---初始化温度传感器---总线复位
    DS18B20_OneWire_START(DS18B20x);

    //---忽略地址
    DS18B20_OneWire_WriteByte(DS18B20x, 0xCC);

    //---读取温度
    DS18B20_OneWire_WriteByte(DS18B20x, 0xBE);

    //---读取低位
    temL = DS18B20_OneWire_ReadByte(DS18B20x);

    //---读取高位
    temH = DS18B20_OneWire_ReadByte(DS18B20x);

    //---获取温度码值
    _return = (temH << 8) | temL;

    //---判断温度是正值还是负值
    if ((temH & 0x80) == 0)
    {
        //---读取的温度是正值
        DS18B20x->msgIsPositive = 2;
    }
    else
    {
        //===读取的温度是负值
        DS18B20x->msgIsPositive = 1;
    }

    //---读取的温度值
    temH = _return;

    //---保留有效位数据
    temH &= 0x0FFF;

    //---获取温度值对应的16进制的数据
    if (DS18B20x->msgIsPositive == 2)
    {
        DS18B20x->msgTempX10000 = temH;
    }
    else
    {
        DS18B20x->msgTempX10000 = 0x1000 - temH;
    }

    //---将十六进制数转换成温度值
    DS18B20x->msgTempX10000 *= 625;

    //---获取实际温度值
    DS18B20x->msgTempX100 = (UINT16_T)(DS18B20x->msgTempX10000 / 100);

    //---返回温度码的值
    return _return;
}

///////////////////////////////////////////////////////////////////////////////
//////函        数:
//////功        能:
//////输入参数:
//////输出参数:
//////说        明:
//////////////////////////////////////////////////////////////////////////////
UINT16_T DS18B20_OneWire_ReadTempByID(DS18B20_HandlerType *DS18B20x, UINT8_T *id)
{
    UINT16_T _return = 0, temH = 0;
    UINT8_T temL = 0, i = 0;

    //---启动温度传感器---总线复位
    DS18B20_OneWire_START(DS18B20x);

    //---忽略地址
    DS18B20_OneWire_WriteByte(DS18B20x, 0x55);

    //---写入ROM的ID
    for (i = 0; i < 8; i++)
    {
        DS18B20_OneWire_WriteByte(DS18B20x, id[i]);
    }

    //---启动转换
    DS18B20_OneWire_WriteByte(DS18B20x, 0x44);

    //---延时等待
    DS18B20x->msgFuncDelayms(1);

    //---初始化温度传感器---总线复位
    DS18B20_OneWire_START(DS18B20x);

    //---忽略地址
    DS18B20_OneWire_WriteByte(DS18B20x, 0x55);

    //---写入ROM的ID
    for (i = 0; i < 8; i++)
    {
        DS18B20_OneWire_WriteByte(DS18B20x, id[i]);
    }

    //---读取温度
    DS18B20_OneWire_WriteByte(DS18B20x, 0xBE);

    //---读取低位
    temL = DS18B20_OneWire_ReadByte(DS18B20x);

    //---读取高位
    temH = DS18B20_OneWire_ReadByte(DS18B20x);

    //---获取温度码值
    _return = (temH << 8) | temL;

    //---判断温度是正值还是负值
    if ((temH & 0x80) == 0)
    {
        //---读取的温度是正值
        DS18B20x->msgIsPositive = 0;
    }
    else
    {
        //===读取的温度是负值
        DS18B20x->msgIsPositive = 1;
    }

    //---读取的温度值
    temH = _return;

    //---保留有效位数据
    temH &= 0x0FFF;

    //---获取温度值对应的16进制的数据
    if (DS18B20x->msgIsPositive == 0)
    {
        DS18B20x->msgTempX10000 = temH;
    }
    else
    {
        DS18B20x->msgTempX10000 = 4096 - temH;
    }

    //---将十六进制数转换成温度值
    DS18B20x->msgTempX10000 *= 625;

    //---获取实际温度值
    DS18B20x->msgTempX100 = (UINT16_T)(DS18B20x->msgTempX10000 / 100);

    //---返回温度码的值
    return _return;
}

你可能感兴趣的:(STM32驱动DS18B20,数据的计算都是通过放大转换成整数计算的)