zigbee CC2530读取MPU6050的方法及代码

2024-01-24 06:50

本文主要是介绍zigbee CC2530读取MPU6050的方法及代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

  前段时间由于项目需要,需要使用cc2530通过IIC读取MPU6050的数据。发现网上并没有代码,很多帖子都不是大家需要的,所以我想把我的cc2530驱动MPU6050的代码粘出来与大家共同学习。我的项目是驱动MPU6050通过zigbee无线传输至协调器。下图是我使用的硬件,看看是否一致,不同的话可能帮不到您。

GY521点击检查传感器是否一致

 

名称      MPU-6050模块(3轴陀螺仪+3轴加速度)
使用芯片MPU-6050
供电电源3-5V
通信方式标准IIC通信协议
芯片内置16位AD转化器、16位AD数据输出
陀螺仪范围 ±250 500 1000 2000 º/s
加速度范围

±2±4±8±16g

引脚间距2.24mm
  

CC2530是8051内核,但是绝不是那么简单的事情,cc2530芯片和51单片机一个很大的区别就是:

我们在代码里必须设置IO口的输入输出方向

也就是要设置每个端口的PXDIR是1还是0

所以说我们需要在写IIC时序时,不断地切换io口的输入输出方向

也许你知道自己的代码不能用的原因了吧

以下是通过zigbee协议栈读取MPU6050的全部驱动程序

