前段工程项目需要测量大气压力,网上搜集了MS5611气压计这方面的资料,并完全参考了相关网友的程序。

1、MYIIC.h

#ifndef __MYIIC_H
#define __MYIIC_H
#include "sys.h"
//
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//Mini STM32开发板
//IIC 驱动函数
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2010/6/10
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 正点原子 2009-2019
//All rights reserved
//    //IO方向设置
#define SDA_IN()  {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=8<<12;}
#define SDA_OUT() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=3<<12;}//IO操作函数
#define IIC_SCL    PCout(12) //SCL
#define IIC_SDA    PCout(11) //SDA
#define READ_SDA   PCin(11)  //输入SDA //IIC所有操作函数
void IIC_Init(void);                //初始化IIC的IO口
void IIC_Start(void);                               //发送IIC开始信号
void IIC_Stop(void);                            //发送IIC停止信号
void IIC_Send_Byte(u8 txd);                 //IIC发送一个字节
u8 IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
u8 IIC_Wait_Ack(void);                          //IIC等待ACK信号
void IIC_Ack(void);                                 //IIC发送ACK信号
void IIC_NAck(void);                                //IIC不发送ACK信号void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data);
u8 IIC_Read_One_Byte(u8 daddr,u8 addr);   #endif

2、MYIIC.C

#include "myiic.h"
#include "delay.h"//初始化IIC
void IIC_Init(void)
{                        GPIO_InitTypeDef GPIO_InitStructure;//RCC->APB2ENR|=1<<4;//先使能外设IO PORTC时钟 RCC_APB2PeriphClockCmd(   RCC_APB2Periph_GPIOC, ENABLE ); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);IIC_SCL=1;IIC_SDA=1;
}
//产生IIC起始信号
void IIC_Start(void)
{SDA_OUT();     //sda线输出IIC_SDA=1;       IIC_SCL=1;delay_us(4);IIC_SDA=0;//START:when CLK is high,DATA change form high to low delay_us(4);IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
}
//产生IIC停止信号
void IIC_Stop(void)
{SDA_OUT();//sda线输出IIC_SCL=0;IIC_SDA=0;//STOP:when CLK is high DATA change form low to highdelay_us(4);IIC_SCL=1; IIC_SDA=1;//发送I2C总线结束信号delay_us(4);
}
//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
u8 IIC_Wait_Ack(void)
{u8 ucErrTime=0;SDA_IN();      //SDA设置为输入  IIC_SDA=1;delay_us(1);    IIC_SCL=1;delay_us(1);   while(READ_SDA){ucErrTime++;if(ucErrTime>250){IIC_Stop();return 1;}}IIC_SCL=0;//时钟输出0       return 0;
}
//产生ACK应答
void IIC_Ack(void)
{IIC_SCL=0;SDA_OUT();IIC_SDA=0;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;
}
//不产生ACK应答
void IIC_NAck(void)
{IIC_SCL=0;SDA_OUT();IIC_SDA=1;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;
}
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
void IIC_Send_Byte(u8 txd)
{                        u8 t;   SDA_OUT();         IIC_SCL=0;//拉低时钟开始数据传输for(t=0;t<8;t++){              IIC_SDA=(txd&0x80)>>7;txd<<=1;      delay_us(2);   //对TEA5767这三个延时都是必须的IIC_SCL=1;delay_us(2); IIC_SCL=0;    delay_us(2);}
}
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
u8 IIC_Read_Byte(unsigned char ack)
{unsigned char i,receive=0;SDA_IN();//SDA设置为输入for(i=0;i<8;i++ ){IIC_SCL=0; delay_us(2);IIC_SCL=1;receive<<=1;if(READ_SDA)receive++;   delay_us(1); }                   if (!ack)IIC_NAck();//发送nACKelseIIC_Ack(); //发送ACK   return receive;
}

3、MY5611.h

#ifndef __MS5611_H_
#define __MS5611_H_#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "myiic.h"/* 函数申明 -----------------------------------------------*/#define MS561101BA_ADC_RD          0x00
#define MS561101BA_PROM_RD         0xA0
#define MS561101BA_PROM_CRC        0xAE#define MS561101BA_SlaveAddress    0xEE  //MS5611的地址
#define MS561101BA_RST             0x1E  //cmd 复位#define    MS561101BA_D2_OSR_4096       0x58   // 9.04 mSec conversion time ( 110.62 Hz)
#define MS561101BA_D1_OSR_4096       0x48#define MS5611_OSR256                           0x40
#define MS5611_OSR512                            0x42
#define MS5611_OSR1024                     0x44
#define MS5611_OSR2048                     0x46
#define MS5611_OSR4096                     0x48
#define FILTER_num 20u8  MS5611_init(void);
float Get_High(void);
void Filter_Hight(unsigned int set_hight);
void Hight_PwmOut(void);
void MS561101BA_getPressure(void);
void MS561101BA_getTemperature(void);
void MS561101BA_RESET(void);unsigned long MS561101BA_getConversion(uint8_t command);
void MS561101BA_GetTemperature(void);extern uint64_t dT,TEMP;
extern uint32_t Pressure;
extern uint32_t  Cal_C[7];#endif

