DS18B20+数字温度传感器:如何处理传感器输出的数据?

DS18B20+ digital temperature sensor: how to process data from sensor output?

我需要将编码为 16-bit sign-extended two’s complement number 的传感器输出数据转换为浮点值。以下来自传感器数据表的信息:

这是我的第一个想法:

/*
 * Author: Jakub Standarski
 * Email: jstand.jakub.standarski@gmail.com
 *
 * Date: 03.10.2020
 *
 */

/*****************************************************************************/
/* HEADERS */
/*****************************************************************************/

#include <stdint.h>
#include <stdio.h>
#include <string.h>



/*****************************************************************************/
/* PRIVATE VARIABLES */
/*****************************************************************************/

const float temperature_conversion_table[11] = {
    0.0625f, 0.125f, 0.25f, 0.5f, 1.0f, 2.0f, 4.0f, 8.0f, 16.0f, 32.0f, 64.0f};



/*****************************************************************************/
/* PRIVATE FUNCTIONS PROTOTYPES */
/*****************************************************************************/

static float convert_raw_data_into_temperature(int16_t sensor_raw_data);



/*****************************************************************************/
/* MAIN */
/*****************************************************************************/

int main(void)
{
    float temperature_value = convert_raw_data_into_temperature(0xFE6F);
    printf("%.4f\n", temperature_value);
    return 0;
}



/*****************************************************************************/
/* PRIVATE FUNCTIONS DEFINITIONS */
/*****************************************************************************/

static float convert_raw_data_into_temperature(int16_t sensor_raw_data)
{
    float temperature_value = 0.0f;

    int bit_index = 11;
    if ((sensor_raw_data & (1 << bit_index)) == 0) {
        for (bit_index = 10; bit_index >= 0; bit_index--) {
            if ((sensor_raw_data & (1 << bit_index)) != 0) {
                temperature_value += temperature_conversion_table[bit_index];
            }
        }
    } else {
        temperature_value -= temperature_conversion_table[10];
        for (bit_index = 9; bit_index >= 0; bit_index--) {
            if ((sensor_raw_data & (1 << bit_index)) != 0) {
                temperature_value += temperature_conversion_table[bit_index];
            }
        }
    }

    return temperature_value;
}

现在的问题是:这有意义吗?有什么更好的办法吗?

据我所知,它适用于测试值,但我想知道是否有更优雅的方法来做到这一点。

尝试

float temperature_value;

temperature_value = (float)sensor_raw_data / 16.0f;