stm32气压传感器 带探头的_stm32单片机的BMP180气压温度计传感器源程序 串口输出...

该博客介绍了如何在STM32单片机上使用BMP180气压温度传感器,包括IIC初始化、传感器的读写操作、校准数据的读取以及未修正数据的获取和修正计算,最终通过串口输出温度、气压和海拔高度信息。
摘要由CSDN通过智能技术生成

#include "bmp180.h"

#include "delay.h"

#include "math.h"

#include "led.h"

#include "usart.h"

//存储BMP180数据的结构

_bmp180 bmp180;

//BMP180初始化

//对使用的IIC端口进行初始化

void BMP_Init(void)

{

IIC_Init();

}

//写一个数据到BMP180

void BMP_WriteOneByte(uint8_t WriteAddr,uint8_t DataToWrite)

{

IIC_Start();

IIC_Send_Byte(0xEE);//发送一个字节(地址为 Module address 0cEE)

IIC_Wait_Ack();//等待

IIC_Send_Byte(WriteAddr);//发送字节的地址

IIC_Wait_Ack();

IIC_Send_Byte(DataToWrite);//发送字节地址中的数据

IIC_Wait_Ack();

IIC_Stop();

}

//从BMP180读一个字节数据

uint8_t BMP_ReadOneByte(uint8_t ReadAddr)

{

uint8_t data = 0;

IIC_Start();

IIC_Send_Byte(0xEE);

IIC_Wait_Ack();

IIC_Send_Byte(ReadAddr);

IIC_Wait_Ack();

IIC_Start();

IIC_Send_Byte(0xEF);         //把读取的字节存到下一个地址(0xef)中去

IIC_Wait_Ack();

data = IIC_Read_Byte(1);        //读取地址总的字节

IIC_Stop();

return data;

}

//从BMP180读一个16位的数据

short BMP_ReadTwoByte(uint8_t ReadAddr)

{

short data;

uint8_t msb,lsb;

IIC_Start();

IIC_Send_Byte(0xEE);//发送字节(地址为 Module address 0cEE)

IIC_Wait_Ack();

IIC_Send_Byte(ReadAddr);

IIC_Wait_Ack();

IIC_Start();

IIC_Send_Byte(0xEF);//把读取的字节存到下一个地址(0xef)中去

IIC_Wait_Ack();

msb = IIC_Read_Byte(1);//读取16位的高八位

lsb = IIC_Read_Byte(0);//读取16位的低八位

IIC_Stop();

data = msb*256 + lsb;//以16位的二进制数据给data

return data;

}

//从BMP180的获取计算参数

void BMP_ReadCalibrationData(void)

{

bmp180.AC1 = BMP_ReadTwoByte(0xAA);

bmp180.AC2 = BMP_ReadTwoByte(0xAC);

bmp180.AC3 = BMP_ReadTwoByte(0xAE);

bmp180.AC4 = BMP_ReadTwoByte(0xB0);

bmp180.AC5 = BMP_ReadTwoByte(0xB2);

bmp180.AC6 = BMP_ReadTwoByte(0xB4);

bmp180.B1  = BMP_ReadTwoByte(0xB6);

bmp180.B2  = BMP_ReadTwoByte(0xB8);

bmp180.MB  = BMP_ReadTwoByte(0xBA);

bmp180.MC  = BMP_ReadTwoByte(0xBC);

bmp180.MD  = BMP_ReadTwoByte(0xBE);

}

//从BMP180读取未修正的温度

long BMP_Read_UT(void)

{

long temp = 0;

BMP_WriteOneByte(0xF4,0x2E);

delay_ms(5);

temp = (long)BMP_ReadTwoByte(0xF6);

return temp;

}

//从BMP180读取未修正的大气压

long BMP_Read_UP(void)

{

long pressure = 0;

BMP_WriteOneByte(0xF4,0x34);

delay_ms(5);

pressure = (long)BMP_ReadTwoByte(0xF6);

//pressure = pressure + BMP_ReadOneByte(0xf8);

pressure &= 0x0000FFFF;                //位运算,将pressure中的高八位清0,低八位保留

return pressure;

}

//用获取的参数对温度和大气压进行修正,并计算海拔

void BMP_UncompemstatedToTrue(void)

