找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1396|回复: 1
打印 上一主题 下一主题
收起左侧

基于stc15f2k60s2+bmp180气压计,不能正常读取bmp数据 求帮助

[复制链接]
跳转到指定楼层
楼主
ID:476973 发表于 2019-3-8 20:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
10黑币
#include "REG51.h"
#include "oled.h"
#include "bmp.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        


sbit          SCL=P3^6;      //IIC??????
sbit           SDA=P3^7;      //IIC??????




#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  pressure;           
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 delay(unsigned int k);




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


void  Single_Write(uchar SlaveAddress,uchar REG_Address,uchar REG_data);   //??????
uchar Single_Read(uchar REG_Address);                                      //???????????
void  Multiple_Read(uchar,uchar);                                          //????????????
//------------------------------------
void Delay5us();
void Delay5ms();
void BMP085_Start();
void BMP085_Stop();
void BMP085_SendACK(bit ack);
bit  BMP085_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++)                        
{;}}                                                
}
/*******************************/
                                
/*******************************/


        






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

    延时5毫秒(STC90C52RC@12M)
    不同的工作环境,需要调整此函
    当改用1T的MCU时,请调整此延时函数

**************************************/
void Delay5us()
{
   


      unsigned char i;

      _nop_();
       i = 11;
        while (--i);


}
/**************************************
??5??(STC90C52RC@12M)
???????,???????
???1T?MCU?,????????
**************************************/
void Delay5ms()                //@11.0592MHz
{
        unsigned char i, j;


        i = 54;
        j = 199;
        do
        {
                while (--j);
        } while (--i);
}




/**************************************
????
**************************************/
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[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(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
        Delay3ms();
        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;
        long  temperature;


        
        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;


         


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


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123289 发表于 2019-3-9 09:27 | 只看该作者
再仔细深入地研读“bmp180气压计”手册
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表