delay_year 发表于 2012-11-30 02:02:41

MSP430F149的BMP085大气压强传感器的移植...已成功,附测试驱动

本帖最后由 delay_year 于 2012-11-30 13:04 编辑

这个是从C51移植过来的,读出来的数据是错的,读出来的温度和压强一直的跳,而且有乱码,IIC是按照规格书写的,其它都没动过,有没有哪位高手驱动成功的啊,这IC的驱动搞了快一个月了,网上关于430的参考可以说根本没有,而且IC很难焊。。。风枪吹一下就坏了。。只能买模块了{:mad:} {:mad:}
有高手能不能给个430能用的驱动啊。。。开源,学习,非常感谢!!!{:dizzy:} {:dizzy:}

单片机使用的是MSP430F149,系统时钟配置成8MHz,用的显示器是NOKIA5110,用IAR编译,C51正常实测T在20度左右,P在100Kpa左右





-----------------------------------------------------------------分割线-------------------------------------------------------------------------------

最终还是IIC的问题!以下代码已调试成功!感谢大家的关注!虽然430板块不是很活跃。。。

单片机:MSP430F149
时钟配置:8MHz
显示器:LCD5110
#include<msp430x14x.H>          
#include<math.h>    //Keil library
#include "nokia_5110.c"
#include "nokia_5110.h"
#define   CPU_F ((double)8000000) //定义CPU主频大小
#define   delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))//延时Nus
#define   delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))//延时Nms
#define   uchar unsigned char
#define   uintunsigned int       

#define BMP085_IIC_IOinitP5DIR |= BIT5+BIT6; P5OUT |= BIT5+BIT6//端口初始化

#define BMP085_SCL_1   P5OUT |= BIT5
#define BMP085_SCL_0   P5OUT &= ~BIT5
#define BMP085_SCL_OUT   P5DIR |= BIT5    //SDA变回输出模式

#define BMP085_SDA_1   P5OUT |= BIT6
#define BMP085_SDA_0   P5OUT &= ~BIT6

#define BMP085_SDA_IN    P5DIR &= ~BIT6   //SDA改成输入模式
#define BMP085_SDA_OUT   P5DIR |= BIT6    //SDA变回输出模式
#define BMP085_SDA_VAL   P5IN&BIT6      //SDA的位值


#define   BMP085_SlaveAddress   0xee    //定义器件在IIC总线中的从地址
#define   OSS   0 // Oversampling Setting (note: code is not set up to use other OSS values)
       
uchar ge,shi,bai,qian,wan,shiwan;         //显示变量
intdis_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 conversion(long temp_data);
voidSingle_Write(uchar SlaveAddress,uchar REG_Address,uchar REG_data);   //单个写入数据
uchar Single_Read(uchar REG_Address);                                    //单个读取内部寄存器数据
voidMultiple_Read(uchar,uchar);                                          //连续的读取内部寄存器数据
//------------------------------------
void BMP085_Start();
void BMP085_Stop();
void BMP085_SendACK(unsigned char ack);
unsigned charBMP085_RecvACK();
void BMP085_SendByte(unsigned int dat);
unsigned int BMP085_RecvByte();
void BMP085_ReadPage();
void BMP085_WritePage();
//-----------------------------------

/*******************************************
函数名称:delay_15us
功    能:延时约15us的时间
********************************************/
void delay_15us(void)
{
    //uchar i;
    //for(i = 0;i < 5;i++)
    //_NOP();
    delay_us(5);
}

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;        
}

