使用F103C通过I2C读取BMP180 数据,初始化无法通过

2019-08-13 21:14发布

#include "led.h"
#include "tsensor.h"
#include "oled.h"
#include "myiic.h"
#include "BMP180.h"
#include "math.h"
#include "12864.h"
//ALIENTEK Mini STM32¿a·¢°å·¶ày′úÂë16
//Äú2¿Î¶è′«¸DÆ÷êμÑé  
//¼¼êõÖ§3Ö£owww.openedv.com
//1ãÖYêDDÇòíμç×ó¿Æ¼¼óDÏT1«Ë¾
int main(void)
{
        //u16 adcx;
        //float temp;
        //float temperate;
    extern long   result_UT;
    extern long  result_UP;       
    float altitude;          
         
        delay_init();                     //Ñóê±oˉêy3õê¼»ˉ          
        uart_init(9600);                 //′®¿ú3õê¼»ˉÎa9600
        LED_Init();                                  //3õê¼»ˉóëLEDᬽóμÄó2¼t½ó¿ú
        T_Adc_Init();                                  //ADC3õê¼»ˉ            
    OLED_Init();                        //3õê¼»ˉOLED
    IIC_Init();                    //3õê¼»ˉ iic
        Init_12864();                        //3õê¼»ˉ12864
          
    Init_BMP180();        //3õê¼»ˉbmp180
                 
    OLED_ShowString(20,0,"JinAn / P ,m ,`C",12);  //45,0êÇ45áD0DD¿aê¼£¬12 ′ú±í×Öìå′óD¡£¬24,12,16 èyÖD′óD¡  
        OLED_ShowString(0,12,"Air Pressure:",12);  
        OLED_ShowString(0,32,"Altitude:",12);
    OLED_ShowString(0,52,"Temperature:",12);       
                                                              //  D¡êyμãÇ°oó       OLED_ShowString(77,12,"1010",12);   
                                                              //                 OLED_ShowString(106,12,"96",12);
                                                             //OLED_ShowString(100,12,".",12);
                                                              //OLED_ShowString(100,32,".",12);
        OLED_ShowString(100,52,".",12);
        OLED_Refresh_Gram();//¸üDÂÏÔê¾μ½OLED                                             
        while(1)
        {
                //adcx=T_Get_Adc_Average(ADC_CH_TEMP,10);
                //temp=(float)adcx*(3.3/4096);
                //temperate=temp;                              //±£′æζè′«¸DÆ÷μÄμçÑ1Öμ
                //adcx=temp;                                         //
                //temp-=(u8)temp;                                                            //¼õμôÕûêy2¿·Ö               
                //temperate=(1.43-temperate)/0.0043+25;                //¼ÆËã3öμ±Ç°Î¶èÖμ                
                //OLED_ShowNum(77,52,(u8)temperate,4,12);        ///////////////////////////////////////////////////////ζèÕûêy
                //temperate-=(u8)temperate;               
                //OLED_ShowNum(106,52,temperate*100,2,12);  //ζèD¡êy2¿·Ö               
                bmp180Convert();
               
                OLED_ShowNum(77,12,result_UP,7,12);                                    //ÏÔê¾ÆøÑ1.....................................
                if(result_UP<80000)LED0=0;                                          //ìí&#188;ó±¨&#190;ˉ &#198;&#248;&#209;11yμíê±oò &#184;&#223;&#212;-μ&#216;&#199;&#248;&#198;&#248;&#209;1μíóú600mmhg£&#172;&#182;&#248;1mmhg=133.3p&#161;£&#203;ùò&#212;&#206;a80000p
                altitude=44330.0*(1-pow((float)result_UP/101325,1/5.255));            //&#188;&#198;&#203;&#227;&#184;&#223;&#182;è
                OLED_ShowNum(77,32,altitude,4,12);                                   //&#207;&#212;ê&#190;&#184;&#223;&#182;è.......................................
               
                OLED_ShowNum(77,52,(u8)(result_UT*0.1),4,12);                        //&#207;&#212;ê&#190;&#206;&#194;&#182;è&#213;&#251;êy2&#191;·&#214; òò&#206;a2aá&#191;&#214;μàyè&#231;&#206;a245&#195;&#187;óDD&#161;êyμ&#227;.....
                if(result_UT>400)LED0=0;                                          //&#191;éò&#212;&#188;óò&#187;&#184;&#246;&#197;D&#182;&#207; ±¨&#190;ˉ
                result_UT=result_UT-(u8)(result_UT*0.1)*10;                         //&#188;&#198;&#203;&#227;D&#161;êy2&#191;·&#214;
                OLED_ShowNum(103,52,result_UT,1,12);                                   //   &#207;&#212;ê&#190;D&#161;êy2&#191;·&#214;....................................
               
                LED1=!LED1;                                            //3ìDò&#212;&#203;DD &#194;ìμ&#198;               
                delay_ms(250);               
                OLED_Refresh_Gram();//&#184;üD&#194;&#207;&#212;ê&#190;μ&#189;OLED       
        }                                                                                    
}       



