|
- //#include<intrins.h>
- #include<reg52.h>
- sbit BMP180_SCL=P0^3;
- sbit BMP180_SDA=P0^4;
- #define BMP180_SlaveAddress 0xee//定義器件在IIC總線中的從地址
- #define OSS 0//Over sampling Setting(note:code is not set up to use other OSS values)
- void Init_BMP180();
- void BMP180_Calculate();
- long BMP180_Temperature=0;//溫度值
- long BMP180_Pressure=0;//壓力值
- long BMP180_Height=0;//相對(duì)海拔高度值
- 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 BMP180_Delay5us()//@11.0592MHz
- {
- unsigned char i;
- _nop_();
- i=11;
- while(--i);
- }
- void BMP180_Delay4500us()//@11.0592MHz
- {
- unsigned char i, j;
- _nop_();
- _nop_();
- i = 49;
- j = 101;
- do
- {
- while (--j);
- } while (--i);
- }
- void BMP180_IIC_Start()
- {
- BMP180_SDA=1;//拉高數(shù)據(jù)線
- BMP180_SCL=1;//拉高時(shí)鐘線
- BMP180_Delay5us();//延時(shí)
- BMP180_SDA=0;//產(chǎn)生下降沿
- BMP180_Delay5us();//延時(shí)
- BMP180_SCL=0;//拉低時(shí)鐘線
- }
- void BMP180_IIC_Stop()
- {
- BMP180_SDA=0;//拉低數(shù)據(jù)線
- BMP180_SCL=1;//拉高時(shí)鐘線
- BMP180_Delay5us();//延時(shí)
- BMP180_SDA=1;//產(chǎn)生上升沿
- BMP180_Delay5us();//延時(shí)
- }
- void BMP180_IIC_SendACK(bit ack)//發(fā)送應(yīng)答信號(hào),參數(shù)0:ACK1:NAK
- {
- BMP180_SDA=ack;//寫應(yīng)答信號(hào)
- BMP180_SCL=1;//拉高時(shí)鐘線
- BMP180_Delay5us();//延時(shí)
- BMP180_SCL=0;//拉低時(shí)鐘線
- BMP180_Delay5us();//延時(shí)
- }
- bit BMP180_IIC_ReceiveACK()
- {
- BMP180_SCL=1;//拉高時(shí)鐘線
- BMP180_Delay5us();//延時(shí)
- CY=BMP180_SDA;//讀應(yīng)答信號(hào)
- BMP180_SCL=0;//拉低時(shí)鐘線
- BMP180_Delay5us();//延時(shí)
- return CY;
- }
- void BMP180_IIC_SendByte(unsigned char dat)
- {
- unsigned char i;
- for(i=0;i<8;i++)//8位計(jì)數(shù)器
- {
- dat<<=1;//移出數(shù)據(jù)的最高位
- BMP180_SDA=CY;//送數(shù)據(jù)口
- BMP180_SCL=1;//拉高時(shí)鐘線
- BMP180_Delay5us();//延時(shí)
- BMP180_SCL=0;//拉低時(shí)鐘線
- BMP180_Delay5us();//延時(shí)
- }
- BMP180_IIC_ReceiveACK();
- }
- unsigned char BMP180_IIC_RecvByte()
- {
- unsigned char i;
- unsigned char dat=0;
- BMP180_SDA=1;//使能內(nèi)部上拉,準(zhǔn)備讀取數(shù)據(jù),
- for(i=0;i<8;i++)//8位計(jì)數(shù)器
- {
- dat<<=1;
- BMP180_SCL=1;//拉高時(shí)鐘線
- BMP180_Delay5us();//延時(shí)
- dat|=BMP180_SDA;//讀數(shù)據(jù)
- BMP180_SCL=0;//拉低時(shí)鐘線
- BMP180_Delay5us();//延時(shí)
- }
- return dat;
- }
- short BMP180_IIC_MultRead(unsigned char ST_Address)//讀取兩個(gè)字節(jié)
- {
- unsigned char msb,lsb;
- short _data;
- BMP180_IIC_Start();//起始信號(hào)
- BMP180_IIC_SendByte(BMP180_SlaveAddress);//發(fā)送設(shè)備地址+寫信號(hào)
- BMP180_IIC_SendByte(ST_Address);//發(fā)送存儲(chǔ)單元地址
- BMP180_IIC_Start();//起始信號(hào)
- BMP180_IIC_SendByte(BMP180_SlaveAddress+1);//發(fā)送設(shè)備地址+讀信號(hào)
- msb=BMP180_IIC_RecvByte();//BUF[0]存儲(chǔ)
- BMP180_IIC_SendACK(0);//回應(yīng)ACK
- lsb=BMP180_IIC_RecvByte();
- BMP180_IIC_SendACK(1);//最后一個(gè)數(shù)據(jù)需要回NOACK
- BMP180_IIC_Stop();//停止信號(hào)
- Delay5ms();
- _data=msb<<8;
- _data|=lsb;
- return _data;
- }
- long BMP180_Read_Temperature()
- {
- BMP180_IIC_Start();//起始信號(hào)
- BMP180_IIC_SendByte(BMP180_SlaveAddress);//發(fā)送設(shè)備地址+寫信號(hào)
- BMP180_IIC_SendByte(0xF4);//writeregisteraddress
- BMP180_IIC_SendByte(0x2E);//writeregisterdatafortemp
- BMP180_IIC_Stop();//發(fā)送停止信號(hào)
- Delay_1ms(10);//maxtimeis4.5ms
- return (long)BMP180_IIC_MultRead(0xF6);
- }
- long BMP180_Read_Pressure()
- {
- long BMP180_Pressure=0;
- BMP180_IIC_Start();//起始信號(hào)
- BMP180_IIC_SendByte(BMP180_SlaveAddress);//發(fā)送設(shè)備地址+寫信號(hào)
- BMP180_IIC_SendByte(0xF4);//writeregisteraddress
- BMP180_IIC_SendByte(0x34);//writeregisterdataforpressure
- BMP180_IIC_Stop();//發(fā)送停止信號(hào)
- BMP180_Delay4500us();//max time is 4.5ms
- BMP180_Pressure=BMP180_IIC_MultRead(0xF6);
- BMP180_Pressure&=0x0000FFFF;
- return BMP180_Pressure;
- }
- void Init_BMP180()//初始化BMP180
- {
- ac1=BMP180_IIC_MultRead(0xAA);
- ac2=BMP180_IIC_MultRead(0xAC);
- ac3=BMP180_IIC_MultRead(0xAE);
- ac4=BMP180_IIC_MultRead(0xB0);
- ac5=BMP180_IIC_MultRead(0xB2);
- ac6=BMP180_IIC_MultRead(0xB4);
- b1=BMP180_IIC_MultRead(0xB6);
- b2=BMP180_IIC_MultRead(0xB8);
- mb=BMP180_IIC_MultRead(0xBA);
- mc=BMP180_IIC_MultRead(0xBC);
- md=BMP180_IIC_MultRead(0xBE);
- }
- void BMP180_Calculate()
- {
- unsigned int ut;
- unsigned long up;
- long x1,x2,b5,b6,x3,b3,p;
- unsigned long b4,b7;
- ut=BMP180_Read_Temperature();//讀取溫度
- up=BMP180_Read_Pressure();//讀取壓強(qiáng)
- x1=(((long)ut-(long)ac6)*(long)ac5)>>15;
- x2=((long)mc<<11)/(x1+md);
- b5=x1+x2;
- BMP180_Temperature=((b5+8)>>4);
- b6=b5-4000;
- //Calculate B3
- x1=(b2*(b6*b6)>>12)>>11;
- x2=(ac2*b6)>>11;
- x3=x1+x2;
- b3=(((((long)ac1)*4+x3)<<OSS)+2)>>2;
- //Calculate B4
- 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<<1)/b4;
- }
- else
- {
- p=(b7/b4)<<1;
- }
- x1=(p>>8)*(p>>8);
- x1=(x1*3038)>>16;
- x2=(-7357*p)>>16;
- BMP180_Pressure=p+((x1+x2+3791)>>4);
- BMP180_Height=(101325-BMP180_Pressure)*9;
- }
復(fù)制代碼 |
|