中级会员
 
- 积分
- 457
- 金钱
- 457
- 注册时间
- 2015-8-16
- 在线时间
- 116 小时
|
发表于 2016-4-20 17:20:42
|
显示全部楼层
[mw_shl_code=applescript,true]#include <iom16v.h>
#include <macros.h>
#include "bmp180.h"
#include "LCD12864.h"
#include "typedefine.h"
#include "delay.h"
//========定义从器件地址和读写方式 ========
#define rd_device_add 0xef
//即11101111,1110111是 BMP085器件的固定地址,
//最后的1 表示对从器件进行读操作
#define wr_device_add 0xee
//即11101110,1110111是 BMP085器件的固定地址,
//最后的0 表示对从器件时行写操作
#define START 0x08
#define RE_START 0x10
#define MT_SLA_ACK 0x18
#define MT_SLA_NOACK 0x20
#define MT_DATA_ACK 0x28
#define MT_DATA_NOACK 0x30
#define MR_SLA_ACK 0x40
#define MR_SLA_NOACK 0x48
#define MR_DATA_ACK 0x50
#define MR_DATA_NOACK 0x58
//常用TWI操作(主模式写和读)
#define Start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)) //启动I2C
#define Stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)) //停止I2C
#define Wait() {while(!(TWCR&(1<<TWINT)));} //等待中断发生
#define TestAck() (TWSR&0xf8) //观察返回状态
#define SetAck() (TWCR|=(1<<TWEA)) //做出ACK应答
#define SetNoAck() (TWCR&=~(1<<TWEA)) //做出Not Ack应答
#define Twi() (TWCR=(1<<TWINT)|(1<<TWEN)) //启动I2C
#define Write8Bit(x) {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);} //写数据到TWDR
uint8 ge,shi,bai,qian,wan,shiwan;
uint8 ReadTemp[2];
uint8 ReadPressure[2];
int ac1;
int ac2;
int ac3;
uint16 ac4;
uint16 ac5;
uint16 ac6;
int b1;
int b2;
//显示变量 //接收到的温度数据缓冲区 //接收到的气压数据缓冲区
int mb;
int mc;
int md;
//===IIC 总线写 n 个字节(成功返回0,失败返回1) ====
uint8 I2C_Write(uint8 RomAddress,uint8 *buf,uint8 len)
{
uint8 i;
Start();
Wait();
if(TestAck()!=START)
return 1;
Write8Bit(wr_device_add);
Wait();
if(TestAck()!=MT_SLA_ACK)
return 1;
Write8Bit(RomAddress);
Wait();
if(TestAck()!=MT_DATA_ACK)
return 1;
for(i=0;i<len;i++)
{
Write8Bit(buf);
Wait();
if(TestAck()!=MT_DATA_ACK)
{
return 1;
}
delay_nms(10);
}
Stop();
delay_nms(10);
return 0;
}
//===IIC 总线读 n 个字节(成功返回0,失败返回1)===
uint8 I2C_Read(uint8 RomAddress,uint8 *buf,uint8 len)
{
uint8 i;
Start();
Wait();
if(TestAck()!=START)
return 1;
Write8Bit(wr_device_add);
Wait();
if(TestAck()!=MT_SLA_ACK)
return 1; //ACK 信号,则失败返回值1
Write8Bit(RomAddress);
Wait(); //等待回应
if(TestAck()!=MT_DATA_ACK)
return 1;
Start();
Wait();
if(TestAck()!=RE_START)
return 1;
Write8Bit(rd_device_add);
Wait();
if(TestAck()!=MR_SLA_ACK)
return 1;
for(i=0;i<len;i++)
{
Twi();
SetAck();
delay_nms(10);
Wait();
delay_nms(10);
*(buf+i)=TWDR;// 据依次存入对应的地址单元(数组)中
}
SetNoAck();
delay_nms(10);
Stop();
return 0;
}
//==================转换子函数=============
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; ;
}
//===================BMP085读温度=====================
void bmp085ReadTemp(void)
{
uint8 t=0x2e;
I2C_Write(0xf4,&t,1);
delay_nms(5);
I2C_Read(0xf6,ReadTemp,2);
}
//===================BMP085读气压=====================
void bmp085ReadPressure(void)
{
uint8 t=0x34;
I2C_Write(0xf4,&t,1); //气压转换
delay_nms(5);
I2C_Read(0xf6,ReadPressure,2);
}
//==================初始化 BMP085====================
void Init_BMP085(void)
{
uint8 temp[2];
I2C_Read(0xaa,temp,2);
ac1 = (temp[0]<<8)|temp[1];
I2C_Read(0xac,temp,2);
ac2 = (temp[0]<<8)|temp[1];
I2C_Read(0xae,temp,2);
ac3 = (temp[0]<<8)|temp[1];
I2C_Read(0xb0,temp,2);
ac4 = (temp[0]<<8)|temp[1];
I2C_Read(0xb2,temp,2);
ac5 = (temp[0]<<8)|temp[1];
I2C_Read(0xb4,temp,2);
ac6 = (temp[0]<<8)|temp[1];
I2C_Read(0xb6,temp,2);
b1 = (temp[0]<<8)|temp[1];
I2C_Read(0xb8,temp,2);
b2 = (temp[0]<<8)|temp[1];
I2C_Read(0xba,temp,2);
mb = (temp[0]<<8)|temp[1];
I2C_Read(0xbc,temp,2);
mc = (temp[0]<<8)|temp[1];
I2C_Read(0xbe,temp,2);
md = (temp[0]<<8)|temp[1];
}
//===================转换子函数=====================
void bmp085Convert(void)
{
long ut,up,temperature,pressure; //定义无符号长整型变量
long x1, x2, b5, b6, x3, b3, p;
uint32 b4, b7;
bmp085ReadTemp(); //读取温度
//以下根据 EEPROM 中的值对获取的温度数据的进行
ut=ReadTemp[0]<<8|ReadTemp[1]; //合成温度数据
x1=((long)ut-ac6)*ac5>>15; //补偿换算
x2=((long)mc<<11)/(x1+md);
b5=x1+x2;
temperature=(b5+8)>>4;
conversion(temperature);
LCD_write_str(0,0,"温度:");
LCD_SET_XY(3,0);
Write_Data(bai);
Write_Data(shi);
Write_Data('.');
Write_Data(ge);
bmp085ReadPressure();
up=ReadPressure[0]<<8|ReadPressure[1]; //合成气压数据
up&=0x0000FFFF;
b6=b5-4000; //行补偿换算
x1=(b2*(b6*b6>>12))>>11;
x2=ac2*b6>>11;
//以下根据 EEPROM 中的值对获取的气压数据的进
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*(uint32)(x3+32768))>>15;
b7=((uint32)up-b3)*(50000>>0);
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_write_str(0,3,"气压:");
LCD_SET_XY(3,3);
Write_Data(shiwan);
Write_Data(wan);
Write_Data(qian);
Write_Data('.');
Write_Data(bai);
Write_Data(shi);
Write_Data(' ');
Write_Data('k');
Write_Data('P');
Write_Data('a');
}
[/mw_shl_code]
这个是之前用AVR写的程序,希望对楼主有帮助 |
|