资讯详情

单片机驱动bmp280气压传感器实现应用源码

#include

#include "bmp280111.h"

#include //Keil library

#include//Keil library

#include //Keil library

#include //Keil library

#include "sensor_am21xx.h"

#define uchar unsigned char

#define uint unsigned int

#define BMP280_SlaveAddress 0xec //定义器件在IIC从地址到总线

#define OSS 0 // Oversampling Setting (note: code is not set up to use other OSS values)

unsigned short dig_T1;

short dig_T2;

short dig_T3;

unsigned short dig_P1;

short dig_P2;

short dig_P3;

short dig_P4;

short dig_P5;

short dig_P6;

short dig_P7;

short dig_P8;

short dig_P9;

void delay() //略微延迟6us约>4.7us

{

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

}

void iic_start() ///启动信号

{

SDA=1;

SCL=1;

delay();

SDA=0;

delay();

SCL=0;

}

void iic_stop()//停止信号

{

SDA=0;

SCL=1;

delay();

SDA=1;

delay();

SCL=0;

}

void iic_ack() //响应信号

{

uchar i=0;

SCL=1;

delay();

while((SDA==1)&&(i<255))

i ;

SCL=0;

delay();

}

void iic_send_byte(uchar bat)///发送数据

{

uchar i,temp;

temp=bat;

for(i=0;i<=7;i )

{

temp=temp<<1;

SCL=0;

SDA=CY;

delay();

SCL=1;

delay();

}

SCL=0;

delay();

SDA=1;

delay();

}

unsigned char iic_rev()//接收数据

{

uchar temp,i;

SCL=0;

delay();

SDA=1;

for(i=0;i<=7;i )

{

SCL=1;

delay();

temp=(temp<<1)|SDA;

SCL=0;

delay();

}

delay();

return temp;

}

uchar Single_Read(uchar ST_Address)

{

uchar REG_data;

//uchar bit;

iic_start(); ///起始信号

iic_send_byte(BMP280_SlaveAddress); ///发送设备地址 写信号

iic_ack();

iic_send_byte(ST_Address); //发送存储单元地址

iic_ack();

iic_start(); ///开始信号

iic_send_byte(BMP280_SlaveAddress 1); ///发送设备地址 读信号

iic_ack();

REG_data = iic_rev();

iic_ack(); ///最后一个数据需要返回NOACK

return REG_data;

}

void Single_Write(uchar SlaveAddress,uchar REG_Address,uchar REG_data)

{

iic_start(); ///开始信号

iic_send_byte(SlaveAddress); ///发送设备地址 写信号

iic_ack();

iic_send_byte(REG_Address); //内部寄存器地址

iic_ack();

iic_send_byte(REG_data); //内部寄存器数据

iic_ack();

iic_stop(); //发送停止信号

}

//*********************************************************

//读出BMP连续两个085内部数据

//*********************************************************

short Multiple_read(uchar ST_Address)

{

uchar msb,lsb;

short _data;

lsb = Single_Read(ST_Address);

msb = Single_Read(ST_Address 1);

_data = msb << 8;

_data |= lsb;

//rt_kprintf("data is %x %x\n",msb,lsb);

return _data;

}

//*********************************************************

//读出BMP连续三个085内部数据

//*********************************************************

long Multiple_three_read(uchar ST_Address)

{

uchar msb, lsb,xlsb;

long _data = 0;

msb = Single_Read(ST_Address);

lsb = Single_Read(ST_Address+1);

xlsb = Single_Read(ST_Address+2);

//rt_kprintf("data is %x %x %x\n",msb,lsb,xlsb);

//         _data = msb << 16;                stm32可以这么用,51有的单片机不可以,重要!!!

//         _data |= lsb << 8;

//         _data |= xlsb;

//         _data = _data >> 4;

_data=(long)(((uint32_t)msb<<12)|((uint32_t)lsb<<4)|((uint32_t)xlsb>>4));

return _data;

}

//**************************************************************

//初始化BMP280,根据需要请参考pdf进行修改**************

void Init_BMP280(void)

{

unsigned short temp = 0;

unsigned char write_byte;

temp = Single_Read(0xd0);//读取id、判断iic是否正常模块是否正常,读取出来的地址是0x58就是对的

//         if(temp==0x58)printf("BMP280 ID IS: 0x%X\n",temp);

//         else printf("BMP280 ID IS FAIL: 0x%X\n",temp);

dig_T1 = Multiple_read(0x88);

dig_T2 = Multiple_read(0x8A);

dig_T3 = Multiple_read(0x8C);

dig_P1 = Multiple_read(0x8E);

dig_P2 = Multiple_read(0x90);

dig_P3 = Multiple_read(0x92);

dig_P4 = Multiple_read(0x94);

dig_P5 = Multiple_read(0x96);

dig_P6 = Multiple_read(0x98);

dig_P7 = Multiple_read(0x9A);

dig_P8 = Multiple_read(0x9C);

dig_P9 = Multiple_read(0x9E);

write_byte = 0x91;//write_byte

Single_Write(BMP280_SlaveAddress,0xf4,0xb3);

write_byte = 0x00;//配置

Single_Write(BMP280_SlaveAddress,0xf5,5<<2);//5<<2

//rt_thread_delay(RT_TICK_PER_SECOND);

Delay_N1ms(200);

}

//***********************************************************************

long bmp280Convert(void)

{

long adc_T;

long adc_P;

long var1, var2,t_fine,T,p;

//rt_kprintf("----------------------------\n");

//adc_T = Multiple_three_read(0xFA);

adc_T = Multiple_three_read(0xFA);    // 读取温度

//adc_P = Multiple_three_read(0xF7);

adc_P = Multiple_three_read(0xF7); // 读取压强

if(adc_P == 0)

{

return 0;

}

//Temperature

var1 = (((double)adc_T)/16384.0-((double)dig_T1)/1024.0)*((double)dig_T2);

//rt_kprintf("var1 is %d\n",var1);

var2 = ((((double)adc_T)/131072.0-((double)dig_T1)/8192.0)*(((double)adc_T)/131072.0-((double)dig_T1)/8192.0))*((double)dig_T3);

//rt_kprintf("var2 is %d\n",var2);

t_fine = (uint32)(var1+var2);

//rt_kprintf("t_fine is %d\n",t_fine);

T = (var1+var2)/5120.0;

T = T;

//rt_kprintf("temperature is %d\n",T);

var1 = ((double)t_fine/2.0)-64000.0;

//rt_kprintf("var1 is %d\n",var1);

var2 = var1*var1*((double)dig_P6)/32768.0;

//rt_kprintf("var2 is %d\n",var2);

var2 = var2+var1*((double)dig_P5)*2.0;

//rt_kprintf("var2 is %d\n",var2);

var2 = (var2/4.0)+(((double)dig_P4)*65536.0);

//rt_kprintf("var2 is %d\n",var2);

var1 = (((double)dig_P3)*var1*var1/524288.0+((double)dig_P2)*var1)/524288.0;

//rt_kprintf("var1 is %d\n",var1);

var1 = (1.0+var1/32768.0)*((double)dig_P1);

//rt_kprintf("var1 is %d\n",var1);

p = 1048576.0-(double)adc_P;

//rt_kprintf("p is %d\n",p);

p = (p-(var2/4096.0))*6250.0/var1;

//rt_kprintf("p is %d\n",p);

……………………

…………限于本文篇幅 余下代码请从51黑下载附件…………

标签: 压强传感器的使用

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台