STM32/STM8技术论坛
直播中

贾熹

8年用户 1687经验值
私信 关注
[经验]

代码 stm32f103的BMP085气压计的检测

  1. 基于STM32f103的BMP085气压计的检测  
  2. #ifndef __BMP085_H
  3. #define __BMP085_H
  4. #include "sys.h"

  5. #define        BMP085_SlaveAddress   0xee          
  6. #define OSS 0       

  7. #define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
  8. #define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}
  9. #define IIC_SCL    PBout(6)
  10. #define IIC_SDA    PBout(7)  
  11. #define READ_SDA   PBin(7)  

  12. void IIC_Init(void);                                     
  13. void IIC_Start(void);                               
  14. void IIC_Stop(void);                         
  15. void IIC_Send_Byte(u8 txd);               
  16. u8 IIC_Read_Byte(unsigned char ack);
  17. u8 IIC_Wait_Ack(void);                                
  18. void IIC_Ack(void);                       
  19. void IIC_NAck(void);                       
  20. void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data);
  21. u8 IIC_Read_One_Byte(u8 daddr,u8 addr);          
  22. void bmp085Convert(void);
  23. void Init_BMP085(void);
  24. long bmp085ReadPressure(void);
  25. long bmp085ReadTemp(void);
  26. short Multiple_read(u8 ST_Address);
  27. double BMP085_Get_Altitude(long Pressure);
  28. #endif
  29. #include

  30. short ac1;
  31. short ac2;
  32. short ac3;
  33. unsigned short ac4;
  34. unsigned short ac5;
  35. unsigned short ac6;
  36. short b1;
  37. short b2;
  38. short mb;
  39. short mc;
  40. short md;
  41. long  temperature = 0;
  42. long  pressure = 0;

  43. void IIC_Init(void)
  44. {                                             
  45.         GPIO_InitTypeDef GPIO_InitStructure;
  46.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );                  
  47.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
  48.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;  
  49.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  50.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  51.         GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7);        
  52. }

  53. void IIC_Start(void)
  54. {
  55.         SDA_OUT();   
  56.         IIC_SDA=1;                    
  57.         IIC_SCL=1;
  58.         Delay_us(4);
  59.         IIC_SDA=0;
  60.         Delay_us(4);
  61.         IIC_SCL=0;
  62. }          

  63. void IIC_Stop(void)
  64. {
  65.         SDA_OUT();
  66.         IIC_SCL=0;
  67.         IIC_SDA=0;
  68.         Delay_us(4);
  69.         IIC_SCL=1;
  70.         Delay_us(4);
  71.         IIC_SDA=1;
  72.         Delay_us(4);                                                                  
  73. }

  74. u8 IIC_Wait_Ack(void)
  75. {
  76.         u8 ucErrTime=0;
  77.         SDA_IN();      
  78.         IIC_SDA=1;Delay_us(1);          
  79.         IIC_SCL=1;Delay_us(1);         
  80.         while(READ_SDA)
  81.         {
  82.                 ucErrTime++;
  83.                 if(ucErrTime>250)
  84.                 {
  85.                         IIC_Stop();
  86.                         return 1;
  87.                 }
  88.         }
  89.         IIC_SCL=0;  
  90.         return 0;  
  91. }

  92. void IIC_Ack(void)
  93. {
  94.         IIC_SCL=0;
  95.         SDA_OUT();
  96.         IIC_SDA=0;
  97.         Delay_us(2);
  98.         IIC_SCL=1;
  99.         Delay_us(2);
  100.         IIC_SCL=0;
  101. }
  102.             
  103. void IIC_NAck(void)
  104. {
  105.         IIC_SCL=0;
  106.         SDA_OUT();
  107.         IIC_SDA=1;
  108.         Delay_us(2);
  109.         IIC_SCL=1;
  110.         Delay_us(2);
  111.         IIC_SCL=0;
  112. }                                                                              
  113.                           
  114. void IIC_Send_Byte(u8 txd)
  115. {                        
  116.     u8 t;   
  117.     SDA_OUT();             
  118.     IIC_SCL=0;
  119.     for(t=0;t<8;t++)
  120.     {              
  121.                 if((txd&0x80)>>7)
  122.                         IIC_SDA=1;
  123.                 else
  124.                         IIC_SDA=0;
  125.                 txd<<=1;           
  126.                 Delay_us(2);   
  127.                 IIC_SCL=1;
  128.                 Delay_us(2);
  129.                 IIC_SCL=0;       
  130.                 Delay_us(2);
  131.     }         
  132. }             

  133. u8 IIC_Read_Byte(unsigned char ack)
  134. {
  135.         unsigned char i,receive=0;
  136.         SDA_IN();
  137.     for(i=0;i<8;i++ )
  138.         {
  139.         IIC_SCL=0;
  140.         Delay_us(2);
  141.                 IIC_SCL=1;
  142.         receive<<=1;
  143.         if(READ_SDA)receive++;   
  144.                 Delay_us(1);
  145.     }                                         
  146.     if (!ack)
  147.         IIC_NAck();
  148.     else
  149.         IIC_Ack();   
  150.     return receive;
  151. }

  152. short Multiple_read(u8 ST_Address)
  153. {   
  154.         u8 m***, l***;
  155.         short _data;
  156.     IIC_Start();                          
  157.     IIC_Send_Byte(BMP085_SlaveAddress);   
  158.         while(IIC_Wait_Ack());
  159.         IIC_Send_Byte(ST_Address);           
  160.         while(IIC_Wait_Ack()){}
  161.     IIC_Start();                        
  162.     IIC_Send_Byte(BMP085_SlaveAddress+1);         
  163.         while(IIC_Wait_Ack()){}
  164.     m*** = IIC_Read_Byte(1);                 
  165.     l*** = IIC_Read_Byte(0);     
  166.     IIC_Stop();                           
  167.     Delay_ms(5);
  168.     _data = m*** << 8;
  169.         _data |= l***;       
  170.         return _data;
  171. }

  172. //********************************************************************
  173. long bmp085ReadTemp(void)
  174. {
  175.     IIC_Start();                 
  176.     IIC_Send_Byte(BMP085_SlaveAddress);   
  177.         while(IIC_Wait_Ack()){}       
  178.     IIC_Send_Byte(0xF4);                  
  179.         while(IIC_Wait_Ack()){}       
  180.     IIC_Send_Byte(0x2E);      
  181.         while(IIC_Wait_Ack()){}       
  182.     IIC_Stop();                  
  183.         Delay_ms(10);               
  184.         return (long) Multiple_read(0xF6);
  185. }
  186. //*************************************************************
  187. long bmp085ReadPressure(void)
  188. {
  189.         long pressure = 0;
  190.     IIC_Start();                  
  191.     IIC_Send_Byte(BMP085_SlaveAddress);  
  192.     while(IIC_Wait_Ack()){}               
  193.     IIC_Send_Byte(0xF4);                  
  194.     while(IIC_Wait_Ack()){}                               
  195.     IIC_Send_Byte(0x34);                 
  196.     while(IIC_Wait_Ack()){}                               
  197.     IIC_Stop();                  
  198.     Delay_ms(10);               
  199.     pressure = Multiple_read(0xF6);
  200.     pressure &= 0x0000FFFF;       
  201.     return pressure;       
  202. }

  203. void Init_BMP085()
  204. {
  205.         ac1 = Multiple_read(0xAA);
  206.         ac2 = Multiple_read(0xAC);
  207.         ac3 = Multiple_read(0xAE);
  208.         ac4 = Multiple_read(0xB0);
  209.         ac5 = Multiple_read(0xB2);
  210.         ac6 = Multiple_read(0xB4);
  211.         b1 =  Multiple_read(0xB6);
  212.         b2 =  Multiple_read(0xB8);
  213.         mb =  Multiple_read(0xBA);
  214.         mc =  Multiple_read(0xBC);
  215.         md =  Multiple_read(0xBE);
  216. }

  217. //***********************************************************************
  218. void bmp085Convert()
  219. {
  220.         unsigned int ut;
  221.         unsigned long up;
  222.         long x1, x2, b5, b6, x3, b3, p;
  223.         unsigned long b4, b7;

  224.         ut = bmp085ReadTemp();          
  225.         up = bmp085ReadPressure();  
  226.         x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
  227.         x2 = ((long) mc << 11) / (x1 + md);
  228.         b5 = x1 + x2;
  229.         temperature = ((b5 + 8) >> 4);
  230.           b6 = b5 - 4000;
  231.           x1 = (b2 * (b6 * b6)>>12)>>11;
  232.           x2 = (ac2 * b6)>>11;
  233.           x3 = x1 + x2;
  234.           b3 = (((((long)ac1)*4 + x3)<>2;
  235.         x1 = (ac3 * b6)>>13;
  236.           x2 = (b1 * ((b6 * b6)>>12))>>16;
  237.           x3 = ((x1 + x2) + 2)>>2;
  238.           b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;  
  239.           b7 = ((unsigned long)(up - b3) * (50000>>OSS));
  240.           if (b7 < 0x80000000)
  241.             p = (b7<<1)/b4;
  242.           else
  243.             p = (b7/b4)<<1;   
  244.         x1 = (p>>8) * (p>>8);
  245.         x1 = (x1 * 3038)>>16;
  246.         x2 = (-7357 * p)>>16;
  247.         pressure = p+((x1 + x2 + 3791)>>4);
  248. }


  249. double BMP085_Get_Altitude(long Pressure)
  250. {
  251.         double altitude;
  252.         altitude=44330.0*(1-pow((double)Pressure/101325,1/5.255));         
  253.         altitude*=100;                        
  254.         return altitude;



更多回帖

发帖
×
20
完善资料,
赚取积分