*?*?*?*?
#include "myiic.h"
#include "delay.h"
#include "led.h"
//////////////////////////////////////////////////////////////////////////////////         
//±&#190;3ìDò&#214;&#187;1&#169;&#209;§&#207;°ê1ó&#195;£&#172;&#206;′&#190;-×÷&#213;&#223;Dí&#191;é£&#172;2&#187;μ&#195;ó&#195;óú&#198;&#228;&#203;üè&#206;o&#206;ó&#195;í&#190;
//Mini STM32&#191;a·¢°&#229;
//IIC &#199;y&#182;ˉoˉêy          
//&#213;yμ&#227;&#212;-×ó@ALIENTEK
//&#188;&#188;ê&#245;&#194;&#219;ì3:www.openedv.com
//DT&#184;&#196;è&#213;&#198;ú:2010/6/10
//°&#230;±&#190;£oV1.0
//°&#230;è¨&#203;ùóD£&#172;μá°&#230;±&#216;&#190;&#191;&#161;£
//Copyright(C) &#213;yμ&#227;&#212;-×ó 2009-2019
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////           

//3&#245;ê&#188;&#187;ˉIIC
void IIC_Init(void)
{                                             
        GPIO_InitTypeDef GPIO_InitStructure;
        //RCC->APB2ENR|=1<<4;//&#207;èê1&#196;üíaéèIO PORTCê±&#214;ó
        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOC, ENABLE );       
          
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //í&#198;íìê&#228;3&#246;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOC, &GPIO_InitStructure);

        IIC_SCL=1;
        IIC_SDA=1;

}
//2úéúIIC&#198;eê&#188;D&#197;o&#197;
void IIC_Start(void)
{
        SDA_OUT();     //sda&#207;&#223;ê&#228;3&#246;
        IIC_SDA=1;                    
        IIC_SCL=1;
        delay_us(4);
        IIC_SDA=0;//START:when CLK is high,DATA change form high to low
        delay_us(4);
        IIC_SCL=0;//&#199;ˉ×&#161;I2C×ü&#207;&#223;£&#172;×&#188;±&#184;·¢&#203;í&#187;ò&#189;óê&#213;êy&#190;Y
}          
//2úéúIICí£&#214;1D&#197;o&#197;
void IIC_Stop(void)
{
        SDA_OUT();//sda&#207;&#223;ê&#228;3&#246;
        IIC_SCL=0;
        IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
        delay_us(4);
        IIC_SCL=1;
        IIC_SDA=1;//·¢&#203;íI2C×ü&#207;&#223;&#189;áê&#248;D&#197;o&#197;
        delay_us(4);                                                                  
}
//μè′yó|′eD&#197;o&#197;μ&#189;à′
//·μ&#187;&#216;&#214;μ£o1£&#172;&#189;óê&#213;ó|′e꧰ü
//        0£&#172;&#189;óê&#213;ó|′e3é1|
u8 IIC_Wait_Ack(void)
{
        u8 ucErrTime=0;
        SDA_IN();      //SDAéè&#214;&#195;&#206;aê&#228;è&#235;  
        IIC_SDA=1;delay_us(1);          
        IIC_SCL=1;delay_us(1);         
        while(READ_SDA)
        {
                ucErrTime++;
                if(ucErrTime>250)
                {
                        IIC_Stop();
                        return 1;
                }
        }
        IIC_SCL=0;//ê±&#214;óê&#228;3&#246;0           
        return 0;  
}
//2úéúACKó|′e
void IIC_Ack(void)
{
        IIC_SCL=0;
        SDA_OUT();//éè&#214;&#195;&#206;aê&#228;3&#246;
        IIC_SDA=0;
        delay_us(2);
        IIC_SCL=1;
        delay_us(2);
        IIC_SCL=0;
}
//2&#187;2úéúACKó|′e                    
void IIC_NAck(void)
{
        IIC_SCL=0;
        SDA_OUT();
        IIC_SDA=1;
        delay_us(2);
        IIC_SCL=1;
        delay_us(2);
        IIC_SCL=0;
}                                                                              
//IIC·¢&#203;íò&#187;&#184;&#246;×&#214;&#189;ú
//·μ&#187;&#216;′ó&#187;úóD&#206;Tó|′e
//1£&#172;óDó|′e
//0£&#172;&#206;Tó|′e                          
void IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
        SDA_OUT();             //éè&#214;&#195;&#206;aê&#228;3&#246;&#161;¢
    IIC_SCL=0;//à-μíê±&#214;ó&#191;aê&#188;êy&#190;Y′&#171;ê&#228;
    for(t=0;t<8;t++)
    {              
        IIC_SDA=(txd&0x80)>>7;
        txd<<=1;           
                delay_us(2);   //&#182;&#212;TEA5767&#213;aèy&#184;&#246;&#209;óê±&#182;&#188;ê&#199;±&#216;D&#235;μ&#196;
                IIC_SCL=1;
                delay_us(2);
                IIC_SCL=0;       
                delay_us(2);
    }         
}             
//&#182;á1&#184;&#246;×&#214;&#189;ú£&#172;ack=1ê±£&#172;·¢&#203;íACK£&#172;ack=0£&#172;·¢&#203;ínACK   
u8 IIC_Read_Byte(unsigned char ack)
{
        unsigned char i,receive=0;
        SDA_IN();//SDAéè&#214;&#195;&#206;aê&#228;è&#235;                                   ///////////&#182;&#212;óú°&#229;×ó ê&#228;è&#235;&#161;¢&#161;¢&#161;¢&#161;¢&#161;¢&#161;¢&#161;¢&#161;¢
    for(i=0;i<8;i++ )
        {
        IIC_SCL=0;
        delay_us(2);
                IIC_SCL=1;
        receive<<=1;
        if(READ_SDA)receive++;   
                delay_us(1);
    }                                         
    if (!ack)
        IIC_NAck();//·¢&#203;ínACK
    else
        IIC_Ack(); //·¢&#203;íACK   
    return receive;
}