4、MS5611.c

#include "MS5611.h"
#include "math.h"//气压计状态机
#define SCTemperature    0x01     //开始温度转换
#define CTemperatureing  0x02 //正在转换温度
#define SCPressure           0x03       //开始气压转换
#define SCPressureing    0x04     //正在转换气压/*
C1 压力灵敏度 SENS|T1
C2  压力补偿  OFF|T1
C3  温度压力灵敏度系数 TCS
C4  温度系数的压力补偿 TCO
C5  参考温度 T|REF
C6  温度系数的温度 TEMPSENS
*/
uint32_t  Cal_C[7];         //用于存放PROM中的6组数据1-6double OFF_;
float Aux;
/*
dT 实际和参考温度之间的差异
TEMP 实际温度
*/
uint64_t dT,TEMP;
/*
OFF 实际温度补偿
SENS 实际温度灵敏度
*/
uint64_t OFf,SENS;
uint32_t D1_Pres,D2_Temp;   // 数字压力值,数字温度值uint32_t Pressure,Pressure_old,qqp;               //大气压
uint32_t TEMP2,T2,OFF2,SENS2;   //温度校验值
uint32_t Pres_BUFFER[20];     //数据组
uint32_t Temp_BUFFER[10];     //数据组/******************************************************************************** @函数名称 MS561101BA_RESET* @函数说明   复位MS5611* @输入参数   无* @输出参数   无* @返回参数   无
*******************************************************************************/
void MS561101BA_RESET(void)
{IIC_Start();IIC_Send_Byte(0xEE);//CSB接地,主机地址:0XEE,否则 0X77IIC_Wait_Ack();IIC_Send_Byte(0x1E);//发送复位命令IIC_Wait_Ack();IIC_Stop();}
/******************************************************************************** @函数名称    MS5611_init* @函数说明   初始化5611* @输入参数   无* @输出参数   无* @返回参数   无
*******************************************************************************/
u8 MS5611_init(void){    u8  inth,intl;int i;for (i=1;i<=6;i++) {IIC_Start();IIC_Send_Byte(0xEE);IIC_Wait_Ack();IIC_Send_Byte(0xA0 + (i*2));IIC_Wait_Ack();IIC_Stop();delay_us(5);IIC_Start();IIC_Send_Byte(0xEE+0x01);  //进入接收模式delay_us(1);IIC_Wait_Ack();inth = IIC_Read_Byte(1);          //带ACK的读数据delay_us(1);intl = IIC_Read_Byte(0);             //最后一个字节NACKIIC_Stop();Cal_C[i] = (((uint16_t)inth << 8) | intl);}return !Cal_C[0];}/**************************实现函数********************************************
*函数原型:unsigned long MS561101BA_getConversion(void)
*功  能:    读取 MS561101B 的转换结果
*******************************************************************************/
unsigned long MS561101BA_getConversion(uint8_t command)
{unsigned long conversion = 0;u8 temp[3];IIC_Start();IIC_Send_Byte(0xEE);      //写地址IIC_Wait_Ack();IIC_Send_Byte(command); //写转换命令IIC_Wait_Ack();IIC_Stop();delay_ms(10);IIC_Start();IIC_Send_Byte(0xEE);      //写地址IIC_Wait_Ack();IIC_Send_Byte(0);               // start read sequenceIIC_Wait_Ack();IIC_Stop();IIC_Start();IIC_Send_Byte(0xEE+0x01);  //进入接收模式IIC_Wait_Ack();temp[0] = IIC_Read_Byte(1);  //带ACK的读数据  bit 23-16temp[1] = IIC_Read_Byte(1);  //带ACK的读数据  bit 8-15temp[2] = IIC_Read_Byte(0);  //带NACK的读数据 bit 0-7IIC_Stop();conversion = (unsigned long)temp[0] * 65536 + (unsigned long)temp[1] * 256 + (unsigned long)temp[2];return conversion;}/**************************实现函数********************************************
*函数原型:void MS561101BA_GetTemperature(void)
*功  能:    读取 温度转换结果
*******************************************************************************/void MS561101BA_GetTemperature(void)
{D2_Temp = MS561101BA_getConversion(0x58);delay_ms(10);dT=D2_Temp - (((uint32_t)Cal_C[5])<<8);TEMP=2000+dT*((uint32_t)Cal_C[6])/8388608;
}///***********************************************
//  * @brief  读取气压
//  * @param  None
//  * @retval None
//************************************************/
void MS561101BA_getPressure(void)
{D1_Pres= MS561101BA_getConversion(0x48);delay_ms(10);OFF_=(uint32_t)Cal_C[2]*65536+((uint32_t)Cal_C[4]*dT)/128;SENS=(uint32_t)Cal_C[1]*32768+((uint32_t)Cal_C[3]*dT)/256;if(TEMP<2000){Aux = (2000-TEMP)*(2000-TEMP);T2 = (dT*dT) / 0x80000000; OFF2 = 2.5f*Aux;SENS2 = 1.25f*Aux;TEMP = TEMP - T2;OFF_ = OFF_ - OFF2;SENS = SENS - SENS2;  }Pressure= (D1_Pres*SENS/2097152-OFF_)/32768;}

5、main.c

int main(void){ IIC_Init();           //初始化IIC delay_ms(100);MS561101BA_RESET();  // Reset Device  复位MS5611delay_ms(100);       //复位后延时(注意这个延时是一定必要的,可以缩短但似乎不能少于20ms)MS5611_init();      //初始化MS5611while(1){delay_ms(50);MS561101BA_GetTemperature();//获取温度MS561101BA_getPressure();   //获取大气压}
}

MS5611气压计IIC源程序相关推荐

  1. STM32F407单片机移植MS5611气压计(基于IIC)---同时解决温度低于20度时计算得到的大气压错误的问题

    最近一个工程项目需要使用MS5611气压计,就花时间研究了一下,发现网上很多都是基于STM32F103单片机的MS5611气压计源程序,当移植到STM32F407时发现采集的大气压力和温度值不对,同时 ...

  2. STM32+MS5611气压计测量海拔,IIC方式

    要源码的自己加群,群号自己在博客里找.如果你连群号都找不到,那源码就不用要了,谢谢. 气压转海拔的经验公式,自行搜索<气压温度求海拔高度><关于大气压力与海拔高度经验计算公式的讨论& ...

  3. 基于正点原子STM32F103精英板IIC实验的MS5611气压计的使用

    MS5611是一款气压计,能够提供高精度的气压值与温度值,这次做项目正好需要用到这款传感器,包括之前也没好好学习用过IIC,所以写下博客记录一下. 如果有需要使用的朋友可以去https://downl ...

  4. MS5611气压计 I2C驱动代码 STM32

    文章目录 前言 通信接口:IIC 一,MS5611的5种命令 RESET : 重启芯片 READ PROM: D1,D2 CONVERSION READ ADC RESULT: 二,实现代码 1 初始 ...

  5. MS5611气压计数据测试报告

    气压计测得气压和温度值为模拟量,ms5611气压计会自动将模拟量转换成数字量,对于不同的精度,转换时间也不相同.本测试选用的精度为最高的OSR=4096,如下表所示,转换时间选择最大值9.04ms.以 ...

  6. MS5611气压计原理图设计

    MS5611气压计原理图设计

  7. 气压计 MS5611-01BA03 数据读取

    1.简介及注意事项   气压计MS5611-01BA03 采用24位的气压和温度AD转换值,SPI.IIC接口协议读取,采用256.512.1024.2048和4096的过采样率提高采样精度.256的 ...

  8. pixhawk硬件构架

    1.Phxhawk连接线路 2.Phxhawk硬件芯片列表 处理器 STM32F427 VIT6  (168 Mhz/256 KB RAM/2 MB 闪存 100Pin) 32位 STM32F100C ...

  9. 飞控pixhawk硬件框架

    本文转载于:https://blog.csdn.net/csshuke/article/details/78952026  1.Phxhawk连接线路 2.Phxhawk硬件芯片列表 处理器 ST ...

最新文章

  1. Java知多少(完结篇)
  2. Mat转CImage
  3. Lunar New Year and Number Division
  4. 【软件】我安装Tomcat5.5(Java Web开发服务器)的几点经验
  5. 在StackBlitz上setup SAP Spartacus
  6. Maven硒测试自动化教程
  7. 格力宣布11月11日一天让利7亿元 全场空调最高降3900元
  8. vivo硬件测试员干什么的_vivo的新年礼物:用APEX 2019告诉你5G旗舰机该长啥样
  9. 没用TestNG之前,没想过自动化用例管理可以这么强大
  10. Linux下的iftop命令介绍
  11. SQLite介绍及使用
  12. LINUX中文件的移动,Linux中文件移动文件的操作命令为 ()
  13. 4_unittest测试框架_管理测试用例生成测试报告
  14. 计算机科学与技术培养计划,计算机科学与技术专业培养方案(2017版).PDF
  15. LAPARDIN WEDLUTS Romantic Wedding LUTs 浪漫唯美婚礼电影调色预设
  16. js 实现在线考试切屏代码
  17. 自建局域网 OTA 服务器
  18. sap采购申请自动转采购订单
  19. es6中symbol详解
  20. Linux禁止普通用户使用某些命令

热门文章

  1. 分布式系统架构系列讲解一(分布式一致性 1):CAP理论
  2. recyclerview中viewholder使用viewbinding
  3. 基于Django3.0的Python版网易云音乐API
  4. Linux ECS CPU满载100% TOP进程无法查看解决记录
  5. Qt新手入门指南 - 如何创建模型/视图(四)
  6. 数据结构算法书籍推荐(转贴)
  7. MATLAB图例变成一列变多列的方法
  8. 【Java】UML类图详解-详细易懂
  9. XPath谓语多条件使用and和or
  10. linux怎么移动文件并改名,Linux mv命令:移动文件或改名