关于DS18B20的程序问题
{
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. 之后就像上面程序中将这个数转换为字符型放到字符串中,希望可以帮到你。