/////////////////////////////////////////////////////////bmp180
/*u32 mybmp180(void)
{
        IIC_Init();
        IIC_Start();
        u8 mid;
       
        LED0=!LED0;
        return mid;       
}*/


*?*?*?*?*?

#include "BMP180.h"
#include "delay.h"
#include "myiic.h"
#include "sys.h"
#include "12864.h"

//***BMP085ê1ó&#195;
long  result_UT=0;
long  result_UP=0;

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;

u8 ge,shi,bai,qian,wan,shiwan;           //&#207;&#212;ê&#190;±&#228;á&#191;


//*********************************************************
//&#182;á3&#246;BMP085&#196;ú2&#191;êy&#190;Y,á&#172;D&#248;á&#189;&#184;&#246;
//*********************************************************
u16 Multiple_read(u8 ST_Address)
{   
        u8 msb, lsb;
        u16 _data;
    IIC_Start();                          //&#198;eê&#188;D&#197;o&#197;
    IIC_Send_Byte(BMP180_SlaveAddress);    //·¢&#203;íéè±&#184;μ&#216;&#214;·+D′D&#197;o&#197;
        while(IIC_Wait_Ack());
    IIC_Send_Byte(ST_Address);             //·¢&#203;í′&#230;′¢μ¥&#212;aμ&#216;&#214;·
        while(IIC_Wait_Ack());                                 
    IIC_Start();                          //&#198;eê&#188;D&#197;o&#197;
    IIC_Send_Byte(BMP180_SlaveAddress+1);         //·¢&#203;íéè±&#184;μ&#216;&#214;·+&#182;áD&#197;o&#197;
        while(IIC_Wait_Ack());                                       

    msb = IIC_Read_Byte(1);                 //BUF[0]′&#230;′¢               
    lsb = IIC_Read_Byte(0);                //×&#238;oóò&#187;&#184;&#246;êy&#190;YDèòa&#187;&#216;NOACK

    IIC_Stop();                           //í£&#214;1D&#197;o&#197;
    delay_ms(5);
    _data = msb << 8;
        _data |= lsb;       
        return _data;
}
//********************************************************************
u16 bmp180ReadTemp(void)
{

    IIC_Start();                  //&#198;eê&#188;D&#197;o&#197;
    IIC_Send_Byte(BMP180_SlaveAddress);   //·¢&#203;íéè±&#184;μ&#216;&#214;·+D′D&#197;o&#197;   BMP180_SlaveAddress  0xee        &#198;&#248;&#209;1′&#171;&#184;D&#198;÷&#198;÷&#188;tμ&#216;&#214;·
        while(IIC_Wait_Ack());
    IIC_Send_Byte(0xF4);                  // write register address
    while(IIC_Wait_Ack());
        IIC_Send_Byte(0x2E);               // write register data for temp
    while(IIC_Wait_Ack());
        IIC_Stop();                   //·¢&#203;íí£&#214;1D&#197;o&#197;
        delay_ms(10);        // max time is 4.5ms
        return Multiple_read(0xF6);
}
//*************************************************************
u16 bmp180ReadPressure(void)
{
        //u16 pressure = 0;

    IIC_Start();                   //&#198;eê&#188;D&#197;o&#197;
    IIC_Send_Byte(BMP180_SlaveAddress);   //·¢&#203;íéè±&#184;μ&#216;&#214;·+D′D&#197;o&#197;
    while(IIC_Wait_Ack());
        IIC_Send_Byte(0xF4);                  // write register address
    while(IIC_Wait_Ack());
        IIC_Send_Byte(0x34);                 // write register data for pressure
    while(IIC_Wait_Ack());
        IIC_Stop();                    //·¢&#203;íí£&#214;1D&#197;o&#197;
        delay_ms(20);                              // max time is 4.5ms
       
        //pressure = Multiple_read(0xF6);
        //pressure &= 0x0FFFF;
       
        return Multiple_read(0xF6);//pressure;       
}

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

