搜索
bottom↓
回复: 8

MSP430F149的BMP085大气压强传感器的移植...已成功,附测试驱动

[复制链接]

出0入0汤圆

发表于 2012-11-30 02:02:41 | 显示全部楼层 |阅读模式
本帖最后由 delay_year 于 2012-11-30 13:04 编辑

这个是从C51移植过来的,读出来的数据是错的,读出来的温度和压强一直的跳,而且有乱码,IIC是按照规格书写的,其它都没动过,有没有哪位高手驱动成功的啊,这IC的驱动搞了快一个月了,网上关于430的参考可以说根本没有,而且IC很难焊。。。风枪吹一下就坏了。。只能买模块了
有高手能不能给个430能用的驱动啊。。。开源,学习,非常感谢!!!

单片机使用的是MSP430F149,系统时钟配置成8MHz,用的显示器是NOKIA5110,用IAR编译,C51正常实测T在20度左右,P在100Kpa左右





-----------------------------------------------------------------分割线-------------------------------------------------------------------------------

最终还是IIC的问题!以下代码已调试成功!感谢大家的关注!虽然430板块不是很活跃。。。

  1. 单片机:MSP430F149
  2. 时钟配置:8MHz
  3. 显示器:LCD5110
  4. #include  <msp430x14x.H>          
  5. #include  <math.h>    //Keil library
  6. #include "nokia_5110.c"
  7. #include "nokia_5110.h"
  8. #define   CPU_F ((double)8000000) //定义CPU主频大小
  9. #define   delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))//延时Nus
  10. #define   delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))//延时Nms
  11. #define   uchar unsigned char
  12. #define   uint  unsigned int       

  13. #define BMP085_IIC_IOinit  P5DIR |= BIT5+BIT6; P5OUT |= BIT5+BIT6//端口初始化

  14. #define BMP085_SCL_1     P5OUT |= BIT5
  15. #define BMP085_SCL_0     P5OUT &= ~BIT5
  16. #define BMP085_SCL_OUT   P5DIR |= BIT5    //SDA变回输出模式

  17. #define BMP085_SDA_1     P5OUT |= BIT6
  18. #define BMP085_SDA_0     P5OUT &= ~BIT6

  19. #define BMP085_SDA_IN    P5DIR &= ~BIT6   //SDA改成输入模式
  20. #define BMP085_SDA_OUT   P5DIR |= BIT6    //SDA变回输出模式
  21. #define BMP085_SDA_VAL   P5IN&BIT6        //SDA的位值


  22. #define   BMP085_SlaveAddress   0xee    //定义器件在IIC总线中的从地址
  23. #define   OSS     0 // Oversampling Setting (note: code is not set up to use other OSS values)
  24.        
  25. uchar ge,shi,bai,qian,wan,shiwan;           //显示变量
  26. int  dis_data;                              //变量

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

  38. void conversion(long temp_data);
  39. void  Single_Write(uchar SlaveAddress,uchar REG_Address,uchar REG_data);   //单个写入数据
  40. uchar Single_Read(uchar REG_Address);                                      //单个读取内部寄存器数据
  41. void  Multiple_Read(uchar,uchar);                                          //连续的读取内部寄存器数据
  42. //------------------------------------
  43. void BMP085_Start();
  44. void BMP085_Stop();
  45. void BMP085_SendACK(unsigned char ack);
  46. unsigned char  BMP085_RecvACK();
  47. void BMP085_SendByte(unsigned int dat);
  48. unsigned int BMP085_RecvByte();
  49. void BMP085_ReadPage();
  50. void BMP085_WritePage();
  51. //-----------------------------------

  52. /*******************************************
  53. 函数名称:delay_15us
  54. 功    能:延时约15us的时间
  55. ********************************************/
  56. void delay_15us(void)
  57. {
  58.     //uchar i;
  59.     //for(i = 0;i < 5;i++)
  60.     //_NOP();
  61.     delay_us(5);
  62. }

  63. void conversion(long temp_data)  
  64. {  
  65.     shiwan=temp_data/100000+0x30 ;
  66.     temp_data=temp_data%100000;   //取余运算
  67.     wan=temp_data/10000+0x30 ;
  68.     temp_data=temp_data%10000;   //取余运算
  69.     qian=temp_data/1000+0x30 ;
  70.     temp_data=temp_data%1000;    //取余运算
  71.     bai=temp_data/100+0x30   ;
  72.     temp_data=temp_data%100;     //取余运算
  73.     shi=temp_data/10+0x30    ;
  74.     temp_data=temp_data%10;      //取余运算
  75.     ge=temp_data+0x30;        
  76. }

  77. /**************************************
  78. 起始信号
  79. **************************************/
  80. void BMP085_Start()
  81. {   
  82.     BMP085_SCL_OUT;
  83.     BMP085_SDA_OUT;
  84.    
  85.     BMP085_SCL_1;
  86.     BMP085_SDA_1;
  87.     delay_15us();
  88.     BMP085_SDA_0;
  89.     delay_15us();
  90.     BMP085_SCL_0;
  91.     delay_15us();
  92. }
  93. /**************************************
  94. 停止信号
  95. **************************************/
  96. void BMP085_Stop()
  97. {
  98.     BMP085_SDA_OUT;
  99.     BMP085_SCL_OUT;
  100.    
  101.     BMP085_SDA_0;
  102.     delay_15us();
  103.     BMP085_SCL_1;
  104.     delay_15us();
  105.     BMP085_SDA_1;
  106.     delay_15us();
  107.     delay_15us();       
  108.     //delay_15us();       
  109.     //delay_15us();
  110. }
  111. /*******************************************
  112. 函数名称:mack
  113. 功    能:完成IIC 应答操作
  114. ********************************************/
  115. void Sendack(void)
  116. {
  117.     BMP085_SDA_OUT;
  118.     BMP085_SCL_OUT;
  119.    
  120.     BMP085_SDA_0;
  121.     _NOP(); _NOP();
  122.     BMP085_SCL_1;
  123.     delay_15us();
  124.     BMP085_SCL_0;
  125.     _NOP();_NOP();
  126.     BMP085_SDA_1;     
  127.     delay_15us();
  128. }
  129. /*******************************************
  130. 函数名称:mnack
  131. 功    能:完成IIC 无应答操作
  132. ********************************************/
  133. void Sendnack(void)
  134. {
  135.     BMP085_SDA_OUT;
  136.     BMP085_SCL_OUT;
  137.    
  138.     BMP085_SDA_1;
  139.     _NOP(); _NOP();
  140.     BMP085_SCL_1;
  141.     delay_15us();
  142.     BMP085_SCL_0;
  143.     _NOP(); _NOP();
  144.     BMP085_SDA_0;   
  145.     delay_15us();      
  146. }
  147. /**************************************
  148. 接收应答信号
  149. **************************************/
  150. unsigned char BMP085_RecvACK()
  151. {
  152.     uchar slaveack;
  153.    
  154.     BMP085_SDA_OUT;
  155.     BMP085_SCL_OUT;
  156.    
  157.     BMP085_SDA_1;
  158.     _NOP(); _NOP();
  159.     BMP085_SCL_1;
  160.     _NOP(); _NOP();
  161.     BMP085_SDA_IN;
  162.     _NOP(); _NOP();
  163.     slaveack = BMP085_SDA_VAL;   //读入SDA数值
  164.     BMP085_SCL_0;
  165.     delay_15us();
  166.     BMP085_SDA_OUT;
  167.     if(slaveack)    return 0;
  168.     else            return 1;
  169. }
  170. /*******************************************
  171. 函数名称:write1
  172. 功    能:向IIC总线发送一个1
  173. ********************************************/
  174. void write1(void)
  175. {
  176.     BMP085_SDA_OUT;
  177.     BMP085_SCL_OUT;
  178.    
  179.     BMP085_SDA_1;
  180.     delay_15us();
  181.     BMP085_SCL_1;
  182.     delay_15us();
  183.     BMP085_SCL_0;                               
  184.     delay_15us();
  185. }
  186. /*******************************************
  187. 函数名称:write0
  188. 功    能:向IIC总线发送一个0
  189. ********************************************/
  190. void write0(void)
  191. {
  192.     BMP085_SDA_OUT;
  193.     BMP085_SCL_OUT;
  194.    
  195.     BMP085_SDA_0;
  196.     delay_15us();
  197.     BMP085_SCL_1;
  198.     delay_15us();                         
  199.     BMP085_SCL_0;                               
  200.     delay_15us();
  201. }
  202. /**************************************
  203. 向IIC总线发送一个字节数据
  204. **************************************/
  205. void BMP085_SendByte(unsigned int dat)
  206. {
  207.     uchar i;
  208.     for(i = 8;i > 0;i--)
  209.     {
  210.       if(dat & 0x80)write1();
  211.       else write0();
  212.       dat <<= 1;
  213.     }
  214.     BMP085_SDA_1;
  215.     _NOP();
  216.     BMP085_RecvACK();
  217. }
  218. /**************************************
  219. 从IIC总线接收一个字节数据
  220. **************************************/
  221. unsigned int BMP085_RecvByte()
  222. {
  223.     uchar rdata = 0x00,i;
  224.     uchar flag;
  225.     for(i = 0;i < 8;i++)
  226.     {
  227.         BMP085_SDA_1;
  228.         delay_15us();
  229.         BMP085_SCL_1;
  230.         BMP085_SDA_IN;
  231.         delay_15us();
  232.         flag = BMP085_SDA_VAL;
  233.         rdata <<= 1;
  234.         if(flag)rdata |= 0x01;
  235.         BMP085_SDA_OUT;
  236.         BMP085_SCL_0;
  237.         delay_15us();
  238.     }
  239.     return rdata;
  240. }
  241. //*********************************************************
  242. //读出BMP085内部数据,连续两个
  243. //*********************************************************
  244. short Multiple_read(uchar ST_Address)
  245. {   
  246.     uchar msb, lsb;
  247.     short _data;
  248.     BMP085_Start();                          //起始信号
  249.     BMP085_SendByte(BMP085_SlaveAddress);    //发送设备地址+写信号
  250.     BMP085_SendByte(ST_Address);             //发送存储单元地址
  251.     BMP085_Start();                          //起始信号
  252.     BMP085_SendByte(BMP085_SlaveAddress+1);         //发送设备地址+读信号

  253.     msb = BMP085_RecvByte();                 //BUF[0]存储
  254.     Sendack();                       //回应ACK
  255.     lsb = BMP085_RecvByte();     
  256.     Sendnack();                       //最后一个数据需要回NOACK

  257.     BMP085_Stop();                           //停止信号
  258.     delay_ms(5);
  259.     _data = msb << 8;
  260.     _data |= lsb;       
  261.     return _data;
  262. }
  263. //********************************************************************
  264. long bmp085ReadTemp(void)
  265. {
  266.     BMP085_Start();                  //起始信号
  267.     BMP085_SendByte(BMP085_SlaveAddress);   //发送设备地址+写信号
  268.     BMP085_SendByte(0xF4);                  // write register address
  269.     BMP085_SendByte(0x2E);       // write register data for temp
  270.     BMP085_Stop();                   //发送停止信号
  271.     delay_ms(4);        // max time is 4.5ms
  272.     return (long) Multiple_read(0xF6);
  273. }
  274. //*************************************************************
  275. long bmp085ReadPressure(void)
  276. {
  277.     long pressure = 0;
  278.     BMP085_Start();                   //起始信号
  279.     BMP085_SendByte(BMP085_SlaveAddress);   //发送设备地址+写信号
  280.     BMP085_SendByte(0xF4);                  // write register address
  281.     BMP085_SendByte(0x34);                 // write register data for pressure
  282.     BMP085_Stop();                    //发送停止信号
  283.     delay_ms(4);                              // max time is 4.5ms
  284.     pressure = Multiple_read(0xF6);
  285.     pressure &= 0x0000FFFF;
  286.     return pressure;       
  287.     //return (long) bmp085ReadShort(0xF6);
  288. }
  289. void Init_BMP085()   //初始化BMP085
  290. {
  291.     ac1 = Multiple_read(0xAA);
  292.     ac2 = Multiple_read(0xAC);
  293.     ac3 = Multiple_read(0xAE);
  294.     ac4 = Multiple_read(0xB0);
  295.     ac5 = Multiple_read(0xB2);
  296.     ac6 = Multiple_read(0xB4);
  297.     b1 =  Multiple_read(0xB6);
  298.     b2 =  Multiple_read(0xB8);
  299.     mb =  Multiple_read(0xBA);
  300.     mc =  Multiple_read(0xBC);
  301.     md =  Multiple_read(0xBE);
  302. }

  303. void bmp085Convert()
  304. {
  305.     long ut;
  306.     long up;
  307.     long x1, x2, b5, b6, x3, b3, p;
  308.     unsigned long b4, b7;
  309.     long  temperature;
  310.     long  pressure;
  311.    
  312.     ut = bmp085ReadTemp();
  313.     ut = bmp085ReadTemp();           // 读取温度
  314.     up = bmp085ReadPressure();
  315.     up = bmp085ReadPressure();  // 读取压强
  316.    
  317.     x1 = ((long)ut - ac6) * ac5 >> 15;
  318.     x2 = ((long) mc << 11) / (x1 + md);
  319.     b5 = x1 + x2;
  320.     temperature = (b5 + 8) >> 4;
  321.     //*************
  322.    
  323.     conversion(temperature);
  324.     LCD_set_XY(0,1);
  325.     LCD_write_char('T');       //温度显示
  326.     LCD_write_char(':');
  327.     LCD_write_char(bai);      
  328.     LCD_write_char(shi);
  329.     LCD_write_char('.');
  330.     LCD_write_char(ge);
  331.     LCD_write_char('C');
  332.     //*************
  333.    
  334.     b6 = b5 - 4000;
  335.     x1 = (b2 * (b6 * b6 >> 12)) >> 11;
  336.     x2 = ac2 * b6 >> 11;
  337.     x3 = x1 + x2;
  338.     b3 = (((long)ac1 * 4 + x3) + 2)/4;
  339.     x1 = ac3 * b6 >> 13;
  340.     x2 = (b1 * (b6 * b6 >> 12)) >> 16;
  341.     x3 = ((x1 + x2) + 2) >> 2;
  342.     b4 = (ac4 * (unsigned long) (x3 + 32768)) >> 15;
  343.     b7 = ((unsigned long) up - b3) * (50000 >> OSS);
  344.     if( b7 < 0x80000000)
  345.     p = (b7 * 2) / b4 ;
  346.     else  
  347.     p = (b7 / b4) * 2;
  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.     conversion(pressure);
  354.     LCD_set_XY(0,2);
  355.     LCD_write_char('P');    //显示压强
  356.     LCD_write_char(':');
  357.     LCD_write_char(shiwan);
  358.     LCD_write_char(wan);   
  359.     LCD_write_char(qian);
  360.     LCD_write_char('.');
  361.     LCD_write_char(bai);
  362.     LCD_write_char(shi);
  363.     LCD_write_char('K');   //气压单位
  364.     LCD_write_char('p');
  365.     LCD_write_char('a');
  366. }
  367. //**********************************************//
  368. //              系统时钟初始化
  369. //**********************************************//
  370. void InitSys()
  371. {
  372.      unsigned int iq0;
  373.      _DINT();
  374.      BCSCTL1 &=~XT2OFF;     //打开TX振荡器
  375.      BCSCTL2 |=SELM1+SELS;//MCLK为8MHz,SMCLK为1MHz
  376.      do
  377.      {
  378.         IFG1 &= ~OFIFG;                        // 清除振荡器失效标志
  379.         for(iq0 = 0xFF; iq0 > 0; iq0--);          // 延时,等待XT2起振
  380.      }
  381.      while ((IFG1 & OFIFG) != 0);                        // 判断XT2是否起振               
  382.      //BCSCTL2 =SELM0+SELS;                      //MCLK,SMCLK时钟为XT2
  383.      IFG1 &= ~OFIFG;                      // 清除振荡器失效标志
  384. }
  385. void main()
  386. {
  387.     WDTCTL = WDTPW + WDTHOLD;
  388.     InitSys();
  389.     BMP085_IIC_IOinit;
  390.     delay_ms(50);                           //上电延时
  391.     Init_BMP085();                //初始化BMP085
  392.     LCD_init();
  393.      
  394.     while(1)                         //循环
  395.     {
  396.         bmp085Convert();
  397.         delay_ms(1000);
  398.     }
  399. }

