MSP430F149的BMP085大气压强传感器的移植...已成功,附测试驱动
本帖最后由 delay_year 于 2012-11-30 13:04 编辑这个是从C51移植过来的,读出来的数据是错的,读出来的温度和压强一直的跳,而且有乱码,IIC是按照规格书写的,其它都没动过,有没有哪位高手驱动成功的啊,这IC的驱动搞了快一个月了,网上关于430的参考可以说根本没有,而且IC很难焊。。。风枪吹一下就坏了。。只能买模块了{:mad:} {:mad:}
有高手能不能给个430能用的驱动啊。。。开源,学习,非常感谢!!!{:dizzy:} {:dizzy:}
单片机使用的是MSP430F149,系统时钟配置成8MHz,用的显示器是NOKIA5110,用IAR编译,C51正常实测T在20度左右,P在100Kpa左右
-----------------------------------------------------------------分割线-------------------------------------------------------------------------------
最终还是IIC的问题!以下代码已调试成功!感谢大家的关注!虽然430板块不是很活跃。。。
单片机:MSP430F149
时钟配置:8MHz
显示器:LCD5110
#include<msp430x14x.H>
#include<math.h> //Keil library
#include "nokia_5110.c"
#include "nokia_5110.h"
#define CPU_F ((double)8000000) //定义CPU主频大小
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))//延时Nus
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))//延时Nms
#define uchar unsigned char
#define uintunsigned int
#define BMP085_IIC_IOinitP5DIR |= BIT5+BIT6; P5OUT |= BIT5+BIT6//端口初始化
#define BMP085_SCL_1 P5OUT |= BIT5
#define BMP085_SCL_0 P5OUT &= ~BIT5
#define BMP085_SCL_OUT P5DIR |= BIT5 //SDA变回输出模式
#define BMP085_SDA_1 P5OUT |= BIT6
#define BMP085_SDA_0 P5OUT &= ~BIT6
#define BMP085_SDA_IN P5DIR &= ~BIT6 //SDA改成输入模式
#define BMP085_SDA_OUT P5DIR |= BIT6 //SDA变回输出模式
#define BMP085_SDA_VAL P5IN&BIT6 //SDA的位值
#define BMP085_SlaveAddress 0xee //定义器件在IIC总线中的从地址
#define OSS 0 // Oversampling Setting (note: code is not set up to use other OSS values)
uchar ge,shi,bai,qian,wan,shiwan; //显示变量
intdis_data; //变量
short ac1;
short ac2;
short ac3;
unsigned short ac4;
unsigned short ac5;
unsigned short ac6;
short b1;
short b2;
short mb;
short mc;
short md;
void conversion(long temp_data);
voidSingle_Write(uchar SlaveAddress,uchar REG_Address,uchar REG_data); //单个写入数据
uchar Single_Read(uchar REG_Address); //单个读取内部寄存器数据
voidMultiple_Read(uchar,uchar); //连续的读取内部寄存器数据
//------------------------------------
void BMP085_Start();
void BMP085_Stop();
void BMP085_SendACK(unsigned char ack);
unsigned charBMP085_RecvACK();
void BMP085_SendByte(unsigned int dat);
unsigned int BMP085_RecvByte();
void BMP085_ReadPage();
void BMP085_WritePage();
//-----------------------------------
/*******************************************
函数名称:delay_15us
功 能:延时约15us的时间
********************************************/
void delay_15us(void)
{
//uchar i;
//for(i = 0;i < 5;i++)
//_NOP();
delay_us(5);
}
void conversion(long temp_data)
{
shiwan=temp_data/100000+0x30 ;
temp_data=temp_data%100000; //取余运算
wan=temp_data/10000+0x30 ;
temp_data=temp_data%10000; //取余运算
qian=temp_data/1000+0x30 ;
temp_data=temp_data%1000; //取余运算
bai=temp_data/100+0x30 ;
temp_data=temp_data%100; //取余运算
shi=temp_data/10+0x30 ;
temp_data=temp_data%10; //取余运算
ge=temp_data+0x30;
}
/**************************************
起始信号
**************************************/
void BMP085_Start()
{
BMP085_SCL_OUT;
BMP085_SDA_OUT;
BMP085_SCL_1;
BMP085_SDA_1;
delay_15us();
BMP085_SDA_0;
delay_15us();
BMP085_SCL_0;
delay_15us();
}
/**************************************
停止信号
**************************************/
void BMP085_Stop()
{
BMP085_SDA_OUT;
BMP085_SCL_OUT;
BMP085_SDA_0;
delay_15us();
BMP085_SCL_1;
delay_15us();
BMP085_SDA_1;
delay_15us();
delay_15us();
//delay_15us();
//delay_15us();
}
/*******************************************
函数名称:mack
功 能:完成IIC 应答操作
********************************************/
void Sendack(void)
{
BMP085_SDA_OUT;
BMP085_SCL_OUT;
BMP085_SDA_0;
_NOP(); _NOP();
BMP085_SCL_1;
delay_15us();
BMP085_SCL_0;
_NOP();_NOP();
BMP085_SDA_1;
delay_15us();
}
/*******************************************
函数名称:mnack
功 能:完成IIC 无应答操作
********************************************/
void Sendnack(void)
{
BMP085_SDA_OUT;
BMP085_SCL_OUT;
BMP085_SDA_1;
_NOP(); _NOP();
BMP085_SCL_1;
delay_15us();
BMP085_SCL_0;
_NOP(); _NOP();
BMP085_SDA_0;
delay_15us();
}
/**************************************
接收应答信号
**************************************/
unsigned char BMP085_RecvACK()
{
uchar slaveack;
BMP085_SDA_OUT;
BMP085_SCL_OUT;
BMP085_SDA_1;
_NOP(); _NOP();
BMP085_SCL_1;
_NOP(); _NOP();
BMP085_SDA_IN;
_NOP(); _NOP();
slaveack = BMP085_SDA_VAL; //读入SDA数值
BMP085_SCL_0;
delay_15us();
BMP085_SDA_OUT;
if(slaveack) return 0;
else return 1;
}
/*******************************************
函数名称:write1
功 能:向IIC总线发送一个1
********************************************/
void write1(void)
{
BMP085_SDA_OUT;
BMP085_SCL_OUT;
BMP085_SDA_1;
delay_15us();
BMP085_SCL_1;
delay_15us();
BMP085_SCL_0;
delay_15us();
}
/*******************************************
函数名称:write0
功 能:向IIC总线发送一个0
********************************************/
void write0(void)
{
BMP085_SDA_OUT;
BMP085_SCL_OUT;
BMP085_SDA_0;
delay_15us();
BMP085_SCL_1;
delay_15us();
BMP085_SCL_0;
delay_15us();
}
/**************************************
向IIC总线发送一个字节数据
**************************************/
void BMP085_SendByte(unsigned int dat)
{
uchar i;
for(i = 8;i > 0;i--)
{
if(dat & 0x80)write1();
else write0();
dat <<= 1;
}
BMP085_SDA_1;
_NOP();
BMP085_RecvACK();
}
/**************************************
从IIC总线接收一个字节数据
**************************************/
unsigned int BMP085_RecvByte()
{
uchar rdata = 0x00,i;
uchar flag;
for(i = 0;i < 8;i++)
{
BMP085_SDA_1;
delay_15us();
BMP085_SCL_1;
BMP085_SDA_IN;
delay_15us();
flag = BMP085_SDA_VAL;
rdata <<= 1;
if(flag)rdata |= 0x01;
BMP085_SDA_OUT;
BMP085_SCL_0;
delay_15us();
}
return rdata;
}
//*********************************************************
//读出BMP085内部数据,连续两个
//*********************************************************
short Multiple_read(uchar ST_Address)
{
uchar msb, lsb;
short _data;
BMP085_Start(); //起始信号
BMP085_SendByte(BMP085_SlaveAddress); //发送设备地址+写信号
BMP085_SendByte(ST_Address); //发送存储单元地址
BMP085_Start(); //起始信号
BMP085_SendByte(BMP085_SlaveAddress+1); //发送设备地址+读信号
msb = BMP085_RecvByte(); //BUF存储
Sendack(); //回应ACK
lsb = BMP085_RecvByte();
Sendnack(); //最后一个数据需要回NOACK
BMP085_Stop(); //停止信号
delay_ms(5);
_data = msb << 8;
_data |= lsb;
return _data;
}
//********************************************************************
long bmp085ReadTemp(void)
{
BMP085_Start(); //起始信号
BMP085_SendByte(BMP085_SlaveAddress); //发送设备地址+写信号
BMP085_SendByte(0xF4); // write register address
BMP085_SendByte(0x2E); // write register data for temp
BMP085_Stop(); //发送停止信号
delay_ms(4); // max time is 4.5ms
return (long) Multiple_read(0xF6);
}
//*************************************************************
long bmp085ReadPressure(void)
{
long pressure = 0;
BMP085_Start(); //起始信号
BMP085_SendByte(BMP085_SlaveAddress); //发送设备地址+写信号
BMP085_SendByte(0xF4); // write register address
BMP085_SendByte(0x34); // write register data for pressure
BMP085_Stop(); //发送停止信号
delay_ms(4); // max time is 4.5ms
pressure = Multiple_read(0xF6);
pressure &= 0x0000FFFF;
return pressure;
//return (long) bmp085ReadShort(0xF6);
}
void Init_BMP085() //初始化BMP085
{
ac1 = Multiple_read(0xAA);
ac2 = Multiple_read(0xAC);
ac3 = Multiple_read(0xAE);
ac4 = Multiple_read(0xB0);
ac5 = Multiple_read(0xB2);
ac6 = Multiple_read(0xB4);
b1 =Multiple_read(0xB6);
b2 =Multiple_read(0xB8);
mb =Multiple_read(0xBA);
mc =Multiple_read(0xBC);
md =Multiple_read(0xBE);
}
void bmp085Convert()
{
long ut;
long up;
long x1, x2, b5, b6, x3, b3, p;
unsigned long b4, b7;
longtemperature;
longpressure;
ut = bmp085ReadTemp();
ut = bmp085ReadTemp(); // 读取温度
up = bmp085ReadPressure();
up = bmp085ReadPressure();// 读取压强
x1 = ((long)ut - ac6) * ac5 >> 15;
x2 = ((long) mc << 11) / (x1 + md);
b5 = x1 + x2;
temperature = (b5 + 8) >> 4;
//*************
conversion(temperature);
LCD_set_XY(0,1);
LCD_write_char('T'); //温度显示
LCD_write_char(':');
LCD_write_char(bai);
LCD_write_char(shi);
LCD_write_char('.');
LCD_write_char(ge);
LCD_write_char('C');
//*************
b6 = b5 - 4000;
x1 = (b2 * (b6 * b6 >> 12)) >> 11;
x2 = ac2 * b6 >> 11;
x3 = x1 + x2;
b3 = (((long)ac1 * 4 + x3) + 2)/4;
x1 = ac3 * b6 >> 13;
x2 = (b1 * (b6 * b6 >> 12)) >> 16;
x3 = ((x1 + x2) + 2) >> 2;
b4 = (ac4 * (unsigned long) (x3 + 32768)) >> 15;
b7 = ((unsigned long) up - b3) * (50000 >> OSS);
if( b7 < 0x80000000)
p = (b7 * 2) / b4 ;
else
p = (b7 / b4) * 2;
x1 = (p >> 8) * (p >> 8);
x1 = (x1 * 3038) >> 16;
x2 = (-7357 * p) >> 16;
pressure = p + ((x1 + x2 + 3791) >> 4);
conversion(pressure);
LCD_set_XY(0,2);
LCD_write_char('P'); //显示压强
LCD_write_char(':');
LCD_write_char(shiwan);
LCD_write_char(wan);
LCD_write_char(qian);
LCD_write_char('.');
LCD_write_char(bai);
LCD_write_char(shi);
LCD_write_char('K'); //气压单位
LCD_write_char('p');
LCD_write_char('a');
}
//**********************************************//
// 系统时钟初始化
//**********************************************//
void InitSys()
{
unsigned int iq0;
_DINT();
BCSCTL1 &=~XT2OFF; //打开TX振荡器
BCSCTL2 |=SELM1+SELS;//MCLK为8MHz,SMCLK为1MHz
do
{
IFG1 &= ~OFIFG; // 清除振荡器失效标志
for(iq0 = 0xFF; iq0 > 0; iq0--); // 延时,等待XT2起振
}
while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振
//BCSCTL2 =SELM0+SELS; //MCLK,SMCLK时钟为XT2
IFG1 &= ~OFIFG; // 清除振荡器失效标志
}
void main()
{
WDTCTL = WDTPW + WDTHOLD;
InitSys();
BMP085_IIC_IOinit;
delay_ms(50); //上电延时
Init_BMP085(); //初始化BMP085
LCD_init();
while(1) //循环
{
bmp085Convert();
delay_ms(1000);
}
}
1、以前在C51上运行没问题吗?
2、看你是模拟的IIC,把速度降下来怎么样?
3、用示波器看看波形。 qiuchen 发表于 2012-11-30 10:46 static/image/common/back.gif
1、以前在C51上运行没问题吗?
2、看你是模拟的IIC,把速度降下来怎么样?
3、用示波器看看波形。 ...
1、在C51上是没有问题的 用的是AT89S52 12MHz
2、是用模拟的IIC,试过配置成1MHz的和32.768KHz的,要么数据在跳,要么数据固定不跳不动
3、同样的IIC我参考了另外一个传感器的驱动的,同样是用IIC的,但是那个传感器却能用了,是磁阻传感器。
附C51的BMP085能用的代码:
//***************************************
// BMP085 IIC测试程序
// 使用单片机STC89C51
// 晶振:11.0592M
// 显示:LCD1602
// 编译环境 Keil uVision2
// 参考宏晶网站24c04通信程序
// 时间:2011年7月1日
//****************************************
#include<REG51.H>
#include<math.h> //Keil library
#include<stdlib.h>//Keil library
#include<stdio.h> //Keil library
#include<INTRINS.H> //Keil library
#define uchar unsigned char
#define uint unsigned int
#define DataPort P2 //LCD1602数据端口
sbit SCL=P1^1; //IIC时钟引脚定义
sbit SDA=P1^0; //IIC数据引脚定义
sbit LCM_RS=P0^5; //LCD1602命令端口
sbit LCM_RW=P0^6; //LCD1602命令端口
sbit LCM_EN=P0^7; //LCD1602命令端口
#define BMP085_SlaveAddress 0xee //定义器件在IIC总线中的从地址
#define OSS 0 // Oversampling Setting (note: code is not set up to use other OSS values)
typedef unsigned charBYTE;
typedef unsigned short WORD;
uchar ge,shi,bai,qian,wan,shiwan; //显示变量
intdis_data; //变量
short ac1;
short ac2;
short ac3;
unsigned short ac4;
unsigned short ac5;
unsigned short ac6;
short b1;
short b2;
short mb;
short mc;
short md;
void delay(unsigned int k);
void InitLcd(); //初始化lcd1602
void WriteDataLCM(uchar dataW);
void WriteCommandLCM(uchar CMD,uchar Attribc);
void DisplayOneChar(uchar X,uchar Y,uchar DData);
void conversion(long temp_data);
voidSingle_Write(uchar SlaveAddress,uchar REG_Address,uchar REG_data); //单个写入数据
uchar Single_Read(uchar REG_Address); //单个读取内部寄存器数据
voidMultiple_Read(uchar,uchar); //连续的读取内部寄存器数据
//------------------------------------
void Delay5us();
void Delay5ms();
void BMP085_Start();
void BMP085_Stop();
void BMP085_SendACK(bit ack);
bitBMP085_RecvACK();
void BMP085_SendByte(BYTE dat);
BYTE BMP085_RecvByte();
void BMP085_ReadPage();
void BMP085_WritePage();
//-----------------------------------
//*********************************************************
void conversion(long temp_data)
{
shiwan=temp_data/100000+0x30 ;
temp_data=temp_data%100000; //取余运算
wan=temp_data/10000+0x30 ;
temp_data=temp_data%10000; //取余运算
qian=temp_data/1000+0x30 ;
temp_data=temp_data%1000; //取余运算
bai=temp_data/100+0x30 ;
temp_data=temp_data%100; //取余运算
shi=temp_data/10+0x30 ;
temp_data=temp_data%10; //取余运算
ge=temp_data+0x30;
}
/*******************************/
void delay(unsigned int k)
{
unsigned int i,j;
for(i=0;i<k;i++)
{
for(j=0;j<121;j++)
{;}}
}
/*******************************/
void WaitForEnable(void)
{
DataPort=0xff;
LCM_RS=0;LCM_RW=1;_nop_();
LCM_EN=1;_nop_();_nop_();
while(DataPort&0x80);
LCM_EN=0;
}
/*******************************/
void WriteCommandLCM(uchar CMD,uchar Attribc)
{
if(Attribc)WaitForEnable();
LCM_RS=0;LCM_RW=0;_nop_();
DataPort=CMD;_nop_();
LCM_EN=1;_nop_();_nop_();LCM_EN=0;
}
/*******************************/
void WriteDataLCM(uchar dataW)
{
WaitForEnable();
LCM_RS=1;LCM_RW=0;_nop_();
DataPort=dataW;_nop_();
LCM_EN=1;_nop_();_nop_();LCM_EN=0;
}
/***********************************/
void InitLcd()
{
WriteCommandLCM(0x38,1);
WriteCommandLCM(0x08,1);
WriteCommandLCM(0x01,1);
WriteCommandLCM(0x06,1);
WriteCommandLCM(0x0c,1);
}
/***********************************/
void DisplayOneChar(uchar X,uchar Y,uchar DData)
{
Y&=1;
X&=15;
if(Y)X|=0x40;
X|=0x80;
WriteCommandLCM(X,0);
WriteDataLCM(DData);
}
/**************************************
延时5微秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数,注意时钟过快时需要修改
当改用1T的MCU时,请调整此延时函数
**************************************/
void Delay5us()
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
/**************************************
延时5毫秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数
当改用1T的MCU时,请调整此延时函数
**************************************/
void Delay5ms()
{
WORD n = 560;
while (n--);
}
/**************************************
起始信号
**************************************/
void BMP085_Start()
{
SDA = 1; //拉高数据线
SCL = 1; //拉高时钟线
Delay5us(); //延时
SDA = 0; //产生下降沿
Delay5us(); //延时
SCL = 0; //拉低时钟线
}
/**************************************
停止信号
**************************************/
void BMP085_Stop()
{
SDA = 0; //拉低数据线
SCL = 1; //拉高时钟线
Delay5us(); //延时
SDA = 1; //产生上升沿
Delay5us(); //延时
}
/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
void BMP085_SendACK(bit ack)
{
SDA = ack; //写应答信号
SCL = 1; //拉高时钟线
Delay5us(); //延时
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
/**************************************
接收应答信号
**************************************/
bit BMP085_RecvACK()
{
SCL = 1; //拉高时钟线
Delay5us(); //延时
CY = SDA; //读应答信号
SCL = 0; //拉低时钟线
Delay5us(); //延时
return CY;
}
/**************************************
向IIC总线发送一个字节数据
**************************************/
void BMP085_SendByte(BYTE dat)
{
BYTE i;
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1; //移出数据的最高位
SDA = CY; //送数据口
SCL = 1; //拉高时钟线
Delay5us(); //延时
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
BMP085_RecvACK();
}
/**************************************
从IIC总线接收一个字节数据
**************************************/
BYTE BMP085_RecvByte()
{
BYTE i;
BYTE dat = 0;
SDA = 1; //使能内部上拉,准备读取数据,
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1;
SCL = 1; //拉高时钟线
Delay5us(); //延时
dat |= SDA; //读数据
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
return dat;
}
/*
//单字节写入BMP085内部数据*******************************
void Single_Write(uchar SlaveAddress,uchar REG_Address,uchar REG_data)
{
BMP085_Start(); //起始信号
BMP085_SendByte(SlaveAddress); //发送设备地址+写信号
BMP085_SendByte(REG_Address); //内部寄存器地址
BMP085_SendByte(REG_data); //内部寄存器数据
BMP085_Stop(); //发送停止信号
}
*/
/*
//单字节读取BMP085内部数据********************************
uchar Single_Read(uchar REG_Address)
{
uchar REG_data;
BMP085_Start(); //起始信号
BMP085_SendByte(BMP085_SlaveAddress); //发送设备地址+写信号
BMP085_SendByte(REG_Address); //发送存储单元地址
BMP085_Start(); //起始信号
BMP085_SendByte(BMP085_SlaveAddress+1); //发送设备地址+读信号
REG_data=BMP085_RecvByte(); //读出寄存器数据
BMP085_SendACK(1);
BMP085_Stop(); //停止信号
return REG_data;
}
*/
//*********************************************************
//读出BMP085内部数据,连续两个
//*********************************************************
short Multiple_read(uchar ST_Address)
{
uchar msb, lsb;
short _data;
BMP085_Start(); //起始信号
BMP085_SendByte(BMP085_SlaveAddress); //发送设备地址+写信号
BMP085_SendByte(ST_Address); //发送存储单元地址
BMP085_Start(); //起始信号
BMP085_SendByte(BMP085_SlaveAddress+1); //发送设备地址+读信号
msb = BMP085_RecvByte(); //BUF存储
BMP085_SendACK(0); //回应ACK
lsb = BMP085_RecvByte();
BMP085_SendACK(1); //最后一个数据需要回NOACK
BMP085_Stop(); //停止信号
Delay5ms();
_data = msb << 8;
_data |= lsb;
return _data;
}
//********************************************************************
long bmp085ReadTemp(void)
{
BMP085_Start(); //起始信号
BMP085_SendByte(BMP085_SlaveAddress); //发送设备地址+写信号
BMP085_SendByte(0xF4); // write register address
BMP085_SendByte(0x2E); // write register data for temp
BMP085_Stop(); //发送停止信号
delay(10); // max time is 4.5ms
return (long) Multiple_read(0xF6);
}
//*************************************************************
long bmp085ReadPressure(void)
{
long pressure = 0;
BMP085_Start(); //起始信号
BMP085_SendByte(BMP085_SlaveAddress); //发送设备地址+写信号
BMP085_SendByte(0xF4); // write register address
BMP085_SendByte(0x34); // write register data for pressure
BMP085_Stop(); //发送停止信号
delay(10); // max time is 4.5ms
pressure = Multiple_read(0xF6);
pressure &= 0x0000FFFF;
return pressure;
//return (long) bmp085ReadShort(0xF6);
}
//**************************************************************
//初始化BMP085,根据需要请参考pdf进行修改**************
void Init_BMP085()
{
ac1 = Multiple_read(0xAA);
ac2 = Multiple_read(0xAC);
ac3 = Multiple_read(0xAE);
ac4 = Multiple_read(0xB0);
ac5 = Multiple_read(0xB2);
ac6 = Multiple_read(0xB4);
b1 =Multiple_read(0xB6);
b2 =Multiple_read(0xB8);
mb =Multiple_read(0xBA);
mc =Multiple_read(0xBC);
md =Multiple_read(0xBE);
}
//***********************************************************************
void bmp085Convert()
{
long ut;
long up;
long x1, x2, b5, b6, x3, b3, p;
unsigned long b4, b7;
longtemperature;
longpressure;
ut = bmp085ReadTemp();
ut = bmp085ReadTemp(); // 读取温度
up = bmp085ReadPressure();
up = bmp085ReadPressure();// 读取压强
x1 = ((long)ut - ac6) * ac5 >> 15;
x2 = ((long) mc << 11) / (x1 + md);
b5 = x1 + x2;
temperature = (b5 + 8) >> 4;
//*************
conversion(temperature);
DisplayOneChar(4,0,'T'); //温度显示
DisplayOneChar(5,0,':');
DisplayOneChar(7,0,bai);
DisplayOneChar(8,0,shi);
DisplayOneChar(9,0,'.');
DisplayOneChar(10,0,ge);
DisplayOneChar(11,0,0XDF); //温度单位
DisplayOneChar(12,0,'C');
//*************
b6 = b5 - 4000;
x1 = (b2 * (b6 * b6 >> 12)) >> 11;
x2 = ac2 * b6 >> 11;
x3 = x1 + x2;
b3 = (((long)ac1 * 4 + x3) + 2)/4;
x1 = ac3 * b6 >> 13;
x2 = (b1 * (b6 * b6 >> 12)) >> 16;
x3 = ((x1 + x2) + 2) >> 2;
b4 = (ac4 * (unsigned long) (x3 + 32768)) >> 15;
b7 = ((unsigned long) up - b3) * (50000 >> OSS);
if( b7 < 0x80000000)
p = (b7 * 2) / b4 ;
else
p = (b7 / b4) * 2;
x1 = (p >> 8) * (p >> 8);
x1 = (x1 * 3038) >> 16;
x2 = (-7357 * p) >> 16;
pressure = p + ((x1 + x2 + 3791) >> 4);
conversion(pressure);
DisplayOneChar(4,1,'P'); //显示压强
DisplayOneChar(5,1,':');
DisplayOneChar(6,1,shiwan);
DisplayOneChar(7,1,wan);
DisplayOneChar(8,1,qian);
DisplayOneChar(9,1,'.');
DisplayOneChar(10,1,bai);
DisplayOneChar(11,1,shi);
DisplayOneChar(12,1,'K'); //气压单位
DisplayOneChar(13,1,'p');
DisplayOneChar(14,1,'a');
}
//*********************************************************
//******主程序********
//*********************************************************
void main()
{
delay(50); //上电延时
InitLcd(); //液晶初始化
Init_BMP085(); //初始化BMP085
while(1) //循环
{
bmp085Convert();
delay(1000);
}
} 感觉是不同的传感器IIC的时序可能有点小差别,建议看手册对照一下。 这个芯片焊接完了后不能用洗板水洗,一洗就坏!我当初搞的时候坏了好几个!这个程序好搞的!肯定是你移植没移植好!仿真调试吧!不过这个芯片不怎么准! honami520 发表于 2012-11-30 11:51 static/image/common/back.gif
这个芯片焊接完了后不能用洗板水洗,一洗就坏!我当初搞的时候坏了好几个!这个程序好搞的!肯定是你移植没 ...
貌似焊完了直接就没能用过。。。放了些助焊剂。。上面有个小孔,风枪焊的时候不用做什么准备工作么?同样的5883也是非常难焊,焊上直接就挂了。。
所以为了调试直接买了个成品模块。。。
求085的参考驱动啊。。。真心不知道问题出在哪。。{:dizzy:} 同求呃呃呃,,,一样为这个芯片在苦逼 写一版在mega 16 上的啊? Arthur244 发表于 2013-12-6 21:47
同求呃呃呃,,,一样为这个芯片在苦逼
(引用自7楼)
搞好没?10年后,我又遇到这个芯片,海拔高度转换不对,,
页:
[1]