BMP180气压传感器调试

</pre><p>BMP180气压传感器具有体积小,功耗低等优点,因为广泛的被应用于手机,手表等小型编写式设计,在淘宝上看到有现成的模块,就买了一个玩玩,目的是想将它和CC2540组合,做一个电子气压计,并通过蓝牙传送到手机。下面为BMP180在CC2540上的测试程序。</p><p></p><p></p><pre name="code" class="cpp"><span style="font-family: Arial, Helvetica, sans-serif;">#include<ioCC2540.h></span>
#include "bmp180.h"
//#include "bmpi2c.h"

#include  <math.h>    //Keil library
#include  <stdlib.h>  //Keil library
#include  <stdio.h>   //Keil library

#define   uchar unsigned char
#define   uint unsigned int

#define BMP085_SlaveAddress   0xee  //定义器件在IIC总线中的从地址
#define OSS 0// Oversampling Setting (note: code is not set up to use other OSS values)

typedef unsigned char  BYTE;
typedef unsigned short WORD;

long  temperature = 8;//温度值
long  pressure = 8;//压力值
long  height = 8;//相对海拔高度值

//uchar ge,shi,bai,qian,wan,shiwan;           //显示变量
int  dis_data;                              //变量

short ac1;
short ac2;
short ac3;
unsigned short ac4;
unsigned short ac5;
unsigned short ac6;
short b1;
short b2;
short mb;
short mc;
short md;

void Delay5us()
{
  unsigned int i,j;
  for(i=0;i<5;i++)
    for(j=0;j<50;j++);
  return;
}

void Delay_1ms(unsigned char msDelay)
{
  unsigned int i,j;
  for(i=0;i<msDelay;i++)
    for(j=0;j<5;j++);
  return;
}
/**************************************
延时5毫秒([email protected])
不同的工作环境,需要调整此函数
当改用1T的MCU时,请调整此延时函数
**************************************/
void Delay5ms()
{

    WORD n = 25;

    while (n--);

}

/**************************************
起始信号
**************************************/
void BMP085_Start()
{
    P1DIR |= 0X01;
    SDA=1;                    //拉高数据线
    SCL=1;                    //拉高时钟线
    Delay5us();                 //延时
    SDA=0;                    //产生下降沿
    Delay5us();                 //延时
    SCL = 0;                    //拉低时钟线

}

/**************************************
停止信号
**************************************/
void BMP085_Stop()
{
    P1DIR |= 0X01;

    SDA = 0;                    //拉低数据线
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    SDA = 1;                    //产生上升沿
    Delay5us();                 //延时

}

/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
void BMP085_SendACK(unsigned char ack)
{
    P1DIR |= 0X01;
    SDA = ack;                  //写应答信号
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    SCL = 0;                    //拉低时钟线
    Delay5us();                 //延时

}

/**************************************
接收应答信号
**************************************/
unsigned char BMP085_RecvACK()
{
    P1DIR &= 0XFE; //input

    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    CY = SDA;                   //读应答信号
    SCL = 0;                    //拉低时钟线
    Delay5us();                 //延时

    return CY;

}

/**************************************
向IIC总线发送一个字节数据
**************************************/
void BMP085_SendByte(BYTE dat)
{

    BYTE i;

    P1DIR |= 0X01;

    for (i=0; i<8; i++)         //8位计数器
    {

        dat <<= 1;              //移出数据的最高位
        SDA = CY;               //送数据口
        SCL = 1;                //拉高时钟线
        Delay5us();             //延时
        SCL = 0;                //拉低时钟线
        Delay5us();             //延时

}
    BMP085_RecvACK();

}

/**************************************
从IIC总线接收一个字节数据
**************************************/
BYTE BMP085_RecvByte()
{

    BYTE i;
    BYTE dat = 0;

    P1DIR &= 0XFE; //input

    //SDA = 1;                    //使能内部上拉,准备读取数据,
    for (i=0; i<8; i++)         //8位计数器
    {

        dat <<= 1;
        SCL = 1;                //拉高时钟线
        Delay5us();             //延时
        dat |= SDA;             //读数据
        SCL = 0;                //拉低时钟线
        Delay5us();             //延时

}
    return dat;

}

