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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

bmp280 51單片機代碼實現

[復制鏈接]
跳轉到指定樓層
樓主
  1. #include <REGX52.H>
  2. #include "I2C.h"
  3. #include"LCD1602.h"
  4. #define BMP280_ADDRESS                0xEE     //BMP280 I2C地址
  5. typedef long BMP280_S32_t;
  6. typedef unsigned long BMP280_U32_t;
  7. BMP280_S32_t var1, var2, T;
  8. BMP280_S32_t t_fine;
  9. BMP280_U32_t p;
  10. static unsigned short dig_T1,dig_P1;
  11. static short dig_T2,dig_T3,dig_P2,dig_P3,dig_P4,dig_P5,dig_P6,dig_P7,dig_P8,dig_P9;
  12. static long adc_T,adc_P,TEMP,PRESS;
  13. unsigned char temp_xlsb,temp_lsb,temp_msb,press_xlsb,press_lsb,press_msb;
  14. unsigned int dis_p1,dis_p2; //顯示測試
  15. /**
  16.   * @brief  BMP280寫入一個字節
  17.   * @param  WordAddress 要寫入字節的地址
  18.   * @param  Data 要寫入的數據
  19.   * @retval 無
  20.   */
  21. void BMP280_WriteByte(unsigned char WordAddress,Data)
  22. {
  23.         I2C_Start();
  24.         I2C_SendByte(BMP280_ADDRESS);
  25.         I2C_ReceiveAck();
  26.         I2C_SendByte(WordAddress);
  27.         I2C_ReceiveAck();
  28.         I2C_SendByte(Data);
  29.         I2C_ReceiveAck();
  30.         I2C_Stop();
  31. }

  32. /**
  33.   * @brief  BMP280讀取一個字節
  34.   * @param  WordAddress 要讀出字節的地址
  35.   * @retval 讀出的數據
  36.   */
  37. unsigned char BMP280_ReadByte(unsigned char WordAddress)
  38. {
  39.         unsigned char Data;
  40.         I2C_Start();
  41.         I2C_SendByte(BMP280_ADDRESS);
  42.         I2C_ReceiveAck();
  43.         I2C_SendByte(WordAddress);
  44.         I2C_ReceiveAck();
  45.         I2C_Start();
  46.         I2C_SendByte(BMP280_ADDRESS|0x01);
  47.         I2C_ReceiveAck();
  48.         Data=I2C_ReceiveByte();
  49.         I2C_SendAck(1);
  50.         I2C_Stop();
  51.         return Data;
  52. }
  53. short ym(short bm) //利用補碼計算源碼公式
  54. {
  55.         short mid;
  56.         if(bm&0x8000) //如果符號位不為零
  57.                 {
  58.                    mid=((~bm)|0x8000)+1;
  59.                         return mid;
  60.                 }
  61.                 else return bm;
  62. }
  63. void BMP280_INIT()
  64. {
  65.         BMP280_WriteByte(0xF4,0xB7); //設置16倍過采樣和一般模式
  66.         BMP280_WriteByte(0xF5,0x80); //設置待機間隔時間,過濾器,三線spi使能
  67.         //開始讀取補償數據
  68.         dig_T1=BMP280_ReadByte(0x88);
  69.         dig_T1<<=8;
  70.         dig_T1+=BMP280_ReadByte(0x89);
  71.        
  72.         dig_T2=BMP280_ReadByte(0x8A);
  73.         dig_T2<<=8;
  74.         dig_T2+=BMP280_ReadByte(0x8B);
  75.        
  76.         dig_T3=BMP280_ReadByte(0x8C);
  77.         dig_T3<<=8;
  78.         dig_T3+=BMP280_ReadByte(0x8D);
  79.        
  80.         dig_P1=BMP280_ReadByte(0x8E);
  81.         dig_P1<<=8;
  82.         dig_P1+=BMP280_ReadByte(0x8F);
  83.        
  84.         dig_P2=BMP280_ReadByte(0x90);
  85.         dig_P2<<=8;
  86.         dig_P2+=BMP280_ReadByte(0x91);
  87.        
  88.         dig_P3=BMP280_ReadByte(0x92);
  89.         dig_P3<<=8;
  90.         dig_P3+=BMP280_ReadByte(0x93);
  91.        
  92.         dig_P4=BMP280_ReadByte(0x94);
  93.         dig_P4<<=8;
  94.         dig_P4+=BMP280_ReadByte(0x95);
  95.        
  96.         dig_P5=BMP280_ReadByte(0x96);
  97.         dig_P5<<=8;
  98.         dig_P5+=BMP280_ReadByte(0x97);
  99.        
  100.         dig_P6=BMP280_ReadByte(0x98);
  101.         dig_P6<<=8;
  102.         dig_P6+=BMP280_ReadByte(0x99);
  103.        
  104.         dig_P7=BMP280_ReadByte(0x9A);
  105.         dig_P7<<=8;
  106.         dig_P7+=BMP280_ReadByte(0x9B);
  107.        
  108.         dig_P8=BMP280_ReadByte(0x9C);
  109.         dig_P8<<=8;
  110.         dig_P8+=BMP280_ReadByte(0x9D);
  111.        
  112.         dig_P9=BMP280_ReadByte(0x9E);
  113.         dig_P9<<=8;
  114.         dig_P9+=BMP280_ReadByte(0x9F);
  115.        
  116.         dig_T1=ym(dig_T1);
  117.         dig_T2=ym(dig_T2);
  118.         dig_T3=ym(dig_T3);
  119.         dig_P1=ym(dig_P1);
  120.         dig_P2=ym(dig_P2);
  121.         dig_P3=ym(dig_P3);
  122.         dig_P4=ym(dig_P4);
  123.         dig_P5=ym(dig_P5);
  124.         dig_P6=ym(dig_P6);
  125.         dig_P7=ym(dig_P7);
  126.         dig_P8=ym(dig_P8);
  127.         dig_P9=ym(dig_P9);
  128.        
  129.        
  130.        
  131.   //LCD_ShowHexNum(2,1,dig_T2,4); //測試語句
  132.         //LCD_ShowHexNum(2,6,dig_P1,4);
  133.         //LCD_ShowHexNum(2,11,dig_P9,4);
  134. }

  135. void BMP280_ReadADC(void)
  136. {
  137.   I2C_Start();
  138.         I2C_SendByte(BMP280_ADDRESS);
  139.         I2C_ReceiveAck();
  140.         I2C_SendByte(0xF7);
  141.         I2C_ReceiveAck();
  142.         I2C_Start();
  143.         I2C_SendByte(BMP280_ADDRESS|0x01);
  144.         I2C_ReceiveAck();
  145.         press_msb=I2C_ReceiveByte();
  146.         I2C_SendAck(0);
  147.         press_lsb=I2C_ReceiveByte();
  148.         I2C_SendAck(0);
  149.         press_xlsb=I2C_ReceiveByte();
  150.         I2C_SendAck(0);
  151.         temp_msb=I2C_ReceiveByte();
  152.         I2C_SendAck(0);
  153.         temp_lsb=I2C_ReceiveByte();
  154.         I2C_SendAck(0);
  155.         temp_xlsb=I2C_ReceiveByte();
  156.         I2C_SendAck(1);
  157.         I2C_Stop();                     //突發讀取所有原始數據
  158.          adc_T=0;
  159.          adc_T|=temp_msb<<12;
  160.          adc_T=adc_T|(temp_lsb<<4);
  161.          adc_T=adc_T|(temp_xlsb>>4);  //20位溫度原始數據存儲到adc_T中
  162.          adc_P=0;
  163.          adc_P=BMP280_ReadByte(0xFA)<<12;
  164.          adc_P=adc_P+BMP280_ReadByte(0xFB)<<4;
  165.          adc_P=adc_P+BMP280_ReadByte(0xFC)>>4;  //20位溫度原始數據存儲到adc_P中
  166.          //LCD_ShowHexNum(2,1,adc_T,4);  LCD_ShowHexNum(2,6,adc_P,4); //測試語句
  167.          
  168.          //校準語句
  169.          // Returns temperature in DegC, resolution is 0.01 DegC. Output value of “5123” equals 51.23 DegC.
  170.    // t_fine carries fine temperature as global value



  171. var1=((((adc_T>>3)-((BMP280_S32_t)dig_T1<<1)))*((BMP280_S32_t)dig_T2))>>11;
  172. var2=(((((adc_T>>4)-((BMP280_S32_t)dig_T1))*((adc_T>>4)-((BMP280_S32_t)dig_T1)))>>12)*((BMP280_S32_t)dig_T3))>>14;
  173. t_fine = var1 + var2;
  174. T = (t_fine * 5 + 128) >> 8;
  175. TEMP=T;

  176. // Returns pressure in Pa as unsigned 32 bit integer. Output value of “96386” equals 96386 Pa = 963.86 hPa

  177. //BMP280_S32_t var1, var2;

  178. var1=(((BMP280_S32_t)t_fine)>>1)-(BMP280_S32_t)64000;
  179. var2=(((var1>>2)*(var1>>2))>>11 )*((BMP280_S32_t)dig_P6);
  180. var2=var2+((var1*((BMP280_S32_t)dig_P5))<<1);
  181. var2=(var2>>2)+(((BMP280_S32_t)dig_P4)<<16);
  182. var1=(((dig_P3*(((var1>>2)*(var1>>2))>>13))>>3)+((((BMP280_S32_t)dig_P2)*var1)>>1))>>18;
  183. var1=((((32768+var1))*((BMP280_S32_t)dig_P1))>>15);
  184. if (var1 == 0)
  185. {
  186. PRESS=0; // avoid exception caused by division by zero
  187. }
  188. p = (((BMP280_U32_t)(((BMP280_S32_t)1048576)-adc_P)-(var2>>12)))*3125;
  189. if (p<0x80000000)
  190. {
  191. p = (p<<1)/((BMP280_U32_t)var1);
  192. }
  193. else
  194. {
  195. p=(p/(BMP280_U32_t)var1)*2;
  196. }
  197. var1=(((BMP280_S32_t)dig_P9)*((BMP280_S32_t)(((p>>3)*(p>>3))>>13)))>>12;
  198. var2=(((BMP280_S32_t)(p>>2))*((BMP280_S32_t)dig_P8))>>13;
  199. p=(BMP280_U32_t)((BMP280_S32_t)p+((var1 + var2 + dig_P7)>>4));
  200. PRESS=p;

  201. dis_p2=PRESS%1000;
  202. dis_p1=PRESS/1000;
  203. LCD_ShowNum(2,1,TEMP,5);
  204. LCD_ShowNum(2,6,dis_p1,2);LCD_ShowNum(2,8,dis_p2,3);

  205. }