/**************************************
起始信号
**************************************/
void BMP085_Start()
{   
    BMP085_SCL_OUT;
    BMP085_SDA_OUT;
   
    BMP085_SCL_1;
    BMP085_SDA_1;
    delay_15us();
    BMP085_SDA_0;
    delay_15us();
    BMP085_SCL_0;
    delay_15us();
}
/**************************************
停止信号
**************************************/
void BMP085_Stop()
{
    BMP085_SDA_OUT;
    BMP085_SCL_OUT;
   
    BMP085_SDA_0;
    delay_15us();
    BMP085_SCL_1;
    delay_15us();
    BMP085_SDA_1;
    delay_15us();
    delay_15us();       
    //delay_15us();       
    //delay_15us();
}
/*******************************************
函数名称:mack
功    能:完成IIC 应答操作
********************************************/
void Sendack(void)
{
    BMP085_SDA_OUT;
    BMP085_SCL_OUT;
   
    BMP085_SDA_0;
    _NOP(); _NOP();
    BMP085_SCL_1;
    delay_15us();
    BMP085_SCL_0;
    _NOP();_NOP();
    BMP085_SDA_1;   
    delay_15us();
}
/*******************************************
函数名称:mnack
功    能:完成IIC 无应答操作
********************************************/
void Sendnack(void)
{
    BMP085_SDA_OUT;
    BMP085_SCL_OUT;
   
    BMP085_SDA_1;
    _NOP(); _NOP();
    BMP085_SCL_1;
    delay_15us();
    BMP085_SCL_0;
    _NOP(); _NOP();
    BMP085_SDA_0;   
    delay_15us();      
}
/**************************************
接收应答信号
**************************************/
unsigned char BMP085_RecvACK()
{
    uchar slaveack;
   
    BMP085_SDA_OUT;
    BMP085_SCL_OUT;
   
    BMP085_SDA_1;
    _NOP(); _NOP();
    BMP085_SCL_1;
    _NOP(); _NOP();
    BMP085_SDA_IN;
    _NOP(); _NOP();
    slaveack = BMP085_SDA_VAL;   //读入SDA数值
    BMP085_SCL_0;
    delay_15us();
    BMP085_SDA_OUT;
    if(slaveack)    return 0;
    else            return 1;
}
/*******************************************
函数名称:write1
功    能:向IIC总线发送一个1
********************************************/
void write1(void)
{
    BMP085_SDA_OUT;
    BMP085_SCL_OUT;
   
    BMP085_SDA_1;
    delay_15us();
    BMP085_SCL_1;
    delay_15us();
    BMP085_SCL_0;                               
    delay_15us();
}
/*******************************************
函数名称:write0
功    能:向IIC总线发送一个0
********************************************/
void write0(void)
{
    BMP085_SDA_OUT;
    BMP085_SCL_OUT;
   
    BMP085_SDA_0;
    delay_15us();
    BMP085_SCL_1;
    delay_15us();                       
    BMP085_SCL_0;                               
    delay_15us();
}
/**************************************
向IIC总线发送一个字节数据
**************************************/
void BMP085_SendByte(unsigned int dat)
{
    uchar i;
    for(i = 8;i > 0;i--)
    {
      if(dat & 0x80)write1();
      else write0();
      dat <<= 1;
    }
    BMP085_SDA_1;
    _NOP();
    BMP085_RecvACK();
}
/**************************************
从IIC总线接收一个字节数据
**************************************/
unsigned int BMP085_RecvByte()
{
    uchar rdata = 0x00,i;
    uchar flag;
    for(i = 0;i < 8;i++)
    {
      BMP085_SDA_1;
      delay_15us();
      BMP085_SCL_1;
      BMP085_SDA_IN;
      delay_15us();
      flag = BMP085_SDA_VAL;
      rdata <<= 1;
      if(flag)rdata |= 0x01;
      BMP085_SDA_OUT;
      BMP085_SCL_0;
      delay_15us();
    }
    return rdata;
}
//*********************************************************
//读出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存储
    Sendack();                     //回应ACK
    lsb = BMP085_RecvByte();   
    Sendnack();                     //最后一个数据需要回NOACK

    BMP085_Stop();                           //停止信号
    delay_ms(5);
    _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_ms(4);        // 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_ms(4);                              // max time is 4.5ms
    pressure = Multiple_read(0xF6);
    pressure &= 0x0000FFFF;
    return pressure;       
    //return (long) bmp085ReadShort(0xF6);
}
void Init_BMP085()   //初始化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()
{
    long ut;
    long up;
    long x1, x2, b5, b6, x3, b3, p;
    unsigned long b4, b7;
    longtemperature;
    longpressure;
   
    ut = bmp085ReadTemp();
    ut = bmp085ReadTemp();           // 读取温度
    up = bmp085ReadPressure();
    up = bmp085ReadPressure();// 读取压强
   
    x1 = ((long)ut - ac6) * ac5 >> 15;
    x2 = ((long) mc << 11) / (x1 + md);
    b5 = x1 + x2;
    temperature = (b5 + 8) >> 4;
    //*************
   
    conversion(temperature);
    LCD_set_XY(0,1);
    LCD_write_char('T');       //温度显示
    LCD_write_char(':');
    LCD_write_char(bai);      
    LCD_write_char(shi);
    LCD_write_char('.');
    LCD_write_char(ge);
    LCD_write_char('C');
    //*************
   
    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 * (unsigned long) (x3 + 32768)) >> 15;
    b7 = ((unsigned long) up - b3) * (50000 >> OSS);
    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);
   
    conversion(pressure);
    LCD_set_XY(0,2);
    LCD_write_char('P');    //显示压强
    LCD_write_char(':');
    LCD_write_char(shiwan);
    LCD_write_char(wan);   
    LCD_write_char(qian);
    LCD_write_char('.');
    LCD_write_char(bai);
    LCD_write_char(shi);
    LCD_write_char('K');   //气压单位
    LCD_write_char('p');
    LCD_write_char('a');
}
//**********************************************//
//            系统时钟初始化
//**********************************************//
void InitSys()
{
   unsigned int iq0;
   _DINT();
   BCSCTL1 &=~XT2OFF;   //打开TX振荡器
   BCSCTL2 |=SELM1+SELS;//MCLK为8MHz,SMCLK为1MHz
   do
   {
      IFG1 &= ~OFIFG;                      // 清除振荡器失效标志
      for(iq0 = 0xFF; iq0 > 0; iq0--);          // 延时,等待XT2起振
   }
   while ((IFG1 & OFIFG) != 0);                      // 判断XT2是否起振               
   //BCSCTL2 =SELM0+SELS;                      //MCLK,SMCLK时钟为XT2
   IFG1 &= ~OFIFG;                      // 清除振荡器失效标志
}
void main()
{
    WDTCTL = WDTPW + WDTHOLD;
    InitSys();
    BMP085_IIC_IOinit;
    delay_ms(50);                         //上电延时
    Init_BMP085();                //初始化BMP085
    LCD_init();
   
    while(1)                         //循环
    {
      bmp085Convert();
      delay_ms(1000);
    }
}