//*********************************************************
//读出BMP085内部数据,连续两个
//*********************************************************
short Multiple_read(uchar ST_Address)
{

uchar msb, lsb;
short _data;
    BMP085_Start();                          //起始信号
    BMP085_SendByte(BMP085_SlaveAddress);    //发送设备地址+写信号
    BMP085_SendByte(ST_Address);             //发送存储单元地址
    BMP085_Start();                          //起始信号
    BMP085_SendByte(BMP085_SlaveAddress+1);         //发送设备地址+读信号

    msb = BMP085_RecvByte();                 //BUF[0]存储
    BMP085_SendACK(0);                       //回应ACK
    lsb = BMP085_RecvByte();
BMP085_SendACK(1);                       //最后一个数据需要回NOACK

    BMP085_Stop();                           //停止信号
    Delay5ms();
    _data = msb << 8;
_data |= lsb;
return _data;

}
//********************************************************************
long bmp085ReadTemp(void)
{

    BMP085_Start();                  //起始信号
    BMP085_SendByte(BMP085_SlaveAddress);   //发送设备地址+写信号
    BMP085_SendByte(0xF4);          // write register address
    BMP085_SendByte(0x2E);       // write register data for temp
    BMP085_Stop();                   //发送停止信号
Delay_1ms(10);// max time is 4.5ms

return (long) Multiple_read(0xF6);

}
//*************************************************************
long bmp085ReadPressure(void)
{

long pressure = 0;

    BMP085_Start();                   //起始信号
    BMP085_SendByte(BMP085_SlaveAddress);   //发送设备地址+写信号
    BMP085_SendByte(0xF4);          // write register address
    BMP085_SendByte(0x34);         // write register data for pressure
    BMP085_Stop();                    //发送停止信号
Delay_1ms(10);                      // max time is 4.5ms

pressure = Multiple_read(0xf6);//F6 to d0 for test
pressure &= 0x0000FFFF;

return pressure;

}

//void conversion(long temp_data)
//{

//
//    shiwan=temp_data/100000+0x30 ;
//    temp_data=temp_data%100000;   //取余运算
//    wan=temp_data/10000+0x30 ;
//    temp_data=temp_data%10000;   //取余运算
//qian=temp_data/1000+0x30 ;
//    temp_data=temp_data%1000;    //取余运算
//    bai=temp_data/100+0x30   ;
//    temp_data=temp_data%100;     //取余运算
//    shi=temp_data/10+0x30    ;
//    temp_data=temp_data%10;      //取余运算
//    ge=temp_data+0x30;
//

///**************************************
//延时5微秒([email protected])
//不同的工作环境,需要调整此函数,注意时钟过快时需要修改
//当改用1T的MCU时,请调整此延时函数
//**************************************/
//void Delay5us()
//{

//    _nop_();_nop_();_nop_();_nop_();
//    _nop_();_nop_();_nop_();_nop_();
//_nop_();_nop_();_nop_();_nop_();
//_nop_();_nop_();_nop_();_nop_();
//_nop_();_nop_();_nop_();_nop_();
//_nop_();_nop_();_nop_();_nop_();
//

//**************************************************************