复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2012-11-30 10:46:59 | 显示全部楼层
1、以前在C51上运行没问题吗?
2、看你是模拟的IIC,把速度降下来怎么样?
3、用示波器看看波形。

出0入0汤圆

 楼主| 发表于 2012-11-30 11:23:54 | 显示全部楼层
qiuchen 发表于 2012-11-30 10:46
1、以前在C51上运行没问题吗?
2、看你是模拟的IIC,把速度降下来怎么样?
3、用示波器看看波形。 ...

1、在C51上是没有问题的 用的是AT89S52   12MHz
2、是用模拟的IIC,试过配置成1MHz的和32.768KHz的,要么数据在跳,要么数据固定不跳不动
3、同样的IIC我参考了另外一个传感器的驱动的,同样是用IIC的,但是那个传感器却能用了,是磁阻传感器。

附C51的BMP085能用的代码:

  1. //***************************************
  2. // BMP085 IIC测试程序
  3. // 使用单片机STC89C51
  4. // 晶振:11.0592M
  5. // 显示:LCD1602
  6. // 编译环境 Keil uVision2
  7. // 参考宏晶网站24c04通信程序
  8. // 时间:2011年7月1日
  9. //****************************************
  10. #include  <REG51.H>          
  11. #include  <math.h>    //Keil library  
  12. #include  <stdlib.h>  //Keil library  
  13. #include  <stdio.h>   //Keil library       
  14. #include  <INTRINS.H> //Keil library  
  15. #define   uchar unsigned char
  16. #define   uint unsigned int       
  17. #define   DataPort P2    //LCD1602数据端口
  18. sbit          SCL=P1^1;      //IIC时钟引脚定义
  19. sbit           SDA=P1^0;      //IIC数据引脚定义
  20. sbit      LCM_RS=P0^5;   //LCD1602命令端口               
  21. sbit      LCM_RW=P0^6;   //LCD1602命令端口               
  22. sbit      LCM_EN=P0^7;   //LCD1602命令端口

  23. #define        BMP085_SlaveAddress   0xee          //定义器件在IIC总线中的从地址                              

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

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

  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. void conversion(long temp_data)  
  65. {  
  66.    
  67.     shiwan=temp_data/100000+0x30 ;
  68.     temp_data=temp_data%100000;   //取余运算
  69.     wan=temp_data/10000+0x30 ;
  70.     temp_data=temp_data%10000;   //取余运算
  71.         qian=temp_data/1000+0x30 ;
  72.     temp_data=temp_data%1000;    //取余运算
  73.     bai=temp_data/100+0x30   ;
  74.     temp_data=temp_data%100;     //取余运算
  75.     shi=temp_data/10+0x30    ;
  76.     temp_data=temp_data%10;      //取余运算
  77.     ge=temp_data+0x30;        
  78. }

  79. /*******************************/
  80. void delay(unsigned int k)       
  81. {                                               
  82. unsigned int i,j;                               
  83. for(i=0;i<k;i++)
  84. {                       
  85. for(j=0;j<121;j++)                       
  86. {;}}                                               
  87. }
  88. /*******************************/
  89. void WaitForEnable(void)       
  90. {                                       
  91. DataPort=0xff;               
  92. LCM_RS=0;LCM_RW=1;_nop_();
  93. LCM_EN=1;_nop_();_nop_();
  94. while(DataPort&0x80);       
  95. LCM_EN=0;                               
  96. }                                       
  97. /*******************************/
  98. void WriteCommandLCM(uchar CMD,uchar Attribc)
  99. {                                       
  100. if(Attribc)WaitForEnable();       
  101. LCM_RS=0;LCM_RW=0;_nop_();
  102. DataPort=CMD;_nop_();       
  103. LCM_EN=1;_nop_();_nop_();LCM_EN=0;
  104. }                                       
  105. /*******************************/
  106. void WriteDataLCM(uchar dataW)
  107. {                                       
  108. WaitForEnable();               
  109. LCM_RS=1;LCM_RW=0;_nop_();
  110. DataPort=dataW;_nop_();       
  111. LCM_EN=1;_nop_();_nop_();LCM_EN=0;
  112. }               
  113. /***********************************/
  114. void InitLcd()                               
  115. {                       
  116. WriteCommandLCM(0x38,1);       
  117. WriteCommandLCM(0x08,1);       
  118. WriteCommandLCM(0x01,1);       
  119. WriteCommandLCM(0x06,1);       
  120. WriteCommandLCM(0x0c,1);
  121. }                       
  122. /***********************************/
  123. void DisplayOneChar(uchar X,uchar Y,uchar DData)
  124. {                                               
  125.     Y&=1;                                               
  126.     X&=15;                                               
  127.     if(Y)X|=0x40;                                       
  128.     X|=0x80;                       
  129.     WriteCommandLCM(X,0);               
  130.     WriteDataLCM(DData);               
  131. }                                               

  132. /**************************************
  133. 延时5微秒(STC90C52RC@12M)
  134. 不同的工作环境,需要调整此函数,注意时钟过快时需要修改
  135. 当改用1T的MCU时,请调整此延时函数
  136. **************************************/
  137. void Delay5us()
  138. {
  139.     _nop_();_nop_();_nop_();_nop_();
  140.     _nop_();_nop_();_nop_();_nop_();
  141.         _nop_();_nop_();_nop_();_nop_();
  142.         _nop_();_nop_();_nop_();_nop_();
  143. }

  144. /**************************************
  145. 延时5毫秒(STC90C52RC@12M)
  146. 不同的工作环境,需要调整此函数
  147. 当改用1T的MCU时,请调整此延时函数
  148. **************************************/
  149. void Delay5ms()
  150. {
  151.     WORD n = 560;
  152.     while (n--);
  153. }

  154. /**************************************
  155. 起始信号
  156. **************************************/
  157. void BMP085_Start()
  158. {
  159.       SDA = 1;                    //拉高数据线
  160.     SCL = 1;                    //拉高时钟线
  161.     Delay5us();                 //延时
  162.     SDA = 0;                    //产生下降沿
  163.     Delay5us();                 //延时
  164.     SCL = 0;                    //拉低时钟线
  165. }

  166. /**************************************
  167. 停止信号
  168. **************************************/
  169. void BMP085_Stop()
  170. {
  171.       SDA = 0;                    //拉低数据线
  172.     SCL = 1;                    //拉高时钟线
  173.     Delay5us();                 //延时
  174.     SDA = 1;                    //产生上升沿
  175.     Delay5us();                 //延时
  176. }

  177. /**************************************
  178. 发送应答信号
  179. 入口参数:ack (0:ACK 1:NAK)
  180. **************************************/
  181. void BMP085_SendACK(bit ack)
  182. {
  183.       SDA = ack;                  //写应答信号
  184.     SCL = 1;                    //拉高时钟线
  185.     Delay5us();                 //延时
  186.     SCL = 0;                    //拉低时钟线
  187.     Delay5us();                 //延时
  188. }

  189. /**************************************
  190. 接收应答信号
  191. **************************************/
  192. bit BMP085_RecvACK()
  193. {
  194.       SCL = 1;                    //拉高时钟线
  195.     Delay5us();                 //延时
  196.     CY = SDA;                   //读应答信号
  197.     SCL = 0;                    //拉低时钟线
  198.     Delay5us();                 //延时

  199.     return CY;
  200. }

  201. /**************************************
  202. 向IIC总线发送一个字节数据
  203. **************************************/
  204. void BMP085_SendByte(BYTE dat)
  205. {
  206.     BYTE i;

  207.     for (i=0; i<8; i++)         //8位计数器
  208.     {
  209.             dat <<= 1;              //移出数据的最高位
  210.         SDA = CY;               //送数据口
  211.         SCL = 1;                //拉高时钟线
  212.         Delay5us();             //延时
  213.         SCL = 0;                //拉低时钟线
  214.         Delay5us();             //延时
  215.     }
  216.     BMP085_RecvACK();
  217. }

  218. /**************************************
  219. 从IIC总线接收一个字节数据
  220. **************************************/
  221. BYTE BMP085_RecvByte()
  222. {
  223.     BYTE i;
  224.     BYTE dat = 0;

  225.     SDA = 1;                    //使能内部上拉,准备读取数据,
  226.     for (i=0; i<8; i++)         //8位计数器
  227.     {
  228.             dat <<= 1;
  229.             SCL = 1;                //拉高时钟线
  230.         Delay5us();             //延时
  231.         dat |= SDA;             //读数据               
  232.         SCL = 0;                //拉低时钟线
  233.         Delay5us();             //延时
  234.     }
  235.     return dat;
  236. }
  237. /*
  238. //单字节写入BMP085内部数据*******************************

  239. void Single_Write(uchar SlaveAddress,uchar REG_Address,uchar REG_data)
  240. {
  241.       BMP085_Start();                  //起始信号
  242.     BMP085_SendByte(SlaveAddress);   //发送设备地址+写信号
  243.     BMP085_SendByte(REG_Address);    //内部寄存器地址
  244.     BMP085_SendByte(REG_data);       //内部寄存器数据
  245.     BMP085_Stop();                   //发送停止信号
  246. }
  247. */
  248. /*
  249. //单字节读取BMP085内部数据********************************
  250. uchar Single_Read(uchar REG_Address)
  251. {  
  252.       uchar REG_data;
  253.       BMP085_Start();                          //起始信号
  254.     BMP085_SendByte(BMP085_SlaveAddress);           //发送设备地址+写信号
  255.     BMP085_SendByte(REG_Address);            //发送存储单元地址       
  256.     BMP085_Start();                          //起始信号
  257.     BMP085_SendByte(BMP085_SlaveAddress+1);         //发送设备地址+读信号
  258.     REG_data=BMP085_RecvByte();              //读出寄存器数据
  259.     BMP085_SendACK(1);   
  260.       BMP085_Stop();                           //停止信号
  261.     return REG_data;
  262. }
  263. */
  264. //*********************************************************
  265. //读出BMP085内部数据,连续两个
  266. //*********************************************************
  267. short Multiple_read(uchar ST_Address)
  268. {   
  269.       uchar msb, lsb;
  270.       short _data;
  271.       BMP085_Start();                          //起始信号
  272.     BMP085_SendByte(BMP085_SlaveAddress);    //发送设备地址+写信号
  273.     BMP085_SendByte(ST_Address);             //发送存储单元地址
  274.     BMP085_Start();                          //起始信号
  275.     BMP085_SendByte(BMP085_SlaveAddress+1);         //发送设备地址+读信号

  276.     msb = BMP085_RecvByte();                 //BUF[0]存储
  277.     BMP085_SendACK(0);                       //回应ACK
  278.       lsb = BMP085_RecvByte();     
  279.       BMP085_SendACK(1);                       //最后一个数据需要回NOACK

  280.       BMP085_Stop();                           //停止信号
  281.     Delay5ms();
  282.       _data = msb << 8;
  283.       _data |= lsb;       
  284.       return _data;
  285. }
  286. //********************************************************************
  287. long bmp085ReadTemp(void)
  288. {
  289.     BMP085_Start();                  //起始信号
  290.    BMP085_SendByte(BMP085_SlaveAddress);   //发送设备地址+写信号
  291.    BMP085_SendByte(0xF4);                  // write register address
  292.     BMP085_SendByte(0x2E);               // write register data for temp
  293.     BMP085_Stop();                   //发送停止信号
  294.    delay(10);        // max time is 4.5ms
  295.        
  296.     return (long) Multiple_read(0xF6);
  297. }
  298. //*************************************************************
  299. long bmp085ReadPressure(void)
  300. {
  301.       long pressure = 0;

  302.       BMP085_Start();                   //起始信号
  303.     BMP085_SendByte(BMP085_SlaveAddress);   //发送设备地址+写信号
  304.     BMP085_SendByte(0xF4);                  // write register address
  305.      BMP085_SendByte(0x34);                 // write register data for pressure
  306.      BMP085_Stop();                    //发送停止信号
  307.    delay(10);                              // max time is 4.5ms
  308.        
  309.      pressure = Multiple_read(0xF6);
  310.       pressure &= 0x0000FFFF;
  311.        
  312.        return pressure;       
  313.       //return (long) bmp085ReadShort(0xF6);
  314. }

  315. //**************************************************************

  316. //初始化BMP085,根据需要请参考pdf进行修改**************
  317. void Init_BMP085()
  318. {
  319.         ac1 = Multiple_read(0xAA);
  320.         ac2 = Multiple_read(0xAC);
  321.         ac3 = Multiple_read(0xAE);
  322.         ac4 = Multiple_read(0xB0);
  323.         ac5 = Multiple_read(0xB2);
  324.         ac6 = Multiple_read(0xB4);
  325.         b1 =  Multiple_read(0xB6);
  326.         b2 =  Multiple_read(0xB8);
  327.         mb =  Multiple_read(0xBA);
  328.         mc =  Multiple_read(0xBC);
  329.         md =  Multiple_read(0xBE);
  330. }
  331. //***********************************************************************
  332. void bmp085Convert()
  333. {
  334.         long ut;
  335.         long up;
  336.         long x1, x2, b5, b6, x3, b3, p;
  337.         unsigned long b4, b7;
  338.         long  temperature;
  339.         long  pressure;
  340.        
  341.         ut = bmp085ReadTemp();
  342.         ut = bmp085ReadTemp();           // 读取温度
  343.         up = bmp085ReadPressure();
  344.         up = bmp085ReadPressure();  // 读取压强
  345.        
  346.         x1 = ((long)ut - ac6) * ac5 >> 15;
  347.         x2 = ((long) mc << 11) / (x1 + md);
  348.         b5 = x1 + x2;
  349.          temperature = (b5 + 8) >> 4;

  350.          //*************

  351.          conversion(temperature);
  352.          DisplayOneChar(4,0,'T');       //温度显示
  353.            DisplayOneChar(5,0,':');
  354.                  DisplayOneChar(7,0,bai);      
  355.                  DisplayOneChar(8,0,shi);
  356.                  DisplayOneChar(9,0,'.');
  357.          DisplayOneChar(10,0,ge);
  358.          DisplayOneChar(11,0,0XDF);     //温度单位
  359.          DisplayOneChar(12,0,'C');

  360.          
  361.      //*************
  362.        
  363.         b6 = b5 - 4000;
  364.         x1 = (b2 * (b6 * b6 >> 12)) >> 11;
  365.         x2 = ac2 * b6 >> 11;
  366.         x3 = x1 + x2;
  367.         b3 = (((long)ac1 * 4 + x3) + 2)/4;
  368.         x1 = ac3 * b6 >> 13;
  369.         x2 = (b1 * (b6 * b6 >> 12)) >> 16;
  370.         x3 = ((x1 + x2) + 2) >> 2;
  371.         b4 = (ac4 * (unsigned long) (x3 + 32768)) >> 15;
  372.         b7 = ((unsigned long) up - b3) * (50000 >> OSS);
  373.         if( b7 < 0x80000000)
  374.              p = (b7 * 2) / b4 ;
  375.                 else  
  376.                      p = (b7 / b4) * 2;
  377.         x1 = (p >> 8) * (p >> 8);
  378.         x1 = (x1 * 3038) >> 16;
  379.         x2 = (-7357 * p) >> 16;
  380.          pressure = p + ((x1 + x2 + 3791) >> 4);

  381.          conversion(pressure);
  382.                  DisplayOneChar(4,1,'P');    //显示压强
  383.            DisplayOneChar(5,1,':');
  384.          DisplayOneChar(6,1,shiwan);
  385.          DisplayOneChar(7,1,wan);   
  386.                  DisplayOneChar(8,1,qian);
  387.                  DisplayOneChar(9,1,'.');
  388.                  DisplayOneChar(10,1,bai);
  389.                  DisplayOneChar(11,1,shi);
  390.          DisplayOneChar(12,1,'K');   //气压单位
  391.          DisplayOneChar(13,1,'p');
  392.          DisplayOneChar(14,1,'a');

  393. }

  394. //*********************************************************
  395. //******主程序********
  396. //*********************************************************
  397. void main()
  398. {
  399.       delay(50);                           //上电延时               
  400.     InitLcd();                     //液晶初始化
  401.     Init_BMP085();                //初始化BMP085
  402.   while(1)                         //循环
  403.   {
  404.          bmp085Convert();
  405.          delay(1000);
  406.   }
  407. }
