基于bmp085气压传感器制作的大气压强温度海拔高度测量仪含详细源代码.docx

上传人:b****6 文档编号:16473696 上传时间:2023-07-13 格式:DOCX 页数:37 大小:23.68KB
下载 相关 举报
基于bmp085气压传感器制作的大气压强温度海拔高度测量仪含详细源代码.docx_第1页
第1页 / 共37页
基于bmp085气压传感器制作的大气压强温度海拔高度测量仪含详细源代码.docx_第2页
第2页 / 共37页
基于bmp085气压传感器制作的大气压强温度海拔高度测量仪含详细源代码.docx_第3页
第3页 / 共37页
基于bmp085气压传感器制作的大气压强温度海拔高度测量仪含详细源代码.docx_第4页
第4页 / 共37页
基于bmp085气压传感器制作的大气压强温度海拔高度测量仪含详细源代码.docx_第5页
第5页 / 共37页
基于bmp085气压传感器制作的大气压强温度海拔高度测量仪含详细源代码.docx_第6页
第6页 / 共37页
基于bmp085气压传感器制作的大气压强温度海拔高度测量仪含详细源代码.docx_第7页
第7页 / 共37页
基于bmp085气压传感器制作的大气压强温度海拔高度测量仪含详细源代码.docx_第8页
第8页 / 共37页
基于bmp085气压传感器制作的大气压强温度海拔高度测量仪含详细源代码.docx_第9页
第9页 / 共37页
基于bmp085气压传感器制作的大气压强温度海拔高度测量仪含详细源代码.docx_第10页
第10页 / 共37页
基于bmp085气压传感器制作的大气压强温度海拔高度测量仪含详细源代码.docx_第11页
第11页 / 共37页
基于bmp085气压传感器制作的大气压强温度海拔高度测量仪含详细源代码.docx_第12页
第12页 / 共37页
基于bmp085气压传感器制作的大气压强温度海拔高度测量仪含详细源代码.docx_第13页
第13页 / 共37页
基于bmp085气压传感器制作的大气压强温度海拔高度测量仪含详细源代码.docx_第14页
第14页 / 共37页
基于bmp085气压传感器制作的大气压强温度海拔高度测量仪含详细源代码.docx_第15页
第15页 / 共37页
基于bmp085气压传感器制作的大气压强温度海拔高度测量仪含详细源代码.docx_第16页
第16页 / 共37页
基于bmp085气压传感器制作的大气压强温度海拔高度测量仪含详细源代码.docx_第17页
第17页 / 共37页
基于bmp085气压传感器制作的大气压强温度海拔高度测量仪含详细源代码.docx_第18页
第18页 / 共37页
基于bmp085气压传感器制作的大气压强温度海拔高度测量仪含详细源代码.docx_第19页
第19页 / 共37页
基于bmp085气压传感器制作的大气压强温度海拔高度测量仪含详细源代码.docx_第20页
第20页 / 共37页
亲,该文档总共37页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于bmp085气压传感器制作的大气压强温度海拔高度测量仪含详细源代码.docx

《基于bmp085气压传感器制作的大气压强温度海拔高度测量仪含详细源代码.docx》由会员分享,可在线阅读,更多相关《基于bmp085气压传感器制作的大气压强温度海拔高度测量仪含详细源代码.docx(37页珍藏版)》请在冰点文库上搜索。

基于bmp085气压传感器制作的大气压强温度海拔高度测量仪含详细源代码.docx

基于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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 成人教育 > 远程网络教育

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2