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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

BMP085數字式氣溫氣壓 高度計模塊GY-65 51和Arduino等平臺源碼 原理圖 pdf資料下載

[復制鏈接]
跳轉到指定樓層
樓主
GY-65是BOSCH博世生產的,給論壇的朋友們帶來bmp085模塊資料分享,他是一款數字式氣溫氣壓計 高度計模塊,可以和單片機直接接口。

BMP085模塊引腳圖:


BMP085原理圖:


BMP085模塊的pdf資料:




Arduino 51單片機和avr的源碼在壓縮包里面都有

BMP085和單片機接口的原理圖:

下面是51單片機代碼的預覽:
  1. //***************************************
  2. // BMP085 IIC測試程序
  3. // 使用單片機STC89C51
  4. // 晶振:11.0592M
  5. // 顯示:電腦串口助手
  6. // 編譯環境 Keil uVision2
  7. // 參考宏晶網站24c04通信程序
  8. // 時間:2012年5月1日
  9. // QQ:531389319
  10. //****************************************
  11. #include  <REG51.H>          
  12. #include  <math.h>    //Keil library  
  13. #include  <stdlib.h>  //Keil library  
  14. #include  <stdio.h>   //Keil library       
  15. #include  <INTRINS.H> //Keil library  
  16. #define   uchar unsigned char
  17. #define   uint unsigned int       
  18. #define   DataPort P0    //LCD1602數據端口
  19. sbit          SCL=P1^0;      //IIC時鐘引腳定義
  20. sbit           SDA=P1^1;      //IIC數據引腳定義

  21. #define        BMP085_SlaveAddress   0xee          //定義器件在IIC總線中的從地址                              

  22. #define OSS 0        // Oversampling Setting (note: code is not set up to use other OSS values)
  23.                                                           
  24. typedef unsigned char  BYTE;
  25. typedef unsigned short WORD;
  26.           
  27. uchar ge,shi,bai,qian,wan,shiwan;           //顯示變量
  28. int  dis_data;                              //變量

  29. short ac1;
  30. short ac2;
  31. short ac3;
  32. unsigned short ac4;
  33. unsigned short ac5;
  34. unsigned short ac6;
  35. short b1;
  36. short b2;
  37. short mb;
  38. short mc;
  39. short md;

  40. int  temperature;
  41. long  pressure;

  42. void delay(unsigned int k);
  43. //void InitLcd();                            //初始化lcd1602

  44. //void WriteDataLCM(uchar dataW);
  45. //void WriteCommandLCM(uchar CMD,uchar Attribc);
  46. //void DisplayOneChar(uchar X,uchar Y,uchar DData);
  47. void conversion(long temp_data);

  48. void  Single_Write(uchar SlaveAddress,uchar REG_Address,uchar REG_data);   //單個寫入數據
  49. uchar Single_Read(uchar REG_Address);                                      //單個讀取內部寄存器數據
  50. void  Multiple_Read(uchar,uchar);                                          //連續的讀取內部寄存器數據
  51. //------------------------------------
  52. void Delay5us();
  53. void Delay5ms();
  54. void BMP085_Start();
  55. void BMP085_Stop();
  56. void BMP085_SendACK(bit ack);
  57. bit  BMP085_RecvACK();
  58. void BMP085_SendByte(BYTE dat);
  59. BYTE BMP085_RecvByte();
  60. void BMP085_ReadPage();
  61. void BMP085_WritePage();
  62. //-----------------------------------
  63. //*********************************************
  64. //串口初始化
  65. //9600 bps @ 11.059 MHz
  66. void init_uart()
  67. {
  68.         TMOD=0x21;                               
  69.         TH1=0xfd;                               
  70.         TL1=0xfd;                               
  71.         SCON=0x50;
  72.         PS=1;      //串口中斷設為高優先級別
  73.         TR0=1;           //啟動定時器                       
  74.         TR1=1;
  75.         ET0=1;     //打開定時器0中斷                       
  76.         ES=1;       
  77.         EA=1;
  78. }

  79. //*********串口數據發送******************
  80. void  SeriPushSend(uchar send_data)
  81. {
  82.     SBUF=send_data;  
  83.         while(!TI);TI=0;          
  84. }


  85. //*********************************************************
  86. void conversion(long temp_data)  
  87. {  
  88.    
  89.     shiwan=temp_data/100000+0x30 ;
  90.     temp_data=temp_data%100000;   //取余運算
  91.     wan=temp_data/10000+0x30 ;
  92.     temp_data=temp_data%10000;   //取余運算
  93.         qian=temp_data/1000+0x30 ;
  94.     temp_data=temp_data%1000;    //取余運算
  95.     bai=temp_data/100+0x30   ;
  96.     temp_data=temp_data%100;     //取余運算
  97.     shi=temp_data/10+0x30    ;
  98.     temp_data=temp_data%10;      //取余運算
  99.     ge=temp_data+0x30;        
  100. }

  101. /*******************************/
  102. void delay(unsigned int k)       
  103. {                                               
  104. unsigned int i,j;                               
  105. for(i=0;i<k;i++)
  106. {                       
  107. for(j=0;j<121;j++)                       
  108. {;}}                                               
  109. }
  110.                        
  111. /***********************************/
  112.                                                

  113. /**************************************
  114. 延時5微秒(STC90C52RC@12M)
  115. 不同的工作環境,需要調整此函數,注意時鐘過快時需要修改
  116. 當改用1T的MCU時,請調整此延時函數
  117. **************************************/
  118. void Delay5us()
  119. {
  120.     _nop_();_nop_();_nop_();_nop_();
  121.     _nop_();_nop_();_nop_();_nop_();
  122.         _nop_();_nop_();_nop_();_nop_();
  123.         _nop_();_nop_();_nop_();_nop_();
  124.         _nop_();_nop_();_nop_();_nop_();
  125.         _nop_();_nop_();_nop_();_nop_();
  126. }

  127. /**************************************
  128. 延時5毫秒(STC90C52RC@12M)
  129. 不同的工作環境,需要調整此函數
  130. 當改用1T的MCU時,請調整此延時函數
  131. **************************************/
  132. void Delay5ms()
  133. {
  134.     WORD n = 560;

  135.     while (n--);
  136. }

  137. /**************************************
  138. 起始信號
  139. **************************************/
  140. void BMP085_Start()
  141. {
  142.     SDA = 1;                    //拉高數據線
  143.     SCL = 1;                    //拉高時鐘線
  144.     Delay5us();                 //延時
  145.     SDA = 0;                    //產生下降沿
  146.     Delay5us();                 //延時
  147.     SCL = 0;                    //拉低時鐘線
  148. }

  149. /**************************************
  150. 停止信號
  151. **************************************/
  152. void BMP085_Stop()
  153. {
  154.     SDA = 0;                    //拉低數據線
  155.     SCL = 1;                    //拉高時鐘線
  156.     Delay5us();                 //延時
  157.     SDA = 1;                    //產生上升沿
  158.     Delay5us();                 //延時
  159. }

  160. /**************************************
  161. 發送應答信號
  162. 入口參數:ack (0:ACK 1:NAK)
  163. **************************************/
  164. void BMP085_SendACK(bit ack)
  165. {
  166.     SDA = ack;                  //寫應答信號
  167.     SCL = 1;                    //拉高時鐘線
  168.     Delay5us();                 //延時
  169.     SCL = 0;                    //拉低時鐘線
  170.     Delay5us();                 //延時
  171. }

  172. /**************************************
  173. 接收應答信號
  174. **************************************/
  175. bit BMP085_RecvACK()
  176. {
  177.     SCL = 1;                    //拉高時鐘線
  178.     Delay5us();                 //延時
  179.     CY = SDA;                   //讀應答信號
  180.     SCL = 0;                    //拉低時鐘線
  181.     Delay5us();                 //延時

  182.     return CY;
  183. }

  184. /**************************************
  185. 向IIC總線發送一個字節數據
  186. **************************************/
  187. void BMP085_SendByte(BYTE dat)
  188. {
  189.     BYTE i;

  190.     for (i=0; i<8; i++)         //8位計數器
  191.     {
  192.         dat <<= 1;              //移出數據的最高位
  193.         SDA = CY;               //送數據口
  194.         SCL = 1;                //拉高時鐘線
  195.         Delay5us();             //延時
  196.         SCL = 0;                //拉低時鐘線
  197.         Delay5us();             //延時
  198.     }
  199.     BMP085_RecvACK();
  200. }

  201. /**************************************
  202. 從IIC總線接收一個字節數據
  203. **************************************/
  204. BYTE BMP085_RecvByte()
  205. {
  206.     BYTE i;
  207.     BYTE dat = 0;

  208.     SDA = 1;                    //使能內部上拉,準備讀取數據,
  209.     for (i=0; i<8; i++)         //8位計數器
  210.     {
  211.         dat <<= 1;
  212.         SCL = 1;                //拉高時鐘線
  213.         Delay5us();             //延時
  214.         dat |= SDA;             //讀數據               
  215.         SCL = 0;                //拉低時鐘線
  216.         Delay5us();             //延時
  217.     }
  218.     return dat;
  219. }
  220. /*
  221. //單字節寫入BMP085內部數據*******************************

  222. void Single_Write(uchar SlaveAddress,uchar REG_Address,uchar REG_data)
  223. {
  224.     BMP085_Start();                  //起始信號
  225.     BMP085_SendByte(SlaveAddress);   //發送設備地址+寫信號
  226.     BMP085_SendByte(REG_Address);    //內部寄存器地址
  227.     BMP085_SendByte(REG_data);       //內部寄存器數據
  228.     BMP085_Stop();                   //發送停止信號
  229. }
  230. */
  231. /*
  232. //單字節讀取BMP085內部數據********************************
  233. uchar Single_Read(uchar REG_Address)
  234. {  uchar REG_data;
  235.     BMP085_Start();                          //起始信號
  236.     BMP085_SendByte(BMP085_SlaveAddress);           //發送設備地址+寫信號
  237.     BMP085_SendByte(REG_Address);            //發送存儲單元地址       
  238.     BMP085_Start();                          //起始信號
  239.     BMP085_SendByte(BMP085_SlaveAddress+1);         //發送設備地址+讀信號
  240.     REG_data=BMP085_RecvByte();              //讀出寄存器數據
  241.         BMP085_SendACK(1);   
  242.         BMP085_Stop();                           //停止信號
  243.     return REG_data;
  244. }
  245. */
  246. //*********************************************************
  247. //讀出BMP085內部數據,連續兩個
  248. //*********************************************************
  249. short Multiple_read(uchar ST_Address)
  250. {   
  251.         uchar msb, lsb;
  252.         short _data;
  253.     BMP085_Start();                          //起始信號
  254.     BMP085_SendByte(BMP085_SlaveAddress);    //發送設備地址+寫信號
  255.     BMP085_SendByte(ST_Address);             //發送存儲單元地址
  256.     BMP085_Start();                          //起始信號
  257.     BMP085_SendByte(BMP085_SlaveAddress+1);         //發送設備地址+讀信號

  258.     msb = BMP085_RecvByte();                 //BUF[0]存儲
  259.     BMP085_SendACK(0);                       //回應ACK
  260.     lsb = BMP085_RecvByte();     
  261.         BMP085_SendACK(1);                       //最后一個數據需要回NOACK

  262.     BMP085_Stop();                           //停止信號
  263.     Delay5ms();
  264.     _data = msb << 8;
  265.         _data |= lsb;       
  266.         return _data;
  267. }
  268. //********************************************************************
  269. long bmp085ReadTemp(void)
  270. {

  271.     BMP085_Start();                  //起始信號
  272.     BMP085_SendByte(BMP085_SlaveAddress);   //發送設備地址+寫信號
  273.     BMP085_SendByte(0xF4);                  // write register address
  274.     BMP085_SendByte(0x2E);               // write register data for temp
  275.     BMP085_Stop();                   //發送停止信號
  276.         delay(10);        // max time is 4.5ms
  277.        
  278.         return (long) Multiple_read(0xF6);

  279. }
  280. //*************************************************************
  281. long bmp085ReadPressure(void)
  282. {
  283.         long pressure = 0;

  284.     BMP085_Start();                   //起始信號
  285.     BMP085_SendByte(BMP085_SlaveAddress);   //發送設備地址+寫信號
  286.     BMP085_SendByte(0xF4);                  // write register address
  287.     BMP085_SendByte(0x34);                 // write register data for pressure
  288.     BMP085_Stop();                    //發送停止信號
  289.         delay(20);                              // max time is 4.5ms
  290.        
  291.         pressure = Multiple_read(0xF6);
  292.         pressure &= 0x0000FFFF;
  293.        
  294.         return pressure;       

  295.         //return (long) bmp085ReadShort(0xF6);
  296. }

  297. //**************************************************************

  298. //初始化BMP085,根據需要請參考pdf進行修改**************
  299. void Init_BMP085()
  300. {
  301.         ac1 = Multiple_read(0xAA);
  302.         ac2 = Multiple_read(0xAC);
  303.         ac3 = Multiple_read(0xAE);
  304.         ac4 = Multiple_read(0xB0);
  305.         ac5 = Multiple_read(0xB2);
  306.         ac6 = Multiple_read(0xB4);
  307.         b1 =  Multiple_read(0xB6);
  308.         b2 =  Multiple_read(0xB8);
  309.         mb =  Multiple_read(0xBA);
  310.         mc =  Multiple_read(0xBC);
  311.         md =  Multiple_read(0xBE);
  312. }
  313. //***********************************************************************
  314. void bmp085Convert()
  315. {
  316.         unsigned int ut;
  317.         unsigned long up;
  318.         long x1, x2, b5, b6, x3, b3, p;
  319.         unsigned long b4, b7;

  320.         ut = bmp085ReadTemp();           // 讀取溫度
  321. //        ut = bmp085ReadTemp();           // 讀取溫度
  322.         up = bmp085ReadPressure();  // 讀取壓強
  323. //        up = bmp085ReadPressure();  // 讀取壓強
  324.         x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
  325.         x2 = ((long) mc << 11) / (x1 + md);
  326.         b5 = x1 + x2;
  327.          temperature = ((b5 + 8) >> 4);

  328.          //*************


  329.   b6 = b5 - 4000;
  330.   // Calculate B3
  331.   x1 = (b2 * (b6 * b6)>>12)>>11;
  332.   x2 = (ac2 * b6)>>11;
  333.   x3 = x1 + x2;
  334.   b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;
  335.   
  336.   // Calculate B4
  337.   x1 = (ac3 * b6)>>13;
  338.   x2 = (b1 * ((b6 * b6)>>12))>>16;
  339.   x3 = ((x1 + x2) + 2)>>2;
  340.   b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;
  341.   
  342.   b7 = ((unsigned long)(up - b3) * (50000>>OSS));
  343.   if (b7 < 0x80000000)
  344.     p = (b7<<1)/b4;
  345.   else
  346.     p = (b7/b4)<<1;
  347.    
  348.   x1 = (p>>8) * (p>>8);
  349.   x1 = (x1 * 3038)>>16;
  350.   x2 = (-7357 * p)>>16;
  351. pressure = p+((x1 + x2 + 3791)>>4);

  352. }

  353. //*********************************************************
  354. //******主程序********
  355. //*********************************************************
  356. void main()
  357. {
  358.     delay(100);                           //上電延時               
  359.     init_uart();                  
  360.     Init_BMP085();                //初始化BMP085
  361.   while(1)                         //循環
  362.   {
  363.     Init_BMP085();

  364.     bmp085Convert();


  365.          conversion(temperature);
  366.          SeriPushSend('T');       //溫度顯示
  367.      SeriPushSend(':');
  368.      SeriPushSend(bai);      
  369.      SeriPushSend(shi);
  370.      SeriPushSend('.');
  371.          SeriPushSend(ge);

  372.          SeriPushSend(' ');
  373.          SeriPushSend(' ');
  374.          conversion(pressure);
  375.      SeriPushSend('P');    //顯示壓強
  376.      SeriPushSend(':');
  377.          SeriPushSend(shiwan);
  378.          SeriPushSend(wan);   
  379.      SeriPushSend(qian);
  380.      SeriPushSend('.');
  381.      SeriPushSend(bai);
  382.      SeriPushSend(shi);
  383.          SeriPushSend('K');   //氣壓單位
  384.          SeriPushSend('p');
  385.          SeriPushSend('a');

  386.         SeriPushSend(0x0d);
  387.         SeriPushSend(0x0a);
  388.         delay(100);
  389.   }
  390. }