复制代码

出0入0汤圆

发表于 2012-11-30 11:48:47 | 显示全部楼层
感觉是不同的传感器IIC的时序可能有点小差别,建议看手册对照一下。

出0入90汤圆

发表于 2012-11-30 11:51:41 | 显示全部楼层
这个芯片焊接完了后不能用洗板水洗,一洗就坏!我当初搞的时候坏了好几个!这个程序好搞的!肯定是你移植没移植好!仿真调试吧!不过这个芯片不怎么准!

出0入0汤圆

 楼主| 发表于 2012-11-30 12:03:31 | 显示全部楼层
honami520 发表于 2012-11-30 11:51
这个芯片焊接完了后不能用洗板水洗,一洗就坏!我当初搞的时候坏了好几个!这个程序好搞的!肯定是你移植没 ...

貌似焊完了直接就没能用过。。。放了些助焊剂。。上面有个小孔,风枪焊的时候不用做什么准备工作么?同样的5883也是非常难焊,焊上直接就挂了。。

所以为了调试直接买了个成品模块。。。

求085的参考驱动啊。。。真心不知道问题出在哪。。

出0入0汤圆

发表于 2013-12-6 21:47:18 | 显示全部楼层
同求呃呃呃,,,一样为这个芯片在苦逼

出0入0汤圆

发表于 2014-8-26 20:51:48 | 显示全部楼层
写一版在mega 16 上的啊?

出70入0汤圆

发表于 2024-2-20 22:54:19 | 显示全部楼层
Arthur244 发表于 2013-12-6 21:47
同求呃呃呃,,,一样为这个芯片在苦逼
(引用自7楼)

搞好没?10年后,我又遇到这个芯片,海拔高度转换不对,,
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 05:57

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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