微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于DS18B20的程序问题

关于DS18B20的程序问题

时间:10-02 整理:3721RD 点击:
void main()
{
    bit res;
    int temp;        //读取到的当前温度值
    int intT, decT;  //温度值的整数和小数部分
    unsigned char len;
    unsigned char str[12];
    EA = 1;            //开总中断
    ConfigTimer0(10);  //T0定时10ms
    Start18B20();      //启动DS18B20
    InitLcd1602();     //初始化液晶
    while (1)
    {
        if (flag1s)  //每秒更新一次温度
        {
            flag1s = 0;
            res = Get18B20Temp(&temp);  //读取当前温度
            if (res)                    //读取成功时,刷新当前温度显示
            {
                intT = temp >> 4;             //分离出温度值整数部分
                decT = temp & 0xF;            //分离出温度值小数部分
                len = IntToString(str, intT); //整数部分转换为字符串
                str[len++] = '.';             //添加小数点
                                decT=(decT*10)/16;                          //二进制的小数部分转换为1位十进制位
                str[len++] = decT + '0';      //十进制小数位再转换为ASCII字符
                while (len < 6)               //用空格补齐到6个字符长度
                {
                    str[len++] = ' ';
                }
                str[len] = '\0';              //添加字符串结束符
                LcdShowStr(0, 0, str);        //显示到液晶屏上
            }
            else                        //读取失败时,提示错误信息
            {
                LcdShowStr(0, 0, "error!");
            }
            Start18B20();               //重新启动下一次转换
        }
    }
}
这个是用lcd1602显示从DS18B20读取温度的程序,lcd1602驱动程序和DS18B20程序我没附上
其中decT=(decT*10)/16;                          //二进制的小数部分转换为1位十进制位
这句话怎样理解,为什么是乘以10再除以16?还有为什么小数部分说是二进制?但是整数部分读出来是十进制啊,不太明白,望各位大神指导下,谢谢!

decT=(decT*10)/16;
decT*10是为了提取小数点后一位数,因整形参数是不带小数点的,乘以10相当于把小数点往后移动1位;再除以16求整,貌似有误吧,如果要提取10进制的话为什么不除以10求余呢?decT=(decT*10)%10;

decT=(decT*10)/16: 乘以10是小数点后移一位;/16是提取一个字节的高位

除以16是因为  DS18B20的分辨率为0.0625.   16*0.0625 = 1℃,因此除以16是将采集到的数值直接转换成温度。

要是将数值转为温度,为什么整数位不用除以16

你好,我最近也在迷惑这条表达式。小编会了吗?

嘿嘿!刚刚我会了。
你可以带入数据算一下看看嘛
  decT = temp & 0xF;            //分离出温度值小数部分
这里就取DS18B20十六位地址的低四位,而其第四位恰好是它寄存器小数部分表示位,DS18B20的精度是0.0625 ,二进制是0000 0000 0000 0001
举个例子
例如:芯片采集到温度为0.5摄氏度, 则它的寄存器中的值就是  0000 0000 0000 1000  取低四位为1000 带入
decT=(decT*10)/16; 中 decT=(8*10)/16=5 这就是小数部分的值

嘿嘿 我也看懂了

例如:芯片采集到温度为0.5摄氏度, 则它的寄存器中的值就是  0000 0000 0000 1000  取低四位为1000 带入
decT=(decT*10)/16; 中 decT=(8*10)/16=5 这就是小数部分的值

我刚开始也没看懂,后来认真看了一下,decT为后四位,只是一个四位的二进制数,范围是0到15,先把它除以16得到一个小数,例如2/16=0.125   8/16=0.5  9/16=0.5625 之后乘以10,0.125变为1.5,因为decT为char型,小数部分被自动省略,1.5只剩下1,同样0.5625乘以10后变成5.625,小数部分被省略decT变为5. 之后就像上面程序中将这个数转换为字符型放到字符串中,希望可以帮到你。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top