//初始化BMP085,根据需要请参考pdf进行修改**************
void Init_BMP085()
{

ac1 = Multiple_read(0xAA);
ac2 = Multiple_read(0xAC);
ac3 = Multiple_read(0xAE);
ac4 = Multiple_read(0xB0);
ac5 = Multiple_read(0xB2);
ac6 = Multiple_read(0xB4);
b1 =  Multiple_read(0xB6);
b2 =  Multiple_read(0xB8);
mb =  Multiple_read(0xBA);
mc =  Multiple_read(0xBC);
md =  Multiple_read(0xBE);

}
//***********************************************************************
void bmp085Convert()
{

unsigned int ut;
unsigned long up;
long x1, x2, b5, b6, x3, b3, p;
unsigned long b4, b7;

ut = bmp085ReadTemp();   // 读取温度
//ut = bmp085ReadTemp();   // 读取温度
up = bmp085ReadPressure();  // 读取压强
//up = bmp085ReadPressure();  // 读取压强
x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
x2 = ((long) mc << 11) / (x1 + md);
b5 = x1 + x2;
 temperature = ((b5 + 8) >> 4);
// conversion(temperature);
// DisplayOneChar(4,0,'T');       //温度显示
//     DisplayOneChar(5,0,':');
//     DisplayOneChar(7,0,bai);
//     DisplayOneChar(8,0,shi);
//     DisplayOneChar(9,0,'.');
// DisplayOneChar(10,0,ge);
// DisplayOneChar(11,0,0XDF);     //温度单位
// DisplayOneChar(12,0,'C');

  b6 = b5 - 4000;
  // Calculate B3
  x1 = (b2 * (b6 * b6)>>12)>>11;
  x2 = (ac2 * b6)>>11;
  x3 = x1 + x2;
  b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;

  // Calculate B4
  x1 = (ac3 * b6)>>13;
  x2 = (b1 * ((b6 * b6)>>12))>>16;
  x3 = ((x1 + x2) + 2)>>2;
  b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;

  b7 = ((unsigned long)(up - b3) * (50000>>OSS));
  if (b7 < 0x80000000)
    p = (b7<<1)/b4;
  else
    p = (b7/b4)<<1;

  x1 = (p>>8) * (p>>8);
  x1 = (x1 * 3038)>>16;
  x2 = (-7357 * p)>>16;
 pressure = p+((x1 + x2 + 3791)>>4);

//height=(101325-pressure)*9;
 height = 44330-4961*pow(pressure, 0.19);

// conversion(pressure);
//     DisplayOneChar(4,1,'P');    //显示压强
//     DisplayOneChar(5,1,':');
// DisplayOneChar(6,1,shiwan);
// DisplayOneChar(7,1,wan);
//     DisplayOneChar(8,1,qian);
//     DisplayOneChar(9,1,'.');
//     DisplayOneChar(10,1,bai);
//     DisplayOneChar(11,1,shi);
// DisplayOneChar(12,1,'K');   //气压单位
// DisplayOneChar(13,1,'p');
// DisplayOneChar(14,1,'a');

}
 /*
void OLED_BMP180()
{

Init_BMP085();
bmp085Convert();
LCD_P8x16Str(20,3,"H:");
OLCD_P8x16(36,3,height/10000);
OLCD_P8x16(44,3,height%10000/1000);
OLCD_P8x16(52,3,height%1000/100);
//OLCD_P8x16(60,3,height%100/10);
LCD_P8x16Str(60,3,"M");

LCD_P8x16Str(20,5,"P:");
OLCD_P8x16(36,5,pressure/100000);
OLCD_P8x16(44,5,pressure%100000/10000);
OLCD_P8x16(52,5,pressure%10000/1000);
LCD_P8x16Str(60,5,".");
OLCD_P8x16(68,5,pressure%1000/100);
LCD_P8x16Str(76,5,"Kpa");

LCD_P8x16Str(20,1,"T:");
OLCD_P8x16(36,1,temperature/100);
OLCD_P8x16(44,1,temperature%100/10);
LCD_P8x16Str(52,1,".");
OLCD_P8x16(60,1,temperature%10);
LCD_P8x16Str(68,1,"'C");

}*/

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 07:25:58

BMP180气压传感器调试的相关文章

张高兴的 Windows 10 IoT 开发笔记:BMP180 气压传感器

注意:海拔高度仅供参考 GitHub : https://github.com/ZhangGaoxing/windows-iot-demo/tree/master/BMP180Demo

Arduino I2C + 气压传感器LPS25H

