找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2067|回复: 2
收起左侧

自己编写的基于IAR环境下STM32F103单片机读取BME280程序,没有太多的寄存器操作

[复制链接]
ID:747769 发表于 2020-7-16 09:45 | 显示全部楼层 |阅读模式
自己编写的基于IAR环境下STM32F103单片机读取BME280程序,没有太多的寄存器操作,简单易懂,可以直接调用,上电后只要对IO口初始化,调用函数Bme_ReadDigValue()读取校准寄存器参数并保存,再调用函数Bme_Init()初始化之后就可以用函数Bme_ReadStatus()读取传感器状态判断是否读取数据了,也可不判断传感器状态直接读取数据,读取数据直接调用函数ReadBme280()。

单片机源程序:
  1. void ReadBme280()
  2. {
  3.         u32 value_ad;
  4.         double var1;
  5.         double var2;
  6.         double var3;
  7.         
  8.     double var4;
  9.     double var5;
  10.     double var6;
  11.         
  12.         double pressure;
  13.         double pressure_min = 30000.0;
  14.         double pressure_max = 110000.0;
  15.         
  16.         double humidity;
  17.     double humidity_min = 0.0;
  18.     double humidity_max = 100.0;
  19.         
  20.         u8 temp[10];
  21.         
  22.         ///////////////// temp /////////////////
  23.         Bme_Read(Adds_RegValueTempStart,temp,3);
  24.         value_ad = ( ((temp[0]<<16)+(temp[1]<<8)+(temp[2]&0xf0))>>4 );
  25.         var1 = ( ((value_ad>>3)-(Bme280.dig_T1<<1))*Bme280.dig_T2 )>>11;
  26.         var2 = (((((value_ad>>4)-Bme280.dig_T1)*((value_ad>>4)-Bme280.dig_T1))>>12)*Bme280.dig_T3)>>14;
  27.         Bme280.t_fine = var1+var2;
  28.         Bme280.temp = ( (Bme280.t_fine*5+128)>>8);
  29.         Bme280.temp = Bme280.temp;
  30.         ///////////////// press /////////////////
  31.         Bme_Read(Adds_RegValuePressStart,temp,3);
  32.         value_ad = ( ((temp[0]<<16)+(temp[1]<<8)+(temp[2]&0xf0))>>4 );
  33.         var1 = ((double)Bme280.t_fine / 2.0) - 64000.0;
  34.         var2 = var1 * var1 * ((double)Bme280.dig_P6) / 32768.0;
  35.         var2 = var2 + var1 * ((double)Bme280.dig_P5) * 2.0;
  36.         var2 = (var2 / 4.0) + (((double)Bme280.dig_P4) * 65536.0);
  37.         var3 = ((double)Bme280.dig_P3) * var1 * var1 / 524288.0;
  38.         var1 = (var3 + ((double)Bme280.dig_P2) * var1) / 524288.0;
  39.         var1 = (1.0 + var1 / 32768.0) * ((double)Bme280.dig_P1);
  40.         if (var1 > (0.0))
  41.         {
  42.                 pressure = 1048576.0 - (double)value_ad;
  43.                 pressure = (pressure - (var2 / 4096.0)) * 6250.0 / var1;
  44.                 var1 = ((double)Bme280.dig_P9) * pressure * pressure / 2147483648.0;
  45.                 var2 = pressure * ((double)Bme280.dig_P8) / 32768.0;
  46.                 pressure = pressure + (var1 + var2 + ((double)Bme280.dig_P7)) / 16.0;
  47.                 if (pressure < pressure_min)
  48.                 {
  49.                         pressure = pressure_min;
  50.                 }
  51.                 else if (pressure > pressure_max)
  52.                 {
  53.                         pressure = pressure_max;
  54.                 }
  55.         }
  56.         else
  57.         {
  58.                 pressure = pressure_min;
  59.         }
  60.         Bme280.press = pressure;
  61.         Bme280.press = Bme280.press*100;
  62.         ///////////////// humidity /////////////////
  63.         Bme_Read(Adds_RegValueHumStart,temp,2);
  64.         value_ad = ( (temp[0]<<8)+temp[1] );
  65.         var1 = ((double)Bme280.t_fine) - 76800.0;
  66.         var2 = (((double)Bme280.dig_H4) * 64.0 + (((double)Bme280.dig_H5) / 16384.0) * var1);
  67.         var3 = value_ad - var2;
  68.         var4 = ((double)Bme280.dig_H2) / 65536.0;
  69.         var5 = (1.0 + (((double)Bme280.dig_H3) / 67108864.0) * var1);
  70.         var6 = 1.0 + (((double)Bme280.dig_H6) / 67108864.0) * var1 * var5;
  71.         var6 = var3 * var4 * (var5 * var6);
  72.         humidity = var6 * (1.0 - ((double)Bme280.dig_H1) * var6 / 524288.0);
  73.         if (humidity > humidity_max)
  74.         {
  75.                 humidity = humidity_max;
  76.         }
  77.         else if (humidity < humidity_min)
  78.         {
  79.                 humidity = humidity_min;
  80.         }
  81.         Bme280.hum =  humidity*100;// 结果包含2位小数
  82. }
  83. void BmeReset()
  84. {
  85.         u8 temp[50];
  86.         temp[0] = CMD_Bme280Reset;
  87.         Bme_Write(Reg_Bme280Reset,temp,1);
  88. }
复制代码


下载:

STM32F103读取Bme280.rar

5.74 KB, 下载次数: 27, 下载积分: 黑币 -5

回复

使用道具 举报

ID:342991 发表于 2020-8-10 20:14 | 显示全部楼层
难得有人会用IAR的
回复

使用道具 举报

ID:342991 发表于 2020-8-10 20:15 | 显示全部楼层
你就不能把工程放全了吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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