找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5992|回复: 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 单片机教程网

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