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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

stm32單片機的BMP180氣壓溫度計傳感器源程序 串口輸出

[復制鏈接]
跳轉到指定樓層
樓主
氣壓計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, 下載次數: 150)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:208271 發表于 2024-4-9 22:54 | 只看該作者
C8T6測試,改下IIC接口,可以用,溫度,氣壓還是比較準確的,海拔需要校正,感謝樓主分享。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产日韩欧美中文字幕 | 在线成人免费视频 | 成人av一区 | 亚洲小视频在线观看 | www午夜视频 | 综合中文字幕 | 日韩中文字幕视频 | 国产91在线播放精品91 | 福利视频网站 | 91久久久久 | 亚洲日本中文字幕在线 | 亚洲天堂中文字幕 | 做a视频 | 午夜在线精品 | 国产精品久久久久久久一区探花 | 久久在视频 | 日韩av中文| 一区在线播放 | 91精品国产色综合久久不卡蜜臀 | 国产a区| 91国语清晰打电话对白 | 999免费网站 | www.国产91 | 久久久久久久久国产成人免费 | 91精品久久久久久综合五月天 | 国产精品自在线 | 亚洲小视频在线播放 | 精品视频在线免费观看 | 爱操影视 | 免费看一区二区三区 | 日本人爽p大片免费看 | 亚洲 欧美 激情 另类 校园 | 91在线色视频 | 亚洲一区精品在线 | 99精彩视频| 网页av| 亚洲免费视频播放 | 日本一二三区电影 | 91久久视频 | 亚洲精品视频在线看 | 亚洲欧美国产毛片在线 |