qiuchen 发表于 2012-11-30 10:46:59

1、以前在C51上运行没问题吗?
2、看你是模拟的IIC,把速度降下来怎么样?
3、用示波器看看波形。

delay_year 发表于 2012-11-30 11:23:54

qiuchen 发表于 2012-11-30 10:46 static/image/common/back.gif
1、以前在C51上运行没问题吗?
2、看你是模拟的IIC,把速度降下来怎么样?
3、用示波器看看波形。 ...

1、在C51上是没有问题的 用的是AT89S52   12MHz
2、是用模拟的IIC,试过配置成1MHz的和32.768KHz的,要么数据在跳,要么数据固定不跳不动
3、同样的IIC我参考了另外一个传感器的驱动的,同样是用IIC的,但是那个传感器却能用了,是磁阻传感器。

附C51的BMP085能用的代码:
//***************************************
// BMP085 IIC测试程序
// 使用单片机STC89C51
// 晶振:11.0592M
// 显示:LCD1602
// 编译环境 Keil uVision2
// 参考宏晶网站24c04通信程序
// 时间:2011年7月1日
//****************************************
#include<REG51.H>          
#include<math.h>    //Keil library
#include<stdlib.h>//Keil library
#include<stdio.h>   //Keil library       
#include<INTRINS.H> //Keil library
#define   uchar unsigned char
#define   uint unsigned int       
#define   DataPort P2    //LCD1602数据端口
sbit          SCL=P1^1;      //IIC时钟引脚定义
sbit           SDA=P1^0;      //IIC数据引脚定义
sbit      LCM_RS=P0^5;   //LCD1602命令端口               
sbit      LCM_RW=P0^6;   //LCD1602命令端口               
sbit      LCM_EN=P0^7;   //LCD1602命令端口

