BMP180的负温度的读取和显示

		**BMP180的负温度的读取和显示**

在某个项目中用到了BMP180(TI的芯片,项目中是在某宝上买的模块,I2C总线方式读取)。具体的I2C总线方式读取数据的内容就不多说了,这种东西网上一大把,说多了没意思,之前的项目的硬件程序和传输协议里面都只是针对正温度来设计,在产品实际应用中发现有些使用地点的环境有零下的温度,但机子没有做零下温度的处理,所以不能正常显示零下温度。
刚开始我在网上查资料看BMP180有没有对零下温度的处理,网上几乎没有对这个所提及,我仔细地研究了一下BMP180的数据手册:
BMP180的负温度的读取和显示_第1张图片
程序里面计算之后是一个long的数据格式来存取温度信息,但也没有明确说明正负温度是怎么表示的,我就大胆的猜想一下,就是一般负数的存取方式(原来负数的数据取反再加1)
大概是这样的:比如一个负15.5的温度数据
(1)原始数据:1000,0000,1001,1011
(2)取反: 1111,1111,0110,0100
(3)加1: 1111,1111,0110,0101(0xFF65)单片机存储的数据格式

上手载程序上验证一下吧:
s16 tmp = 0;
u16 crc = 0;
u8 ucTemperatureStr[7] = {0xEE,0xAA,CMD_TEMPERATURE};

tmp = -155;//温度测试数据

ucTemperatureStr[3] = tmp/10;
ucTemperatureStr[4] = tmp%10;
crc = CRC16(ucTemperatureStr+2,3);
ucTemperatureStr[5] =(u8)(crc>>8);
ucTemperatureStr[6] =(u8)(crc);
RS232_SendStr(ucTemperatureStr,7);

在这里插入图片描述
看现象!这就验证了我的猜想。
之前程序的传输协议是分别发送十位和个位,这让我很奇怪,难道分别发送高八位和低八位不好吗?(这里我就不去改之前的代码了,我只管加上功能就好了,项目里面改动一项其他都得跟着改,太麻烦了……)
我们接着往下看……
BMP180的负温度的读取和显示_第2张图片
ucTemperatureStr[3] = 0XF1 = 1111,0001
取反加1:1000,1111 = -15
ucTemperatureStr[4] = 0XFB = 1111,1011
取反加1:1000,0101 = -5

总结来说负数取十位个位之后两个位都是负数!

这样单片机这边不用更改程序,可以在ARM解析那边更改程序就好了,这样的话可以省去更改单片机程序的麻烦(因为很多仪器都是卖到很远的地方,要用尽可能简单的办法来改进仪器)

最后!补充一下解析数据的程序(虽然很简单,但是还是要说一下,哈哈……)

if(ucTemperatureStr[3]<0)//十位
	dec = abs(ucTemperatureStr[3]);
else
	dec = ucTemperatureStr[3];
if(ucTemperatureStr[4]<0)//个位
	sin = abs(ucTemperatureStr[3]);
else
	sin = ucTemperatureStr[3];

你可能感兴趣的:(单片机固件程序)