/*描述:显示加速度计和陀螺仪的6位原始数据
****************************************/
#include "ioCC2530.h"
#include "MPU6050.h"
#include "OnBoard.h"
#include "hal_types.h"#define uint  unsigned int
#define uchar unsigned charint accX,accY,accZ,graX,graY,graZ;//****************************************
//函数声明
//****************************************
void WriteSDA_0(void);
void WriteSDA_1(void);
void WriteSCL_0(void);
void WriteSCL_1(void);
void ReadSDA(void);
void Init_IO(void);
void MPU6050_Start(void);
void MPU6050_Stop(void);
void MPU6050_SendACK(uchar ack);
uchar MPU6050_RecvACK(void);
void MPU6050_SendByte(uchar data);
uchar MPU6050_RecvByte(void);
void Single_Write_MPU6050(uchar REG_Address,uchar REG_data);
uchar Single_Read_MPU6050(uchar REG_Address);
void InitMPU6050(void);
void ALLInit(void);
void Multiple_read_MPU6050(void);
void delay_us(unsigned int u);void ALLInit(void)
{Init_IO();InitMPU6050();
}/****************us延时函数 32M晶振 单周期MCU********************/
void delay_us(unsigned int u)
{u=4*u;MicroWait(u);
}/*****************************MPU6050*******************************/
void WriteSDA_0(void) 
{P0DIR|=0x40;SDA=0;
}void WriteSDA_1() 
{P0DIR|=0x40;SDA=1;
}void WriteSCL_0()    
{P0DIR|=0x80;SCL=0;
}void WriteSCL_1()    
{P0DIR|=0x80;SCL=1;
}void ReadSDA(void)//sda输入,=0
{P0DIR&=0xBF;
}void Init_IO(void)
{P0DIR|=0xc0;P0SEL&=0x3f;
}/**************************************
起始信号
**************************************/
void MPU6050_Start()  
{WriteSDA_1();WriteSCL_1();delay_us(5);WriteSDA_0();delay_us(5);WriteSCL_0();delay_us(5);
}/**************************************
停止信号
**************************************/
void MPU6050_Stop()  
{    WriteSDA_0();WriteSCL_1();delay_us(5);WriteSDA_1();
}//I2C发送应答信号
//入口参数:ack (0:ACK 1:NAK)
void MPU6050_SendACK(uchar ack)
{SDA=ack;                     //写应答信号WriteSCL_1();                   //拉高时钟线delay_us(5);//Delay5us();    //延时WriteSCL_0();                   //拉低时钟线delay_us(5);//Delay5us();    //延时
}/**************************************
发送应答信号
**************************************/
uchar MPU6050_RecvACK()
{ReadSDA();WriteSCL_1();                       //拉高时钟线delay_us(5);//Delay5us();    //延时CY=SDA;                      //读应答信号WriteSCL_0();                       //拉低时钟线delay_us(5);//Delay5us();    //延时P0DIR|=0x00;return CY;
}/**************************************
向IIC总线发送一个字节数据
**************************************/
void MPU6050_SendByte(uchar data)
{uchar i;SDA_OUT();for(i=0;i<8;i++)         //8位计数器{       if(data&0x80){WriteSDA_1();}else {WriteSDA_0();}data<<=1;WriteSCL_1();            //拉高时钟线delay_us(5);          //延时WriteSCL_0();            //拉低时钟线delay_us(5);          //延时}MPU6050_RecvACK();
}/**************************************
从IIC总线接收一个字节数据
**************************************/
uchar MPU6050_RecvByte()
{uchar i;uchar dat = 0;WriteSDA_1();                  //使能内部上拉,准备读取数据,for (i=0; i<8; i++)         //8位计数器{dat <<= 1;SCL = 1;                //拉高时钟线delay_us(5);                 //延时dat |= SDA;             //读数据               SCL = 0;                //拉低时钟线delay_us(5);                 //延时}return dat;}//******单字节写入*******************************************
void Single_Write_MPU6050(uchar REG_Address,uchar REG_data)
{MPU6050_Start();                  //起始信号MPU6050_SendByte(SlaveAddress);   //发送设备地址+写信号MPU6050_SendByte(REG_Address);    //内部寄存器地址,MPU6050_SendByte(REG_data);       //内部寄存器数据,MPU6050_Stop();                   //发送停止信号
}//********单字节读取*****************************************
uchar Single_Read_MPU6050(uchar REG_Address)
{
uchar REG_data;
MPU6050_Start();                   //起始信号
MPU6050_SendByte(SlaveAddress);    //发送设备地址+写信号
MPU6050_SendByte(REG_Address);     //发送存储单元地址,从0开始	
MPU6050_Start();                   //起始信号
MPU6050_SendByte(SlaveAddress+1);  //发送设备地址+读信号
REG_data=MPU6050_RecvByte();       //读出寄存器数据
MPU6050_SendACK(1);                //接收应答信号
MPU6050_Stop();                    //停止信号
return REG_data;
}

以上是cc2530全部底层采集的驱动代码,(绝对可以使用)由于全部代码内容太多,便不粘贴出来了,如果需要全部代码,请在下方评论留下你的邮箱亲测百分之百可以使用,真心希望可以互相帮助到所有需要的朋友,共同进步,欢迎交流指导。

 

 

lylive555@163.com

这篇关于zigbee CC2530读取MPU6050的方法及代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/638841

相关文章

Window Server2016加入AD域的方法步骤

《WindowServer2016加入AD域的方法步骤》:本文主要介绍WindowServer2016加入AD域的方法步骤,包括配置DNS、检测ping通、更改计算机域、输入账号密码、重启服务... 目录一、 准备条件二、配置ServerB加入ServerA的AD域(test.ly)三、查看加入AD域后的变

Window Server2016 AD域的创建的方法步骤

《WindowServer2016AD域的创建的方法步骤》本文主要介绍了WindowServer2016AD域的创建的方法步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、准备条件二、在ServerA服务器中常见AD域管理器:三、创建AD域,域地址为“test.ly”

NFS实现多服务器文件的共享的方法步骤

《NFS实现多服务器文件的共享的方法步骤》NFS允许网络中的计算机之间共享资源,客户端可以透明地读写远端NFS服务器上的文件,本文就来介绍一下NFS实现多服务器文件的共享的方法步骤,感兴趣的可以了解一... 目录一、简介二、部署1、准备1、服务端和客户端:安装nfs-utils2、服务端:创建共享目录3、服

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

Python中使用defaultdict和Counter的方法

《Python中使用defaultdict和Counter的方法》本文深入探讨了Python中的两个强大工具——defaultdict和Counter,并详细介绍了它们的工作原理、应用场景以及在实际编... 目录引言defaultdict的深入应用什么是defaultdictdefaultdict的工作原理

使用Python进行文件读写操作的基本方法

《使用Python进行文件读写操作的基本方法》今天的内容来介绍Python中进行文件读写操作的方法,这在学习Python时是必不可少的技术点,希望可以帮助到正在学习python的小伙伴,以下是Pyth... 目录一、文件读取:二、文件写入:三、文件追加:四、文件读写的二进制模式:五、使用 json 模块读写

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如