BMP085大气压传感器程序(2)

2019-05-17 13:43

}

/************************************** 向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[0]存储 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; long temperature; long pressure; 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); } }


BMP085大气压传感器程序(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:作业现场206例习惯性违章的表现及纠正(2)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: