stm32使用MPU6050读取温度值验证I2C

2023-05-16

通过MPU6050测温来进行I2C的验证学习

关于MPU6050寄存器相关可以参考https://blog.csdn.net/he__yuan/article/details/76559569
I2C时序很多,我是直接以原子I2C的程序结合MPU6050来进行测温实验

# include "MPU6050.H"  
# include "delay.h"
# include "usart.h"

其中MPU6050.H文件也只是简单的定义了一些我用到的地址

#ifndef __MPU6050_H
#define __MPU6050_H
#include "I2C.H"   

# define Slave_Addr 0x68
# define Power_Register_Addr 0x6B//电源寄存器地址

# define Write_Bit 0
# define Read_Bit 1
# define Power_Register_Addr_ResetNum 0x80

函数的声明我没粘贴进去
之后就是整个代码

# include "MPU6050.H"  
# include "delay.h"
# include "usart.h"

//初始化IIC接口
void MPU6050_Init(void)
{
	int temp = 0;
	
	IIC_Init();
	
	MPU6050_WriteOneByte(Power_Register_Addr,Power_Register_Addr_Reset);//电源管理寄存器复位
	
	delay_ms(100);
	
	MPU6050_WriteOneByte(Power_Register_Addr,0x00);//唤醒MPU6050
	
}

u8 MPU6050_ReadOneByte(u16 ReadAddr)
{				  
	u8 temp=0;		 
	
    IIC_Start();  
	
	IIC_Send_Byte((Slave_Addr<<1) | Write_Bit);//发送器件地址0X68,写数据 	 
	
	IIC_Wait_Ack(); 
	
    IIC_Send_Byte(ReadAddr%256);//发送低地址
	
	IIC_Wait_Ack();	    
	
	IIC_Start();  
	
	IIC_Send_Byte((Slave_Addr<<1) | Read_Bit);//进入接收模式
	
	IIC_Wait_Ack();	 
	
    temp=IIC_Read_Byte(0);
	
    IIC_Stop();//产生一个停止条件	 
	
	return temp;
}

//WriteAddr  :写入数据的目的地址    
//DataToWrite:要写入的数据
void MPU6050_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
{				   	  	    																 
    IIC_Start();  
	
	IIC_Send_Byte((Slave_Addr<<1) | Write_Bit);   //发送器件地址0X68,写数据 
		 
	IIC_Wait_Ack();	   
	
    IIC_Send_Byte(WriteAddr%256);   //发送低地址
	
	IIC_Wait_Ack(); 	 							
	
	IIC_Send_Byte(DataToWrite);     //发送字节		
	
	IIC_Wait_Ack();  		    	   
	
    IIC_Stop();//产生一个停止条件 
	
	delay_ms(10);	 
}

//该函数用于写入16bit或者32bit的数据.
//WriteAddr  :开始写入的地址  
//DataToWrite:数据数组首地址
//Len        :要写入数据的长度2,4
void MPU6050_WriteLenByte(u16 WriteAddr,u32 DataToWrite,u8 Len)
{  	
	u8 t;
	
	for(t=0;t<Len;t++)
	{
		MPU6050_WriteOneByte(WriteAddr+t,(DataToWrite>>(8*t))&0xff);
	}												    
}

//该函数用于读出16bit或者32bit的数据.
//ReadAddr   :开始读出的地址 
//返回值     :数据
//Len        :要读出数据的长度2,4
u32 MPU6050_ReadLenByte(u16 ReadAddr,u8 Len)
{  	
	u8 t;
	u32 temp=0;
	
	for(t=0;t<Len;t++)
	{
		
		temp<<=8;
		
		temp+=MPU6050_ReadOneByte(ReadAddr+Len-t-1); 	 	
		
	}
	
	return temp;												    
}

//ReadAddr :开始读出的地址 对24c02为0~255
//pBuffer  :数据数组首地址
//NumToRead:要读出数据的个数
void MPU6050_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)
{
	while(NumToRead)
	{
		
		*pBuffer++=MPU6050_ReadOneByte(ReadAddr++);	
		
		NumToRead--;
		
	}
}  
//在指定地址开始写入指定个数的数据
//WriteAddr :开始写入的地址 对24c02为0~255
//pBuffer   :数据数组首地址
//NumToWrite:要写入数据的个数
void MPU6050_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)
{
	while(NumToWrite--)
	{
		
		MPU6050_WriteOneByte(WriteAddr,*pBuffer);
		
		WriteAddr++;
		
		pBuffer++;
		
	}
}
 

