久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2705|回復: 3
打印 上一主題 下一主題
收起左側

自己編寫的基于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

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:342991 發表于 2020-8-10 20:14 | 只看該作者
難得有人會用IAR的
回復

使用道具 舉報

板凳
ID:342991 發表于 2020-8-10 20:15 | 只看該作者
你就不能把工程放全了嗎
回復

使用道具 舉報

地板
ID:468878 發表于 2025-3-28 16:48 | 只看該作者
xianzhezhishi 發表于 2020-8-10 20:15
你就不能把工程放全了嗎

估計還是想留一手?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人免费网视频 | 91高清在线视频 | 青青草免费在线视频 | 欧美一区2区三区3区公司 | 亚洲欧美日韩精品久久亚洲区 | 久久国产精品99久久久大便 | 亚洲成人一区 | 亚洲www啪成人一区二区 | 国产美女自拍视频 | 亚洲精品小视频在线观看 | 日韩成人免费在线视频 | 国产成人久久 | 麻豆国产一区二区三区四区 | 精产国产伦理一二三区 | 欧美中文字幕在线 | 鸳鸯谱在线观看高清 | 黄网站在线播放 | 伊人精品 | 国产成人在线视频免费观看 | 亚洲欧美另类在线观看 | 午夜免费视频 | 国产精品永久免费视频 | 99精品欧美| 日韩精品一区二区三区在线 | 国产成人精品一区二区 | 日韩a级片 | 亚洲一区二区三区四区五区中文 | 日韩成人中文字幕 | 国产日韩一区二区三免费高清 | 黄色一级毛片 | 免费高清av| 亚洲成人精品久久久 | 不卡的av在线 | 九色在线视频 | 色秀网站| 日韩成人精品 | 日韩免费视频 | 黄色免费网| 91原创视频 | 国产精品二区三区 | 国产中文视频 |