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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值