void IIC_Delay(void)
{
	delay_us(2);
}


u8 MPU_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf)
{ 
 	IIC_Start();
	
	IIC_Send_Byte((Slave_Addr<<1) | Write_Bit);//发送器件地址+写命令	
	
	if(IIC_Wait_Ack())	//等待应答
	{
		IIC_Stop();		 
		return 1;		
	}
	
    IIC_Send_Byte(reg);	//写寄存器地址
	
    IIC_Wait_Ack();		//等待应答
	
    IIC_Start();
	
	IIC_Send_Byte((Slave_Addr<<1) | Read_Bit);//发送器件地址+读命令	
	
    IIC_Wait_Ack();		//等待应答 
	
	while(len)
	{
		if(len==1)*buf=IIC_Read_Byte(0);//读数据,发送nACK 
		else *buf=IIC_Read_Byte(1);		//读数据,发送ACK  
		len--;
		buf++; 
	}    
	
	IIC_Stop();	//产生一个停止条件 
	
	return 0;	
}

short MPU_Get_Temperature(void)
{
    u8 buf[2]; 
    short raw;
	float temp;
	
	MPU_Read_Len(Slave_Addr,0x41,2,buf); 
	
    raw=((u16)buf[0]<<8)|buf[1];  
	
    temp=36.53+((double)raw)/340;  
	
    return temp*100;
}

其中MPU6050初始化时,一定要唤醒MPU6050.温度处理函数是网上的,不知道temp=36.53+((double)raw)/340具体是·什么含义,温度处理函数只是将温度寄存器0x41,0x42读出的值合成一个变量,我尝试用原子编写的读数据函数来进行更改,但数据有问题。再此记录一下,学学之后再来解决这个问题,

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stm32使用MPU6050读取温度值验证I2C 的相关文章

  • 139-基于stm32单片机老人居家监护报警系统Proteus仿真+源程序

    资料编号 139 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 MQ4传感器 电位器模拟 MQ2传感器 电位器模拟 蜂鸣器 电机 制作一个基于stm32单片机老人居家监护报警系统Proteus仿真 2 通过MQ2传
  • 134-基于stm32单片机矿井瓦斯天然气浓度温湿度检测自动通风系统Proteus仿真+源程序...

    资料编号 134 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 ds1302时钟 DHT11温湿度 电机 蜂鸣器 制作一个基于stm32单片机矿井瓦斯天然气浓度温湿度检测自动通风系统Proteus仿真 2 通过DH
  • 133-基于stm32单片机停车场车位管理系统Proteus仿真+源程序

    资料编号 133 一 功能介绍 1 采用stm32单片机 4位数码管 独立按键 制作一个基于stm32单片机停车场车位管理系统Proteus仿真 2 通过按键进行模拟车辆进出 并且通过程序计算出当前的剩余车位数量 3 将剩余的车位数量显示到
  • 137-基于stm32单片机智能保温杯控制装置Proteus仿真+源程序

    资料编号 137 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DS18B20传感器 电机 制作一个基于stm32单片机智能保温杯控制装置Proteus仿真 2 通过DS18b20传感器检测当前保温杯水的温度 并且
  • 136-基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真+源程序

    资料编号 136 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 蜂鸣器 制作一个基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真 2 通过DHT11传感器检测当前温湿度 并且显示到L
  • rt-thread studio中新建5.02版本报错

    先吐槽一下 rt thread studio出现BUG真多 好多时间都是在找BUG 但里面用好多控件还是挺好用的 真是又爱又恨 所以一般使用功能不多的话还是用keil多一点 创建5 02版本工程之后直接进行编译 直接会报下面这个错误 资源
  • STM32F103

    提示 来源正点原子 参考STM32F103 战舰开发指南V1 3PDF资料 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 开发环境硬件普中科技 接线图在g
  • STM32F103概要

    The STM32F103x4 STM32F103x6 STM32F103xC STM32F103xD and STM32F103xE are a drop in replacement for STM32F103x8 B medium d
  • SHT10温湿度传感器——STM32驱动

    实验效果 硬件外观 接线 3 3V供电 IIC通讯 代码获取 查看下方 END
  • STM32 暂停调试器时冻结外设

    当到达断点或用户暂停代码执行时 调试器可以停止 Cortex 中代码的执行 但是 当皮质停止在暂停状态下执行代码时 调试器是否会冻结其他外设 例如 DMA UART 和定时器 您只能保留时间 r 取决于外围设备 我在进入主函数时调用以下代码
  • 在 U-Boot 中使用 I2C 读取多个字节

    我的 Freescale p1022tw 板的 I2C 驱动程序有问题 U Boot 的控制台上有一个从 I2C 设备读取的命令 i2c md chip address 0 1 2 of objects 当我从 id 为 0x60 地址为
  • ADXL345 与 ESP32 I2C 垃圾值问题

    我已根据以下教程使用 I2C 接口将 ESP32 与 ADXL345 连接起来Tutorial http www esp32learning com code esp32 and adxl345 sensor example php 但是
  • STM32F4XX的12位ADC采集数值超过4096&右对齐模式设置失败

    文章目录 一 前言 二 问题1 数值超过4096 三 问题1的排错过程 四 问题2 右对齐模式设置失败 五 问题2的解决方法 5 1 将ADC ExternalTrigConv设置为0 5 2 使用ADC StructInit 函数 一 前
  • 库函数点亮Led

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 例如 随着人工智能的不断发展 机器学习这门
  • Cortex-M3与M4权威指南

    处理器类型 所有的ARM Cortex M 处理器是32位的精简指令集处理器 它们有 32位寄存器 32位内部数据路径 32位总线接口 除了32位数据 Cortex M处理器也可以有效地处理器8位和16位数据以及支持许多涉及64位数据的操作
  • 从没有中断引脚并且在测量准备好之前需要一些时间的传感器读取数据的最佳方法

    我正在尝试将压力传感器 MS5803 14BA 与我的板 NUCLEO STM32L073RZ 连接 根据 第 3 页 压力传感器需要几毫秒才能准备好读取测量值 对于我的项目 我对需要大约 10 毫秒来转换原始数据的最高分辨率感兴趣 不幸的
  • 嵌入式 C++11 代码 — 我需要 volatile 吗?

    采用 Cortex M3 MCU STM32F1 的嵌入式设备 它具有嵌入式闪存 64K MCU固件可以在运行时重新编程闪存扇区 这是由闪存控制器 FMC 寄存器完成的 所以它不像a b那么简单 FMC 获取缓冲区指针并将数据刻录到某个闪存
  • MCP23017 I2C 设备驱动程序探测函数未调用

    我正在使用以下 I2C GPIO设备驱动 https github com torvalds linux blob master drivers gpio gpio mcp23s08 c访问 MCP23017 GPIO 使用 insmod
  • 在 Contiki 程序中使用 malloc

    考虑以下 Contiki 程序 include
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE

