野火指南者BMP180

BMP180采集程序-基于野火指南者开发板

基于野火指南者开发板,移植的BMP180程序。
IIC口为开发板上的 SCL-PB6 SDA-PB7;
气压传感器实用 GY-68 BMP180 新款 BOSCH温度 代替BMP085 气压传感器模块;在RISYM淘宝店购买。

本文为第一篇博文,纯属没有找到关于野火指南者关于BMP180的直接支持,所写的随笔。第一次写,没有文档规则。

野火指南者BMP180_第1张图片

BMP180.C

#include “bmp180.h”
#include “delay.h”
#include “math.h”

//´æ´¢BMP180Êý¾ÝµÄ½á¹¹
_bmp180 bmp180;

//BMP180³õʼ»¯
//¶ÔʹÓõÄIIC¶Ë¿Ú½øÐгõʼ»¯
void BMP_Init(void)
{
IIC_Init();
}

//дһ¸öÊý¾Ýµ½BMP180
void BMP_WriteOneByte(uint8_t WriteAddr,uint8_t DataToWrite)
{
IIC_Start();

IIC_Send_Byte(0xEE);
IIC_Wait_Ack();

IIC_Send_Byte(WriteAddr);
IIC_Wait_Ack();

IIC_Send_Byte(DataToWrite);
IIC_Wait_Ack();
IIC_Stop();

}

//´ÓBMP180¶ÁÒ»¸ö×Ö½ÚÊý¾Ý
uint8_t BMP_ReadOneByte(uint8_t ReadAddr)
{
uint8_t data = 0;

IIC_Start();

IIC_Send_Byte(0xEE);
IIC_Wait_Ack();

IIC_Send_Byte(ReadAddr);
IIC_Wait_Ack();

IIC_Start();

IIC_Send_Byte(0xEF);
IIC_Wait_Ack();

data = IIC_Read_Byte(1);
IIC_Stop();

return data;

}

//´ÓBMP180¶ÁÒ»¸ö16λµÄÊý¾Ý
short BMP_ReadTwoByte(uint8_t ReadAddr)
{
short data;
uint8_t msb,lsb;

IIC_Start();

IIC_Send_Byte(0xEE);
IIC_Wait_Ack();

IIC_Send_Byte(ReadAddr);
IIC_Wait_Ack();

IIC_Start();

IIC_Send_Byte(0xEF);
IIC_Wait_Ack();

msb = IIC_Read_Byte(1);
lsb = IIC_Read_Byte(0);

IIC_Stop();

data = msb*256 + lsb;

return data;

}

//´ÓBMP180µÄ»ñÈ¡¼ÆËã²ÎÊý
void BMP_ReadCalibrationData(void)
{
bmp180.AC1 = BMP_ReadTwoByte(0xAA);
bmp180.AC2 = BMP_ReadTwoByte(0xAC);
bmp180.AC3 = BMP_ReadTwoByte(0xAE);
bmp180.AC4 = BMP_ReadTwoByte(0xB0);
bmp180.AC5 = BMP_ReadTwoByte(0xB2);
bmp180.AC6 = BMP_ReadTwoByte(0xB4);
bmp180.B1 = BMP_ReadTwoByte(0xB6);
bmp180.B2 = BMP_ReadTwoByte(0xB8);
bmp180.MB = BMP_ReadTwoByte(0xBA);
bmp180.MC = BMP_ReadTwoByte(0xBC);
bmp180.MD = BMP_ReadTwoByte(0xBE);
}

//´ÓBMP180¶ÁȡδÐÞÕýµÄζÈ
long BMP_Read_UT(void)
{
long temp = 0;
BMP_WriteOneByte(0xF4,0x2E);

delay_ms(5);
temp = (long)BMP_ReadTwoByte(0xF6);
return temp;

}

//´ÓBMP180¶ÁȡδÐÞÕýµÄ´óÆøѹ
long BMP_Read_UP(void)
{
long pressure = 0;

BMP_WriteOneByte(0xF4,0x34);
delay_ms(5);

pressure = (long)BMP_ReadTwoByte(0xF6);
//pressure = pressure + BMP_ReadOneByte(0xf8);
pressure &= 0x0000FFFF;

return pressure;

}

//ÓûñÈ¡µÄ²ÎÊý¶ÔζȺʹóÆøѹ½øÐÐÐÞÕý£¬²¢¼ÆË㺣°Î
void BMP_UncompemstatedToTrue(void)
{
bmp180.UT = BMP_Read_UT();//µÚÒ»´Î¶ÁÈ¡´íÎó
bmp180.UT = BMP_Read_UT();//½øÐеڶþ´Î¶ÁÈ¡ÐÞÕý²ÎÊý
bmp180.UP = BMP_Read_UP();

bmp180.X1 = ((bmp180.UT - bmp180.AC6) * bmp180.AC5) >> 15;
bmp180.X2 = (((long)bmp180.MC) << 11) / (bmp180.X1 + bmp180.MD);
bmp180.B5 = bmp180.X1 + bmp180.X2;
bmp180.Temp  = (bmp180.B5 + 8) >> 4;

bmp180.B6 = bmp180.B5 - 4000;
bmp180.X1 = ((long)bmp180.B2 * (bmp180.B6 * bmp180.B6 >> 12)) >> 11;
bmp180.X2 = ((long)bmp180.AC2) * bmp180.B6 >> 11;
bmp180.X3 = bmp180.X1 + bmp180.X2;

bmp180.B3 = ((((long)bmp180.AC1) * 4 + bmp180.X3) + 2) /4;
bmp180.X1 = ((long)bmp180.AC3) * bmp180.B6 >> 13;
bmp180.X2 = (((long)bmp180.B1) *(bmp180.B6*bmp180.B6 >> 12)) >>16;
bmp180.X3 = ((bmp180.X1 + bmp180.X2) + 2) >> 2;
bmp180.B4 = ((long)bmp180.AC4) * (unsigned long)(bmp180.X3 + 32768) >> 15;
bmp180.B7 = ((unsigned long)bmp180.UP - bmp180.B3) * 50000;

if(bmp180.B7 < 0x80000000)
{
	bmp180.p = (bmp180.B7 * 2) / bmp180.B4;		
}
else
{
	bmp180.p = (bmp180.B7 / bmp180.B4) * 2;
}

bmp180.X1 = (bmp180.p >> 8) * (bmp180.p >>8);
bmp180.X1 = (((long)bmp180.X1) * 3038) >> 16;
bmp180.X2 = (-7357 * bmp180.p) >> 16;

bmp180.p = bmp180.p + ((bmp180.X1 + bmp180.X2 + 3791) >> 4);

bmp180.altitude = 44330 * (1-pow(((bmp180.p) / 101325.0),(1.0/5.255)));  

}

你可能感兴趣的:(stm32,传感器,单片机)