#define        BMP085_SlaveAddress   0xee          //定义器件在IIC总线中的从地址                              

#define OSS 0        // Oversampling Setting (note: code is not set up to use other OSS values)
                                                          
typedef unsigned charBYTE;
typedef unsigned short WORD;
          
uchar ge,shi,bai,qian,wan,shiwan;         //显示变量
intdis_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 delay(unsigned int k);
void InitLcd();                            //初始化lcd1602

void WriteDataLCM(uchar dataW);
void WriteCommandLCM(uchar CMD,uchar Attribc);
void DisplayOneChar(uchar X,uchar Y,uchar DData);
void conversion(long temp_data);

voidSingle_Write(uchar SlaveAddress,uchar REG_Address,uchar REG_data);   //单个写入数据
uchar Single_Read(uchar REG_Address);                                    //单个读取内部寄存器数据
voidMultiple_Read(uchar,uchar);                                          //连续的读取内部寄存器数据
//------------------------------------
void Delay5us();
void Delay5ms();
void BMP085_Start();
void BMP085_Stop();
void BMP085_SendACK(bit ack);
bitBMP085_RecvACK();
void BMP085_SendByte(BYTE dat);
BYTE BMP085_RecvByte();
void BMP085_ReadPage();
void BMP085_WritePage();
//-----------------------------------

//*********************************************************
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;        
}

/*******************************/
void delay(unsigned int k)       
{                                               
unsigned int i,j;                               
for(i=0;i<k;i++)
{                       
for(j=0;j<121;j++)                       
{;}}                                               
}
/*******************************/
void WaitForEnable(void)       
{                                       
DataPort=0xff;               
LCM_RS=0;LCM_RW=1;_nop_();
LCM_EN=1;_nop_();_nop_();
while(DataPort&0x80);       
LCM_EN=0;                               
}                                       
/*******************************/
void WriteCommandLCM(uchar CMD,uchar Attribc)
{                                       
if(Attribc)WaitForEnable();       
LCM_RS=0;LCM_RW=0;_nop_();
DataPort=CMD;_nop_();       
LCM_EN=1;_nop_();_nop_();LCM_EN=0;
}                                       
/*******************************/
void WriteDataLCM(uchar dataW)
{                                       
WaitForEnable();               
LCM_RS=1;LCM_RW=0;_nop_();
DataPort=dataW;_nop_();       
LCM_EN=1;_nop_();_nop_();LCM_EN=0;
}               
/***********************************/
void InitLcd()                               
{                       
WriteCommandLCM(0x38,1);       
WriteCommandLCM(0x08,1);       
WriteCommandLCM(0x01,1);       
WriteCommandLCM(0x06,1);       
WriteCommandLCM(0x0c,1);
}                       
/***********************************/
void DisplayOneChar(uchar X,uchar Y,uchar DData)
{                                               
    Y&=1;                                               
    X&=15;                                               
    if(Y)X|=0x40;                                       
    X|=0x80;                       
    WriteCommandLCM(X,0);               
    WriteDataLCM(DData);               
}                                               

/**************************************
延时5微秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数,注意时钟过快时需要修改
当改用1T的MCU时,请调整此延时函数
**************************************/
void Delay5us()
{
    _nop_();_nop_();_nop_();_nop_();
    _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
}

/**************************************
延时5毫秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数
当改用1T的MCU时,请调整此延时函数
**************************************/
void Delay5ms()
{
    WORD n = 560;
    while (n--);
}

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

/**************************************
停止信号
**************************************/
void BMP085_Stop()
{
      SDA = 0;                  //拉低数据线
    SCL = 1;                  //拉高时钟线
    Delay5us();               //延时
    SDA = 1;                  //产生上升沿
    Delay5us();               //延时
}

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