//3&#245;ê&#188;&#187;ˉBMP085£&#172;&#184;ù&#190;YDèòa&#199;&#235;2&#206;&#191;&#188;pdf&#189;&#248;DDDT&#184;&#196;**************
void Init_BMP180()
{
       
        IIC_Init();
        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 conversion(long temp_data)  
{   

    shiwan=temp_data/100000+0x30 ;
    temp_data=temp_data%100000;   //è&#161;óà&#212;&#203;&#203;&#227;
    wan=temp_data/10000+0x30 ;
    temp_data=temp_data%10000;   //è&#161;óà&#212;&#203;&#203;&#227;
        qian=temp_data/1000+0x30 ;
    temp_data=temp_data%1000;    //è&#161;óà&#212;&#203;&#203;&#227;
    bai=temp_data/100+0x30   ;
    temp_data=temp_data%100;     //è&#161;óà&#212;&#203;&#203;&#227;
    shi=temp_data/10+0x30    ;
    temp_data=temp_data%10;      //è&#161;óà&#212;&#203;&#203;&#227;
    ge=temp_data+0x30;        
}

//***********************************************************************
void bmp180Convert()
{
        unsigned int ut;
        unsigned long up;
        long x1, x2, b5, b6, x3, b3, p;
        unsigned long b4, b7;

        ut = bmp180ReadTemp();           // &#182;áè&#161;&#206;&#194;&#182;è
        up = bmp180ReadPressure();  // &#182;áè&#161;&#209;1&#199;&#191;    return pressure;       
        //*************
        x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
        x2 = ((long) mc << 11) / (x1 + md);
        b5 = x1 + x2;
        result_UT = ((b5 + 8) >> 4);
       
        write_12864com(0x89);
        write_12864data('T');       //&#206;&#194;&#182;è&#207;&#212;ê&#190;
        write_12864data(':');
        write_12864data(bai);      
        write_12864data(shi);
        write_12864data('.');
        write_12864data(ge);
        write_12864data('C');     //&#206;&#194;&#182;èμ¥&#206;&#187;
        write_12864data('a');
       
        //*************               
        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;
        result_UP = p+((x1 + x2 + 3791)>>4);
}


/****************************************************************
&#161;&#161;&#161;&#161;&#161;&#161;oˉêy&#195;&#251;3&#198;£oBMP085_Get_Altitude                            
&#161;&#161;&#161;&#161;&#161;&#161;oˉêy1|&#196;ü£o&#187;&#241;è&#161;o£°&#206;&#184;&#223;&#182;è&#214;μ
&#161;&#161;&#161;&#161;&#161;&#161;è&#235;&#191;ú2&#206;êy£o&#206;T
&#161;&#161;&#161;&#161;&#161;&#161;3&#246;&#191;ú2&#206;êy£oaltitude //intDí  2×&#214;&#189;ú£&#172;μ±&#199;°o£°&#206;&#184;&#223;&#182;è&#214;μ
&#161;&#161;&#161;&#161;&#161;&#161;±&#184; ×¢£o         ·μ&#187;&#216;μ&#196;&#184;&#223;&#182;è&#214;μμ¥&#206;&#187;&#206;aà&#229;&#195;×£&#172;μ÷ó&#195;ê±&#212;ù&#187;&#187;&#203;&#227;3é′&#248;D&#161;êyμ&#196;ò&#212;&#195;×&#206;aμ¥&#206;&#187;μ&#196;&#184;&#223;&#182;è&#214;μ
*****************************************************************/
/*
double BMP085_Get_Altitude()
{
        double altitude;
        //pressure=(float)pressure;                                //&#187;&#241;è&#161;&#198;&#248;&#209;1&#214;μ
        altitude=44330.0*(1-pow((double)pressure/101325,1/5.255));          //&#184;ù&#190;YD&#190;&#198;&#172;ê&#214;2áìá1&#169;μ&#196;1&#171;ê&#189;&#188;&#198;&#203;&#227;o£°&#206;&#184;&#223;&#182;è
        //altitude*=100;                         //×a&#187;&#187;3éà&#229;&#195;×μ¥&#206;&#187;μ&#196;&#184;&#223;&#182;è&#214;μ£&#172;μ÷ó&#195;ê±&#212;ù&#187;&#187;&#203;&#227;3é′&#248;D&#161;êyμ&#196;&#184;&#223;&#182;è&#214;μ£&#172;ìá&#184;&#223;&#190;&#171;&#182;è
        return altitude;
}
*/





















友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。