找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2976|回复: 1
收起左侧

stm32单片机的BMP180气压温度计传感器源程序 串口输出

[复制链接]
ID:420321 发表于 2019-6-26 17:07 | 显示全部楼层 |阅读模式
气压计BMP180传感器调试
1、功能描述:使用模拟IIC,从BMP180中获取温度值、气压值以及计算海拔高度。
  下面介绍在文档里面。。。

程序介绍

程序介绍


单片机源程序如下:
  1. #include "bmp180.h"
  2. #include "delay.h"
  3. #include "math.h"

  4. #include "led.h"
  5. #include "usart.h"
  6. //存储BMP180数据的结构
  7. _bmp180 bmp180;

  8. //BMP180初始化
  9. //对使用的IIC端口进行初始化
  10. void BMP_Init(void)
  11. {
  12.         IIC_Init();
  13. }

  14. //写一个数据到BMP180
  15. void BMP_WriteOneByte(uint8_t WriteAddr,uint8_t DataToWrite)
  16. {
  17.         IIC_Start();
  18.         
  19.         IIC_Send_Byte(0xEE);//发送一个字节(地址为 Module address 0cEE)
  20.         IIC_Wait_Ack();//等待
  21.         
  22.         IIC_Send_Byte(WriteAddr);//发送字节的地址
  23.         IIC_Wait_Ack();
  24.         
  25.         IIC_Send_Byte(DataToWrite);//发送字节地址中的数据
  26.         IIC_Wait_Ack();
  27.         
  28.         IIC_Stop();
  29. }

  30. //从BMP180读一个字节数据
  31. uint8_t BMP_ReadOneByte(uint8_t ReadAddr)
  32. {
  33.         uint8_t data = 0;
  34.         
  35.         IIC_Start();
  36.         
  37.         IIC_Send_Byte(0xEE);   
  38.         IIC_Wait_Ack();
  39.         
  40.         IIC_Send_Byte(ReadAddr);
  41.         IIC_Wait_Ack();
  42.         
  43.         IIC_Start();
  44.         
  45.         IIC_Send_Byte(0xEF);         //把读取的字节存到下一个地址(0xef)中去
  46.         IIC_Wait_Ack();
  47.         
  48.         data = IIC_Read_Byte(1);        //读取地址总的字节
  49.         IIC_Stop();
  50.         
  51.         return data;
  52. }

  53. //从BMP180读一个16位的数据
  54. short BMP_ReadTwoByte(uint8_t ReadAddr)
  55. {
  56.         short data;
  57.         uint8_t msb,lsb;
  58.         
  59.         IIC_Start();
  60.         
  61.         IIC_Send_Byte(0xEE);//发送字节(地址为 Module address 0cEE)
  62.         IIC_Wait_Ack();
  63.         
  64.         IIC_Send_Byte(ReadAddr);
  65.         IIC_Wait_Ack();
  66.         
  67.         IIC_Start();
  68.         
  69.         IIC_Send_Byte(0xEF);//把读取的字节存到下一个地址(0xef)中去
  70.         IIC_Wait_Ack();
  71.         
  72.         msb = IIC_Read_Byte(1);//读取16位的高八位
  73.         lsb = IIC_Read_Byte(0);//读取16位的低八位
  74.         
  75.         IIC_Stop();
  76.         
  77.         data = msb*256 + lsb;//以16位的二进制数据给data
  78.         
  79.         return data;
  80. }

  81. //从BMP180的获取计算参数
  82. void BMP_ReadCalibrationData(void)
  83. {
  84.         bmp180.AC1 = BMP_ReadTwoByte(0xAA);
  85.         bmp180.AC2 = BMP_ReadTwoByte(0xAC);
  86.         bmp180.AC3 = BMP_ReadTwoByte(0xAE);
  87.         bmp180.AC4 = BMP_ReadTwoByte(0xB0);
  88.         bmp180.AC5 = BMP_ReadTwoByte(0xB2);
  89.         bmp180.AC6 = BMP_ReadTwoByte(0xB4);
  90.         bmp180.B1  = BMP_ReadTwoByte(0xB6);
  91.         bmp180.B2  = BMP_ReadTwoByte(0xB8);
  92.         bmp180.MB  = BMP_ReadTwoByte(0xBA);
  93.         bmp180.MC  = BMP_ReadTwoByte(0xBC);
  94.         bmp180.MD  = BMP_ReadTwoByte(0xBE);
  95. }

  96. //从BMP180读取未修正的温度
  97. long BMP_Read_UT(void)
  98. {
  99.         long temp = 0;
  100.         BMP_WriteOneByte(0xF4,0x2E);
  101.         
  102.         delay_ms(5);
  103.         temp = (long)BMP_ReadTwoByte(0xF6);
  104.         return temp;
  105. }

  106. //从BMP180读取未修正的大气压
  107. long BMP_Read_UP(void)
  108. {
  109.         long pressure = 0;
  110.         
  111.         BMP_WriteOneByte(0xF4,0x34);
  112.         delay_ms(5);
  113.         
  114.         pressure = (long)BMP_ReadTwoByte(0xF6);
  115.         //pressure = pressure + BMP_ReadOneByte(0xf8);
  116.         pressure &= 0x0000FFFF;                //位运算,将pressure中的高八位清0,低八位保留
  117.         
  118.         return pressure;
  119. }

  120. //用获取的参数对温度和大气压进行修正,并计算海拔
  121. void BMP_UncompemstatedToTrue(void)
  122. {
  123.         bmp180.UT = BMP_Read_UT();//第一次读取错误  测试的实际的温度值只有-78度 海拔高度有2500多米(改变延时没用)
  124.         bmp180.UT = BMP_Read_UT();//进行第二次读取修正参数  读取两次温度值正确
  125.         bmp180.UP = BMP_Read_UP();//第一次读取压强值

  126.         /**--得到温度值--**/
  127.         bmp180.X1 = ((bmp180.UT - bmp180.AC6) * bmp180.AC5) >> 15;
  128.         bmp180.X2 = (((long)bmp180.MC) << 11) / (bmp180.X1 + bmp180.MD);
  129.         bmp180.B5 = bmp180.X1 + bmp180.X2;
  130.         bmp180.Temp  = (bmp180.B5 + 8) >> 4;
  131.         
  132.         /**--得到气压值--**/
  133.         bmp180.B6 = bmp180.B5 - 4000;
  134.         bmp180.X1 = ((long)bmp180.B2 * (bmp180.B6 * bmp180.B6 >> 12)) >> 11;
  135.         bmp180.X2 = ((long)bmp180.AC2) * bmp180.B6 >> 11;
  136.         bmp180.X3 = bmp180.X1 + bmp180.X2;
  137.         
  138.         bmp180.B3 = ((((long)bmp180.AC1) * 4 + bmp180.X3) + 2) /4;
  139.         bmp180.X1 = ((long)bmp180.AC3) * bmp180.B6 >> 13;
  140.         bmp180.X2 = (((long)bmp180.B1) *(bmp180.B6*bmp180.B6 >> 12)) >>16;
  141.         bmp180.X3 = ((bmp180.X1 + bmp180.X2) + 2) >> 2;
  142.         
  143.         bmp180.B4 = ((long)bmp180.AC4) * (unsigned long)(bmp180.X3 + 32768) >> 15;
  144.         bmp180.B7 = ((unsigned long)bmp180.UP - bmp180.B3) * 50000;
  145.         
  146.         if(bmp180.B7 < 0x80000000)
  147.         {
  148.                 bmp180.p = (bmp180.B7 * 2) / bmp180.B4;               
  149.         }
  150.         else
  151.         {
  152.                 bmp180.p = (bmp180.B7 / bmp180.B4) * 2;
  153.         }
  154.         
  155.         bmp180.X1 = (bmp180.p >> 8) * (bmp180.p >>8);
  156.         bmp180.X1 = (((long)bmp180.X1) * 3038) >> 16;
  157.         bmp180.X2 = (-7357 * bmp180.p) >> 16;
  158.         
  159.         bmp180.p = bmp180.p + ((bmp180.X1 + bmp180.X2 + 3791) >> 4);
  160.         
  161.                 /**--得到海拔高度--**/
  162.         bmp180.altitude = 44330 * (1-pow(((bmp180.p) / 101325.0),(1.0/5.255)));  
  163.         
  164. }

  165. /**--串口显示读取到的数据--**/
  166. void Show_Read_Data(void)
  167. {
  168.           u8 ID = 0;
  169.           u16 i=0;
  170.           ID = BMP_ReadOneByte(0xd0);
  171.                 BMP_UncompemstatedToTrue();
  172.                 printf("ID = %d\t  temp = %d.%dC\t   Pressure = %ldPa\t   Altitude = %.5fm\r\n",ID,bmp180.Temp/10,bmp180.Temp%10,bmp180.p,bmp180.altitude);
  173.                 i++;
  174.                 delay_ms(1000);
  175.                 if(i==1)
  176.                 {
  177.                         LED0=!LED0;//灯闪烁,提示系统正在运行        
  178.                         i=0;
  179.                 }                  
  180. }
复制代码

所有资料51hei提供下载:
BMP180传感器测试(串口显示).7z (197.03 KB, 下载次数: 134)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:208271 发表于 2024-4-9 22:54 | 显示全部楼层
C8T6测试,改下IIC接口,可以用,温度,气压还是比较准确的,海拔需要校正,感谢楼主分享。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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