LPS25H是ST生产的MEMS数字气压传感器,一些文档里也叫LPS331AP.主要特性有: 测量范围:260 ~ 1260 hPa绝对气压 分辨率:均方根1 Pa 工作电压:1.7 ~ 3.6 V 功耗:4μA(低分辨率模式)~25μA(高分辨率模式) 数据刷新频率:1 ~ 25 Hz可选择 接口:I2C,三线制/四线制SPI 内置温度补偿 内置24位ADC 内置先入先出(FIFO)存储器 封装:2.5 x 2.5 x 1.0 mm HCLGA-10L 管脚定义 VDD:电源,1.7~3.6V

APM四轴组装调试记录

我们计划周末下几个周末野外吃火锅,并且进行航拍,吃着火锅开着飞机唱着歌.这里就组装一台可以航拍的四轴飞行器做一个记录: 阿木社区 http://www.amovauto.com/?p=631 QQ群:526221258 器件选择机架:因为450的机架携带不方便,而250的穿越机太小不方便采用运动相机,所以我们采用一体成型的机架,外观是经典的大疆精灵2 ,如果要说是山寨精灵2,那我也没有办法,F450机架电线裸露在外面实在受不了,打算好好上漆喷涂,做一个帅气的四轴.如图: 图1.1 经典外壳套件

Linux下GDB调试与对拍(先挖个坑)

应为NOIP要复赛在NOI-Linux下编写程序,所以被迫选择Vim+Gdb(主要是Guide太丑了). 虽然GUIDE的调试功能已经对付大多数的调试,反正学一学GDB的使用也没什么坏处. 1 生成调试信息 要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中.使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点.如: gcc -g hello.c -o hello g++ -g hello.cpp -o hello 如果没有-g,你将看不见程序的函数名.变量名,

微信开发之本地接口调试(非80端口,无需上传服务器服务器访问

前言: 本文是总结在开发微信接口时,为方便开发所采取的一些快捷步骤,已节省开发人员难度开发时间从而提高开发效率. 本地测试: (提醒,在本地模拟微信get或post数据时先将校验参数注释掉) 利用微信模拟器weixinPost进行模拟发送xml数据 由于这个软件是微信没公开高级接口时公布的,所以对于高级接口的调试,笔者利用的是Fiddler这个抓包工具模拟post数据 高端测试: 利用反向代理软件ngrok访问本地项目: ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之

PHPStorm调试PHP代码~实际操作+mark~~

因为wamp自己已经下载了xdebug,只要配置开启就行了. 1. 配置php.ini(有就打开注释,没有就加上) XDEBUG Extension[xdebug]zend_extension ="D:/wamp64/bin/php/php5.6.25/zend_ext/php_xdebug-2.4.1-5.6-vc11-x86_64.dll"xdebug.remote_enable = 1;远程主机xdebug.remote_host = localhost;主机端口xdebug.r

Tomcat配置远程调试端口(windows、Linux)

当我们需要定位生产环境问题,而日志又不清晰的情况下,我们可以借助Tomcat提供的远程调试,设置如下: // Linxu系统: apach/bin/startup.sh开始处中增加如下内容: declare -x CATALINA_OPTS="-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8081" // Windows系统:

Android APP 调试过程中遇到的问题。

调试过过程中APP安装完启动后有的时候会异常退出,报这个错误.有的时候可以直接启动.查找不到原因.网上说把commit方法替换成commitAllowingStateLoss() 也无效. Android APP 调试过程中遇到的问题. >> android 这个答案描述的挺清楚的:http://www.goodpm.net/postreply/android/1010000007192169/AndroidAPP调试过程中遇到的问题.html

Linux-hexdump命令调试event驱动—详解(13)

hexdump: 查看文件的内容,比如二进制文件中包含的某些字符串,通常用来调试驱动用 1.调试 键盘驱动 讲解 当我们insmod挂载了键盘驱动后,找到键盘驱动被放在event1设备里, 此时没有按键按下,所以event1里面的数据是没有的,那么数据又是从来哪里来? 通过键盘驱动的read函数,若有按键按下,就会上传按键数据给用户层,此时的用户层就是hexdump 因为键盘驱动的input_handler 是:evdev_handler 所以键盘驱动的read函数是: evdev_handle