基于bmp085气压传感器制作的大气压强温度海拔高度测量仪含详细源代码.docx
《基于bmp085气压传感器制作的大气压强温度海拔高度测量仪含详细源代码.docx》由会员分享,可在线阅读,更多相关《基于bmp085气压传感器制作的大气压强温度海拔高度测量仪含详细源代码.docx(37页珍藏版)》请在冰点文库上搜索。
基于bmp085气压传感器制作的大气压强温度海拔高度测量仪含详细源代码
前一段时间看到一网店居然有大气压强传感器销售,赶紧搞了一块回来试试,花了两天的时间终于把它搞定了,其中部分代码借鉴和一网友的的代码。
废话不多说先上传测量效果照
另外本项目的源代码是模块编程,源代码便于阅读,便于移植,也是一个不错的模块化编程例程,如果对这些代码有任何意见或者建议的都可以提出来,谢谢
源代码:
/********************************************************
项目名称:
BMP085模块硬件功能测试
目地:
BMP085模块硬件功能测试
模块:
基本组件,12864驱动,显示驱动,iic驱动,bmp085驱动
功能:
v0.0读取eeprom里面11个数据,并且读取大气压的值以2进制形式显示出来
v0.1读取出当前气压值、气温、海拔高度,并且显示出来
硬件要求:
主控芯片:
STC89c52
测试电路板————普中科技51开发板
晶振:
12.000mhz
作者日期备注
熊梦杰2012/08/31新增
熊孟杰2012/09/01修改
*********************************************************/
#include"config.h"
voidmain()
{
LCD_Init();
DisplayLoading();
Init_BMP085();
for(;;)
{
Show_BMP085_Result();
}
}
/**********************************************
此头文件直接包含全部基本组件,便于管理、调用
**********************************************/
#ifndef__CONFIG_H
#define__CONFIG_H
#include
#include
#include
#include"LCD12864drive.h"
#include"displaydrive.h"
#include"components.h"
#include"i2cdrive.h"
#include"bmp085drive.h"
//typedefunsignedcharuchar;
//typedefunsignedintuint;
#endif
/************************************************************************
文件名:
BMP085driver.c
函数功能:
BMP085的基本操作函数
备注:
控制流程:
初始化(直接读取内部11位eeprom数据)
(1)
获取大气压强未补偿数据(发送控制指令-读取数据)
(2)
获取当前气温值(发送控制指令-读取数据)(3)
获取海拔高度值(根据
(2)(3)两步得到的数据计算出结果)(4)
获取海拔高度平均值(将(4)得到的数据分别放到10位数组中计算出平均值,
由于采用了1进1出的计算方式,因此该数据具有较好的实时性及线性效果(5)
显示结果(通过lcd12864显示测量结果)(6)
重复执行步骤
(2)(3)(4)(5)(6)
************************************************************************/
#include"config.h"
//定义传感器内部EEPROM存储单元里面11个值
intidataAC1,AC2,AC3,B1,B2,MC,MD;
unsignedintidataAC4,AC5,AC6;
unsignedcharidataAltitudeTempFlag;//计算海拔高度使用到的数据标志
intidataAltitudeTemp[10]={0,0,0,0,0,0,0,0,0,0};//海拔高度的10个临时值,取平均值
unsignedcharcodePressureTitle[16]={"气压温度测量"};
unsignedcharidataShowPressure[16]={"气压:
pa"};
unsignedcharidataShowTemperature[16]={"温度:
.℃"};
unsignedcharidataShowAltitude[16]={"海拔:
.米"};
/****************************************************************
函数名称:
BMP085_Read_2Byte
函数功能:
从BMP085读出2字节数据
入口参数:
add//寄存器地址
出口参数:
读取的数据
备注:
*****************************************************************/
intBMP085_Read_2Byte(ucharadd)
{
ucharmsb,lsb;
intdat;
Start_I2c();//起始信号
Send_Byte(BMP085_ADDWR);//发送设备地址+写信号
if(ack==0)return(0);
Send_Byte(add);//发送存储单元地址
if(ack==0)return(0);
Start_I2c();//重复起始信号
Send_Byte(BMP085_ADDWR+1);//发送设备地址+读信号
if(ack==0)return(0);
msb=RcvByte();
Ack_I2c(0);//主机发送应答信号
lsb=RcvByte();
Ack_I2c
(1);//主机收到最后一张字节数据后发送非应答信号
Stop_I2c();//停止信号
DelayMs(5);
dat=msb<<8;
dat|=lsb;
returndat;//返回接受到的两字节数据
}
/****************************************************************
函数名称:
BMP085_Get_UT
函数功能:
读出未补偿的温度值
入口参数:
无
出口参数:
未补偿的温度值
备注:
*****************************************************************/
longBMP085_Get_UT(void)
{
Start_I2c();//起始信号
Send_Byte(BMP085_ADDWR);//发送设备地址+写信号
Send_Byte(CTRL_REG_ADD);//writeregisteraddress
Send_Byte(0X2E);//writeregisterdatafortemp
Stop_I2c();//发送停止信号
DelayMs(CONVERSION_TIME);//AD转换时间,温度最大转换时间为4.5ms
return(long)BMP085_Read_2Byte(0xF6);
}
/****************************************************************
函数名称:
BMP085_Get_UP
函数功能:
读出未补偿的气压值
入口参数:
无
出口参数:
未补偿的气压值
备注:
*****************************************************************/
longBMP085_Get_UP(void)
{
longpressure=0;
Start_I2c();//起始信号
Send_Byte(BMP085_ADDWR);//发送设备地址+写信号
Send_Byte(CTRL_REG_ADD);//writeregisteraddress
Send_Byte(0X34);//低功耗模式指令
Stop_I2c();//发送停止信号
DelayMs(CONVERSION_TIME);//低功耗模式下气压最大转换时间为4.5ms
pressure=BMP085_Read_2Byte(0xF6);
pressure&=0x00FFFF;
returnpressure;
}
/****************************************************************
函数名称:
Init_BMP085
函数功能:
初始化BMP085,读出内部标定参数
入口参数:
无
出口参数:
无
备注:
*****************************************************************/
voidInit_BMP085()
{
AC1=BMP085_Read_2Byte(0xAA);
AC2=BMP085_Read_2Byte(0xAC);
AC3=BMP085_Read_2Byte(0xAE);
AC4=BMP085_Read_2Byte(0xB0);
AC5=BMP085_Read_2Byte(0xB2);
AC6=BMP085_Read_2Byte(0xB4);
B1=BMP085_Read_2Byte(0xB6);
B2=BMP085_Read_2Byte(0xB8);
//MB=BMP085_Read_2Byte(0xBA);
MC=BMP085_Read_2Byte(0xBC);
MD=BMP085_Read_2Byte(0xBE);
}
/****************************************************************
函数名称:
BMP085_Get_Param
函数功能:
从BMP085读出转换后的温度或气压值
入口参数:
choice//bit选择读取温度或气压,当choice=0时,返回温度
当choice=1时,返回气压
出口参数:
temperature或pressure//long类型4字节
备注:
返回的温度值为0.1℃,调用时转换成1℃。
气压值为Pa,调用时转换为hPa
*****************************************************************/
longBMP085_Get_Param(bitchoice)
{
longUT;
longUP;
longX1,X2,B5,B6,X3,B3,p;
unsignedlongB4,B7;
longtemperature;
longpressure;
UT=BMP085_Get_UT();//读取未补偿的温度
UP=BMP085_Get_UP();//读取未补偿的压强
X1=((long)UT-AC6)*AC5>>15;//根据芯片手册提供的公式计算补偿后的温度值
X2=((long)MC<<11)/(X1+MD);
B5=X1+X2;
temperature=(B5+8)>>4;
if(choice==0)
return(long)temperature;//返回温度值,0.1℃
B6=B5-4000;//根据芯片手册提供的公式计算补偿后的气压值
X1=(B2*(B6*B6>>12))>>11;
X2=AC2*B6>>11;
X3=X1+X2;
B3=(((long)AC1*4+X3)+2)/4;
X1=AC3*B6>>13;
X2=(B1*(B6*B6>>12))>>16;
X3=((X1+X2)+2)>>2;
B4=(AC4*(unsignedlong)(X3+32768))>>15;
B7=((unsignedlong)UP-B3)*(50000);
if(B7<0x80000000)
p=(B7*2)/B4;
else
p=(B7/B4)*2;
X1=(p>>8)*(p>>8);
X1=(X1*3038)>>16;
X2=(-7357*p)>>16;
pressure=p+((X1+X2+3791)>>4);
return(long)pressure;//返回气压值,Pa
}
/****************************************************************
函数名称:
BMP085_Get_Altitude
函数功能:
获取海拔高度值
入口参数:
无
出口参数:
altitude//int型2字节,当前海拔高度值
备注:
返回的高度值单位为厘米,调用时再换算成带小数的以米为单位的高度值
*****************************************************************/
intBMP085_Get_Altitude()
{
floatpressure;
floataltitude;
pressure=(float)BMP085_Get_Param
(1);//获取气压值
altitude=44330*(1-pow(pressure/101325,1/5.255));//根据芯片手册提供的公式计算海拔高度
altitude*=100;//转换成厘米单位的高度值,调用时再换算成带小数的高度值,提高精度
return(int)altitude;
}
/****************************************************************
函数名称:
ConvPressure()
函数功能:
转换气压
入口参数:
无
出口参数:
无
备注:
将得到数据转化成lcd的数据,便于显示
*****************************************************************/
voidConvPressure()
{
longPressure;
Pressure=BMP085_Get_Param
(1);
if(Pressure>=0)ShowPressure[5]='+';
else//如果海拔高度是一个负数,要先取反
{
ShowPressure[5]='-';
Pressure=~Pressure;
}
ShowPressure[6]=Pressure/1000000+0x30;
ShowPressure[7]=Pressure%1000000/100000+0x30;
ShowPressure[8]=Pressure%100000/10000+0x30;
ShowPressure[9]=Pressure%10000/1000+0x30;
ShowPressure[11]=Pressure%1000/100+0x30;
ShowPressure[12]=Pressure%100/10+0x30;
ShowPressure[13]=Pressure%10+0x30;
}
/****************************************************************
函数名称:
ConvTemperature()
函数功能:
转换气温
入口参数:
无
出口参数:
无
备注:
将得到数据转化成lcd的数据,便于显示
*****************************************************************/
voidConvTemperature()
{
intTemperature;
Temperature=(int)BMP085_Get_Param(0);
if(Temperature>=0)ShowTemperature[6]='+';
else//如果海拔高度是一个负数,要先取反
{
ShowTemperature[6]='-';
Temperature=~Temperature;
}
ShowTemperature[8]=Temperature/10000+0x30;
ShowTemperature[9]=Temperature%10000/1000+0x30;
ShowTemperature[10]=Temperature%1000/100+0x30;
ShowTemperature[11]=Temperature%100/10+0x30;
ShowTemperature[13]=Temperature%10+0x30;
}
/****************************************************************
函数名称:
ConvAltitude()
函数功能:
转换海拔高度
入口参数:
无
出口参数:
无
备注:
将得到数据转化成lcd的数据,便于显示
*****************************************************************/
voidConvAltitude()
{
longAltitude;//海拔高度
unsignedcharTempnum;//临时值
Altitude=BMP085_Get_Altitude();
if(Altitude>=0)ShowAltitude[6]='+';
else//如果海拔高度是一个负数,要先取反
{
ShowAltitude[6]='-';
Altitude=~Altitude;
}
/**************取10次测量值的平均值作为测量结果,此算法存在记忆效果*************/
AltitudeTempFlag++;//标志自加
if(AltitudeTempFlag>=10)AltitudeTempFlag=0;
AltitudeTemp[AltitudeTempFlag]=Altitude;//根据标志保存数据到数组
for(Tempnum=0;Tempnum<10;Tempnum++)Altitude+=AltitudeTemp[Tempnum];
//由于Altitude的值还保留着,
//所以相加10个数之后应该除以11
Altitude/=11;//计算出平均值
/*********************************************************************/
ShowAltitude[8]=Altitude/10000+0x30;
ShowAltitude[9]=Altitude%10000/1000+0x30;
ShowAltitude[10]=Altitude%1000/100+0x30;
ShowAltitude[12]=Altitude%100/10+0x30;
ShowAltitude[13]=Altitude%10+0x30;
}
/****************************************************************
函数名称:
Sho