復制代碼

  1. #ifndef __BMP280_H__
  2. #define __BMP280_H__

  3. void BMP280_WriteByte(unsigned char WordAddress,Data);
  4. unsigned char BMP280_ReadByte(unsigned char WordAddress);
  5. void BMP280_INIT();
  6. void BMP280_ReadADC(void);
  7. #endif
復制代碼


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

使用道具 舉報

沙發
ID:346334 發表于 2023-10-31 02:50 | 只看該作者
能把IIC.C和MAIN文件一起分享一下嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人亚洲视频 | 国产av毛片 | 久久一区二区三区四区五区 | 国内精品视频在线观看 | 国产成人在线播放 | 欧美黄色一级毛片 | 中文字幕成人在线 | 亚洲天堂色 | 欧洲成人免费视频 | 99视频在线免费观看 | 欧洲视频一区二区 | 欧美性极品xxxx做受 | 午夜精品久久久久久久星辰影院 | 国产精品国产 | 夜夜爽99久久国产综合精品女不卡 | 黄色av观看 | 国产成人一区二区三区电影 | 中文二区| 日韩精品成人 | 欧美成人一区二区 | 久久久免费在线观看 | 91精品一区 | 人人色视频| 操到爽| 久久天堂网 | 蜜桃传媒av | 国产一区 在线视频 | 午夜精品一区 | 亚洲一区视频在线 | 亚洲欧洲中文日韩 | 中文字幕国产一区 | 国产精品成人一区二区三区吃奶 | 99视频在线免费观看 | 国产96在线| 国产精品视频一二三区 | 最新中文字幕久久 | 在线看av的网址 | 亚洲视频精品在线 | 亚洲成人天堂 | 国产电影一区二区 | 亚洲视频www|