随机推荐

  • 8.类的继承

    目录 1 继承的定义2 继承的作用3 继承的语法4 类继承成员属性的访问权限5 利用参数列表 xff0c 初始化父类的私有成员6 继承中的构造函数与析构函数7 总结共继承的权限问题8 类中的隐藏问题9 类中的多继承10 类中多级继承11 菱
  • 14.数据成员属性

    目录 1 静态属性 xff1a 2 类中的静态成员 xff1a 3 类中的静态函数 xff1a 4 类中的const成员5 类中的常量成员6 类中的常量函数 xff1a 7 常量对象 xff1a 1 静态属性 xff1a 回顾C语言的静态变
  • 15.异常处理

    目录 1 为什么需要异常处理 xff1f 2 在c 43 43 中异常处理的方法 xff1f xff1f 3 异常的抛出4 异常的类型捕捉5 系统预定义的异常类型6 异常的再抛出 1 为什么需要异常处理 xff1f 用 new 运算符动态分
  • 我的创作纪念日

    一周年纪念
  • SD卡无法格式化怎么办的解决方法

    SD卡无法格式化怎么办的解决方法 http www upantool com jiaocheng neicunka 5399 html 每次SD卡受损都要格卡的朋友 xff0c 一大堆游戏 相片 视频 xff0c 还有导航地图要重新上传 x
  • cmake --Cannot specify link libraries for target" XX" which is not built by this project.

    cmake Cannot specify link libraries for target 34 XX 34 which is not built by this project 原CMakeLists txt内容 xff1a find
  • cmake & CMakeLists.txt

    文章目录 前言先从体验开始1 一个最简单的例子 xff1a 2 例子升级 xff0c 将hello c生成为一个库 xff1a 3 例子升级 xff0c 将源代码和库分开放 xff1a 4 让可执行文件在 bin 目录 xff0c 库文件在
  • 配置Jetson XAVIER NX串口通信,不使用union传递浮点数

    下载minicom span class token function sudo span span class token function apt get span span class token function install s
  • C语言实现大写字母与小写字母之间的互转

    思路 咋一看 xff0c 好像没什么思路 其实我们只需要知道ASCII值就行 xff0c 65和97这两个数字作为程序员必须牢记于心 xff0c 因为这两个数字分别是ASCII表中字母 a 和 A 的十进制值 xff01 xff01 xff
  • 实时显示电脑当前网速和CPU利用率等信息 && 设置软件开机自启动

    相信不少朋友在平时看实时网速时 xff0c 用的都是360那个悬浮窗 xff0c 或者其它杀毒软件提供的 而今天就介绍一款绿 xff08 逼 xff09 色 xff08 格 xff09 更高的用于显示当前网速 CPU及内存利用率的桌面悬浮窗
  • Win10只能安装GPT磁盘的解决办法

    最近帮同事重装系统时 xff0c 遇到了之前没遇到过的问题 无论是微软官方的U盘制作工具还是MSDN下载的镜像加上rufus都无法解决的问题 xff0c 那就是在选择安装磁盘时会提示无法安装 xff0c 点击错误详细会出现下面的提示框 xf
  • C语言中常用运算符

    C语言中常用到的运算符主要有算数运算符 逻辑运算符 位运算发 关系运算符和其它的 一 算数运算符 主要是我们在数学运算中使用的一些加减乘除运算符 xff0c 但是有几个运算符与我们数学中的不 太一样 xff08 以下会说明 xff09 xf
  • 如何下载Ubuntu 20.04并运行在VM虚拟机上

    第一步 下载Ubuntu镜像文件 下载Ubuntu的镜像 xff0c 我们首先想到的就是去官网下载 xff0c 但是由于服务器在国外 xff0c 下载速度可能只有几KB S 甚至压根就下载不了 其实我们有更好的选择 那就是选择我们国内的一些
  • Unbutntu18.04 caffe在make编译时出现对‘cv::imread(cv::String const&, int)’未定义的引用 解决方案

    在CAFFE编译时会出现如下错误 xff1a CXX LD o build release tools caffe bin build release lib libcaffe so xff1a 对 cv imread cv String
  • yolov5返回坐标

    yolov5返回坐标 yolov5目前已更新到v6版 xff0c 上面up主的文章是以前的版本 xff0c 代码对应不上 xff0c 所以特地在此更新一下 xff1a 参考链接 xff1a https blog csdn net weixi
  • ISD9160学习笔记02_搭建NuMicro开发环境

    http blog csdn net iotisan article details 53166357 所谓学习笔记 xff0c 不能免俗地总会讲到开发环境 嵌入式这一行就是这样 xff0c 每做一个新方案 xff0c 就得学习它的CPU
  • RS232不能通信的问题

    RS232不能通信 xff0c 根据PCB图检查了硬件电路是否导通 xff0c 短路状态使用串口工具发送消息收到消息可以收发 xff0c 编程方面大概率无误 由原理图可见 xff0c 地 TXD和RXD设计错误 xff0c 没有反着接 用杜
  • NRF24L01+实现一对一数据双向传输

    NRF24L01 43 实现一对一数据双向传输 目录说明带负载数据ACK的双向通信配置NRF24L01 43 的收发程序收发双方数据的处理测试代码和结果 目录 说明 最近在diy四轴飞行器的时候 xff0c 需要实现四轴和遥控器之间的双向通
  • RT-Thread开启串口.中断和DMA接收(手把手教学)

    1 串口介绍 串口是指数据一位一位地顺序传送 xff0c 其特点是通讯线路简单 xff0c 只要一对传输线就可以实现双向通信 xff08 可以直接利用电话线作为传输线 xff09 xff0c 从而大大降低了成本 xff0c 特别适用于远距离
  • stm32使用MPU6050读取温度值验证I2C

    通过MPU6050测温来进行I2C的验证学习 关于MPU6050寄存器相关可以参考https blog csdn net he yuan article details 76559569 I2C时序很多 xff0c 我是直接以原子I2C的程