BMP085大气压传感器程序
更新时间:2024-05-11 19:56:01 阅读量: 综合文库 文档下载
- bmp085气压传感器推荐度:
- 相关推荐
/*
* BMP085模块 *
* 用途:BMP085模块IIC测试程序 *
* 作者 日期 备注 * Huafeng Lin 2010/12/10 新增 * Huafeng Lin 2010/12/11 修改 * */
#include
#include
#define DataPort P2 //LCD1602数据端口 sbit SCL=P1^0; //IIC时钟引脚定义 sbit SDA=P1^1; //IIC数据引脚定义
sbit LCM_RS=P0^2; //LCD1602命令端口 sbit LCM_RW=P0^1; //LCD1602命令端口 sbit LCM_EN=P0^0; //LCD1602命令端口
#define BMP085_SlaveAddress 0xee //定义器件在IIC总线中的从地址
#define OSS 0 // Oversampling Setting (note: code is not set up to use other OSS values) typedef unsigned char BYTE; typedef unsigned short WORD;
uchar ge,shi,bai,qian,wan,shiwan; //显示变量 int dis_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);
void Single_Write(uchar SlaveAddress,uchar REG_Address,uchar REG_data); 据
uchar Single_Read(uchar REG_Address); 取内部寄存器数据
void Multiple_Read(uchar,uchar); 读取内部寄存器数据
//------------------------------------ void Delay5us(); void Delay5ms(); void BMP085_Start(); void BMP085_Stop();
void BMP085_SendACK(bit ack); bit BMP085_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_data0000; //取余运算 wan=temp_data/10000+0x30 ;
temp_data=temp_data000; //取余运算 qian=temp_data/1000+0x30 ;
temp_data=temp_data00; //取余运算 bai=temp_data/100+0x30 ;
temp_data=temp_data0; //取余运算 shi=temp_data/10+0x30 ;
temp_data=temp_data; //取余运算
//单个写入数 //单个读 //连续的 ge=temp_data+0x30; }
/*******************************/ void delay(unsigned int k) { unsigned int i,j; for(i=0;i /*******************************/ 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[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大气压传感器程序05-11
基于MAX261的增益可调程控滤波器设计08-17
财务管理计算题答案05-18
基于单片机的任意波形发生器的-设计07-07
我要感谢一本书02-06
八年级历史上册 第2课 第二次鸦片战争导学案(无答案) 川教版08-12
贵州茅台股票投资分析报告05-14
中医试题106-22
北京丰益西桥汽配城考察07-18
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 大气压
- 传感器
- 程序
- BMP085
- 2009年 陕西省高考数学试卷(理科)
- 《公路运输组织》试卷及答案2卷
- 内蒙古巴彦淖尔市中学2014-2015学年高一下学期期末考试历史试题
- 近代史社会实践调查报告
- 03--10成语运用中考考试成语
- 美术教师小课题研究心得体会
- 第三节 沉淀溶解平衡酸碱中和滴定
- 货币银行学讲义-易纲
- 中国民用航空局(CAAC)机场图判读
- 论文素材1
- 汇编模拟题及答案
- 东方丽都市政景观绿化工程监理实施细则
- 政治生活 综合检测题2(人教版必修2)
- (整理完)统计学原理专科网上作业题参考答案20121121
- 基坑支护工程施工组织设计
- 废水处理岗位职责及操作指示
- 微机原理与接口技术(苏州大学出版社) - 习题答案
- sas宏收集资料
- 作业现场206例习惯性违章的表现及纠正(2)
- 020210回采作业规程