DS18B20传感器数据处理及相关问题

这篇文章主要是记录我在学习DS18B20中遇到的一些问题,以及最后的解决方法。

void datapros(int temp)
{
	float tp;
	if(temp<0) { //需要显示负号 
		displaydata[0] = 0x40; //显示的是一个负号 
		temp = temp-1;
		temp =~temp; //取反,需要先把TEMP转化成为对应的正温度
		tp = temp;
		temp = tp*0.0625*100+0.5; //为了保留小数点后两位,+0.5表示四舍五入 
	} 
	else  {
		displaydata[0] = 0x00;
		tp = temp;
		temp = tp*0.0625*100+0.5;
	}
	displaydata[1] = guard[temp/10000];					 //这边温度处理函数很重要
	displaydata[2] = guard[temp%10000/1000];
	displaydata[3] = guard[temp%10000%1000/100]|0x80;
	displaydata[4] = guard[temp%100/10];
	displaydata[5] = guard[temp%100%10];
 }

问题一:temp = temp -1; temp =~temp

    我在网上也看到很多人对这边的处理感到很疑惑,刚开始学温度传感器的时候,看的资料上介绍对于负温度的处理方法是:先加1,后取反。但是在看别人写的函数的时候,又是先减一再取反,刚开始比较困惑,后来想到补码的内容,恍然大悟。temp是负温度时,因为最高的五位是1,我们想要把它转化成相应的正温度才能处理,又不能像数学里面那样,乘以-1就行了。下面我们以-0.5°为例:

-0.5:0000 0000 0000 1000
+0.5:1111 1111 1111 1000

    直接把-0.5的二进制取反行吗?我们试一试,结果是:0000 0000 0000 0111。结果不对,得先找出-0.5和+0.5补码之间的关系,让处理后的-0.5加上+0.5能够等于0。只要把-0.5先减个1就能实现了。

问题二:为什么下面需要这么处理?为什么是要乘以0.0625?以及加0.5?

temp = tp*0.0625*100+0.5

        网上也有很多人觉得temp需要变成十进制的数,但是temp定义的是Int,说这样不对。但是要想到后面我们还是需要用到temp,又不是直接输出,如果变成十进制的数,让单片机怎么存?存在哪个类型里面?所以不要太纠结到底是哪种进制的,哪种进制的都可以一样处理!tp乘以0.0625以后,就从温度传感器传过来的测量参数,变成了我们可以从16位二进制转化成十进制以后就可以直接运用的实际温度,二进制中的一个1,就相当于是0.0625度!而且为什么需要乘以100?temp是16位二进制数,很大。乘以0.0625以后会变小,我们可以不用担心乘以100存储空间不够!这样放大100倍以后能保留更多的数据,不至于 ,因为转化成为整形把小数点后面的数抹掉了!加0.5起到四舍五入的作用。再下面对10000取整和取余,我们就是直接把int型的temp当做十进制来运算,只不过运算的结果最终还是会以二进制来保存就是了!

    
  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值