復制代碼



全部資料下載含有Arduino 51單片機和avr源碼:
【Realplay】BOSCH BMP085 數字式氣溫氣壓模塊 高度計模塊GY-65.rar (1.67 MB, 下載次數: 42)

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

使用道具 舉報

沙發
ID:211697 發表于 2017-11-6 17:32 | 只看該作者
樓主在嗎?
arduino UNO怎么接線啊
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕一页二页 | 91色网站| 久久久久久亚洲 | 国产欧美日韩一区二区三区 | 欧美一区免费 | 欧美videosex性极品hd | 一级一级毛片免费看 | 免费在线黄色av | 天堂中文av| 一区二区三区精品在线 | 亚洲天堂一区 | 国产成人精品一区二 | 日韩国产精品一区二区三区 | 久久91| 99久久婷婷国产综合精品电影 | 国产亚洲精品综合一区 | 欧产日产国产精品99 | 久久久www成人免费无遮挡大片 | 国产在线一区二区三区 | 亚洲 自拍 另类 欧美 丝袜 | 久久99网 | 欧美影院 | 国产精品视频观看 | 国产精品美女久久久久aⅴ国产馆 | 欧美精品在线一区二区三区 | 欧美色综合 | 中文字幕亚洲视频 | 国户精品久久久久久久久久久不卡 | 成人做爰www免费看视频网站 | 天天操天天射天天舔 | 国产午夜精品福利 | 精品国产黄a∨片高清在线 www.一级片 国产欧美日韩综合精品一区二区 | 成人国内精品久久久久一区 | 一区二区三区在线 | 国产亚洲一区二区三区在线 | 亚洲+变态+欧美+另类+精品 | 91色网站| 2021狠狠干| 午夜视频免费在线观看 | 少妇无套高潮一二三区 | 91精品国产91久久久久久吃药 |