{

bmp180.UT = BMP_Read_UT();//第一次读取错误  测试的实际的温度值只有-78度 海拔高度有2500多米(改变延时没用)

bmp180.UT = BMP_Read_UT();//进行第二次读取修正参数  读取两次温度值正确

bmp180.UP = BMP_Read_UP();//第一次读取压强值

/**--得到温度值--**/

bmp180.X1 = ((bmp180.UT - bmp180.AC6) * bmp180.AC5) >> 15;

bmp180.X2 = (((long)bmp180.MC) << 11) / (bmp180.X1 + bmp180.MD);

bmp180.B5 = bmp180.X1 + bmp180.X2;

bmp180.Temp  = (bmp180.B5 + 8) >> 4;

/**--得到气压值--**/

bmp180.B6 = bmp180.B5 - 4000;

bmp180.X1 = ((long)bmp180.B2 * (bmp180.B6 * bmp180.B6 >> 12)) >> 11;

bmp180.X2 = ((long)bmp180.AC2) * bmp180.B6 >> 11;

bmp180.X3 = bmp180.X1 + bmp180.X2;

bmp180.B3 = ((((long)bmp180.AC1) * 4 + bmp180.X3) + 2) /4;

bmp180.X1 = ((long)bmp180.AC3) * bmp180.B6 >> 13;

bmp180.X2 = (((long)bmp180.B1) *(bmp180.B6*bmp180.B6 >> 12)) >>16;

bmp180.X3 = ((bmp180.X1 + bmp180.X2) + 2) >> 2;

bmp180.B4 = ((long)bmp180.AC4) * (unsigned long)(bmp180.X3 + 32768) >> 15;

bmp180.B7 = ((unsigned long)bmp180.UP - bmp180.B3) * 50000;

if(bmp180.B7 < 0x80000000)

{

bmp180.p = (bmp180.B7 * 2) / bmp180.B4;

}

else

{

bmp180.p = (bmp180.B7 / bmp180.B4) * 2;

}

bmp180.X1 = (bmp180.p >> 8) * (bmp180.p >>8);

bmp180.X1 = (((long)bmp180.X1) * 3038) >> 16;

bmp180.X2 = (-7357 * bmp180.p) >> 16;

bmp180.p = bmp180.p + ((bmp180.X1 + bmp180.X2 + 3791) >> 4);

/**--得到海拔高度--**/

bmp180.altitude = 44330 * (1-pow(((bmp180.p) / 101325.0),(1.0/5.255)));

}

/**--串口显示读取到的数据--**/

void Show_Read_Data(void)

{

u8 ID = 0;

u16 i=0;

ID = BMP_ReadOneByte(0xd0);

BMP_UncompemstatedToTrue();

printf("ID = %d\t  temp = %d.%dC\t   Pressure = %ldPa\t   Altitude = %.5fm\r\n",ID,bmp180.Temp/10,bmp180.Temp%10,bmp180.p,bmp180.altitude);

i++;

delay_ms(1000);

if(i==1)

{

LED0=!LED0;//灯闪烁,提示系统正在运行

i=0;

}

}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F407是一款高性能的32位ARM Cortex-M4微控制器,因其强大的处理能力和丰富的外设资源,被广泛应用于嵌入式系统开发中。 在STM32F407中,内部集成了一个温度传感器模块,可以实时测量芯片的温度。用户可以通过编程控制,读取芯片的温度值,并进行相应的处理。 STM32F407内部温度传感器实验.rar是一个文件,其中包含了有关STM32F407内部温度传感器的实验代码和设计文档。该实验通过使用STM32F407开发板,连接外部显示屏和温度传感器,实现了读取温度值并在显示屏上显示的功能。 开启温度传感器模块需要进行一系列的配置和初始化工作,具体步骤在实验文档中有详细说明。一般流程包括启用内部温度传感器,配置ADC模块,设置采样周期和精度等。 在实验代码中,用户可以通过读取ADC模块的转换结果,获取温度值的原始数据。根据芯片的温度传感器特性和温度与电压的关系,可以将原始数据转换为实际温度值,并进行相应的处理和显示。 通过这个实验,用户可以了解STM32F407内部温度传感器的使用方法,并且可以根据自己的需求进行二次开发和应用。同时,这也是一个学习STM32F407芯片的ADC模块的好机会。 总之,STM32F407内部温度传感器实验.rar提供了一个完整的实验代码和设计文档,帮助用户了解和使用STM32F407内部温度传感器,为嵌入式系统开发提供了一种方便和可靠的温度测量方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值