/**************************************
接收应答信号
**************************************/
bit BMP085_RecvACK()
{
      SCL = 1;                  //拉高时钟线
    Delay5us();               //延时
    CY = SDA;                   //读应答信号
    SCL = 0;                  //拉低时钟线
    Delay5us();               //延时

    return CY;
}

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

    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;

    SDA = 1;                  //使能内部上拉,准备读取数据,
    for (i=0; i<8; i++)         //8位计数器
    {
            dat <<= 1;
            SCL = 1;                //拉高时钟线
      Delay5us();             //延时
      dat |= SDA;             //读数据               
      SCL = 0;                //拉低时钟线
      Delay5us();             //延时
    }
    return dat;
}
/*
//单字节写入BMP085内部数据*******************************

void Single_Write(uchar SlaveAddress,uchar REG_Address,uchar REG_data)
{
      BMP085_Start();                  //起始信号
    BMP085_SendByte(SlaveAddress);   //发送设备地址+写信号
    BMP085_SendByte(REG_Address);    //内部寄存器地址
    BMP085_SendByte(REG_data);       //内部寄存器数据
    BMP085_Stop();                   //发送停止信号
}
*/
/*
//单字节读取BMP085内部数据********************************
uchar Single_Read(uchar REG_Address)
{
      uchar REG_data;
      BMP085_Start();                        //起始信号
    BMP085_SendByte(BMP085_SlaveAddress);         //发送设备地址+写信号
    BMP085_SendByte(REG_Address);            //发送存储单元地址       
    BMP085_Start();                        //起始信号
    BMP085_SendByte(BMP085_SlaveAddress+1);         //发送设备地址+读信号
    REG_data=BMP085_RecvByte();            //读出寄存器数据
    BMP085_SendACK(1);   
      BMP085_Stop();                           //停止信号
    return REG_data;
}
*/
//*********************************************************
//读出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存储
    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(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(10);                              // max time is 4.5ms
       
   pressure = Multiple_read(0xF6);
      pressure &= 0x0000FFFF;
       
       return pressure;       
      //return (long) bmp085ReadShort(0xF6);
}

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

//初始化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()
{
        long ut;
        long up;
        long x1, x2, b5, b6, x3, b3, p;
        unsigned long b4, b7;
        longtemperature;
        longpressure;
       
        ut = bmp085ReadTemp();
        ut = bmp085ReadTemp();           // 读取温度
        up = bmp085ReadPressure();
        up = bmp085ReadPressure();// 读取压强
       
        x1 = ((long)ut - ac6) * 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;
        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 * (unsigned long) (x3 + 32768)) >> 15;
        b7 = ((unsigned long) up - b3) * (50000 >> OSS);
        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);

       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 main()
{
      delay(50);                         //上电延时               
    InitLcd();                     //液晶初始化
    Init_BMP085();                //初始化BMP085
while(1)                         //循环
{
         bmp085Convert();
         delay(1000);
}
}

qiuchen 发表于 2012-11-30 11:48:47

感觉是不同的传感器IIC的时序可能有点小差别,建议看手册对照一下。

honami520 发表于 2012-11-30 11:51:41

这个芯片焊接完了后不能用洗板水洗,一洗就坏!我当初搞的时候坏了好几个!这个程序好搞的!肯定是你移植没移植好!仿真调试吧!不过这个芯片不怎么准!

delay_year 发表于 2012-11-30 12:03:31

honami520 发表于 2012-11-30 11:51 static/image/common/back.gif
这个芯片焊接完了后不能用洗板水洗,一洗就坏!我当初搞的时候坏了好几个!这个程序好搞的!肯定是你移植没 ...

貌似焊完了直接就没能用过。。。放了些助焊剂。。上面有个小孔,风枪焊的时候不用做什么准备工作么?同样的5883也是非常难焊,焊上直接就挂了。。

所以为了调试直接买了个成品模块。。。

求085的参考驱动啊。。。真心不知道问题出在哪。。{:dizzy:}

Arthur244 发表于 2013-12-6 21:47:18

同求呃呃呃,,,一样为这个芯片在苦逼

Zenmvol 发表于 2014-8-26 20:51:48

写一版在mega 16 上的啊?

liyo2012 发表于 2024-2-20 22:54:19

Arthur244 发表于 2013-12-6 21:47
同求呃呃呃,,,一样为这个芯片在苦逼
(引用自7楼)

搞好没?10年后,我又遇到这个芯片,海拔高度转换不对,,
页: [1]
查看完整版本: MSP430F149的BMP085大气压强传感器的移植...已成功,附测试驱动