mpu6050详细C语言程序.docx
- 文档编号:26511637
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:24
- 大小:19.38KB
mpu6050详细C语言程序.docx
《mpu6050详细C语言程序.docx》由会员分享,可在线阅读,更多相关《mpu6050详细C语言程序.docx(24页珍藏版)》请在冰豆网上搜索。
mpu6050详细C语言程序
/*******************************************************************************
//陀螺仪MPU6050IIC测试程序
*******************************************************************************/
*include"stm32f10*_lib.h"
*include
GPIO_InitTypeDefGPIO_InitStructure;
ErrorStatusHSEStartUpStatus;
*defineucharunsignedchar
*defineuintunsignedint
//定义MPU6050部地址
*defineSMPLRT_DIV0*19//陀螺仪采样率,典型值:
0*07(125Hz)
*defineCONFIG0*1A//低通滤波频率,典型值:
0*06(5Hz)
*defineGYRO_CONFIG0*1B//陀螺仪自检及测量围,典型值:
0*18(不自检,2000deg/s)
*defineACCEL_CONFIG0*1C//加速计自检、测量围及高通滤波频率,典型值:
0*01(不自检,2G,5Hz)
*defineACCEL_*OUT_H0*3B
*defineACCEL_*OUT_L0*3C
*defineACCEL_YOUT_H0*3D
*defineACCEL_YOUT_L0*3E
*defineACCEL_ZOUT_H0*3F
*defineACCEL_ZOUT_L0*40
//*defineTEMP_OUT_H0*41
//*defineTEMP_OUT_L0*42
//
*defineGYRO_*OUT_H0*43
*defineGYRO_*OUT_L0*44
*defineGYRO_YOUT_H0*45
*defineGYRO_YOUT_L0*46
*defineGYRO_ZOUT_H0*47
*defineGYRO_ZOUT_L0*48
*definePWR_MGMT_10*6B//电源管理,典型值:
0*00(正常启用)
//*defineWHO_AM_I0*75//IIC地址寄存器(默认数值0*68,只读)
//****************************
*defineMPU6050_Addr0*D0//定义器件在IIC总线中的从地址,根据ALTADDRESS地址引脚不同修改
unsignedcharT*_DATA[4];//显示据缓存区
unsignedcharBUF[10];//接收数据缓存区
chartest=0;//IIC用到
shortT_*,T_Y,T_Z,T_T;//*,Y,Z轴,温度
//模拟IIC端口输出输入定义
*defineSCL_HGPIOB->BSRR=GPIO_Pin_6
*defineSCL_LGPIOB->BRR=GPIO_Pin_6
*defineSDA_HGPIOB->BSRR=GPIO_Pin_7
*defineSDA_LGPIOB->BRR=GPIO_Pin_7
*defineSCL_readGPIOB->IDR&GPIO_Pin_6
*defineSDA_readGPIOB->IDR&GPIO_Pin_7
/*函数申明-----------------------------------------------*/
voidRCC_Configuration(void);
voidGPIO_Configuration(void);
voidNVIC_Configuration(void);
voidUSART1_Configuration(void);
voidWWDG_Configuration(void);
voidDelay(u32nTime);
voidDelayms(vu32m);
/*变量定义----------------------------------------------*/
/*******************************/
voidDATA_printf(uchar*s,shorttemp_data)
{
if(temp_data<0){
temp_data=-temp_data;
*s='-';
}
else*s='';
*++s=temp_data/100+0*30;
temp_data=temp_data%100;//取余运算
*++s=temp_data/10+0*30;
temp_data=temp_data%10;//取余运算
*++s=temp_data+0*30;
}
/*******************************************************************************
*FunctionName:
I2C_GPIO_Config
*Description:
ConfigrationSimulationIICGPIO
*Input:
None
*Output:
None
*Return:
None
*******************************************************************************/
voidI2C_GPIO_Config(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
/*******************************************************************************
*FunctionName:
I2C_delay
*Description:
SimulationIICTimingseriesdelay
*Input:
None
*Output:
None
*Return:
None
*******************************************************************************/
voidI2C_delay(void)
{
u8i=30;//这里可以优化速度,经测试最低到5还能写入
while(i)
{
i--;
}
}
voiddelay5ms(void)
{
inti=5000;
while(i)
{
i--;
}
}
/*******************************************************************************
*FunctionName:
I2C_Start
*Description:
MasterStartSimulationIICmunication
*Input:
None
*Output:
None
*Return:
WheatherStart
*******************************************************************************/
boolI2C_Start(void)
{
SDA_H;
SCL_H;
I2C_delay();
if(!
SDA_read)returnFALSE;//SDA线为低电平则总线忙,退出
SDA_L;
I2C_delay();
if(SDA_read)returnFALSE;//SDA线为高电平则总线出错,退出
SDA_L;
I2C_delay();
returnTRUE;
}
/*******************************************************************************
*FunctionName:
I2C_Stop
*Description:
MasterStopSimulationIICmunication
*Input:
None
*Output:
None
*Return:
None
*******************************************************************************/
voidI2C_Stop(void)
{
SCL_L;
I2C_delay();
SDA_L;
I2C_delay();
SCL_H;
I2C_delay();
SDA_H;
I2C_delay();
}
/*******************************************************************************
*FunctionName:
I2C_Ack
*Description:
MasterSendAcknowledgeSingle
*Input:
None
*Output:
None
*Return:
None
*******************************************************************************/
voidI2C_Ack(void)
{
SCL_L;
I2C_delay();
SDA_L;
I2C_delay();
SCL_H;
I2C_delay();
SCL_L;
I2C_delay();
}
/*******************************************************************************
*FunctionName:
I2C_NoAck
*Description:
MasterSendNoAcknowledgeSingle
*Input:
None
*Output:
None
*Return:
None
*******************************************************************************/
voidI2C_NoAck(void)
{
SCL_L;
I2C_delay();
SDA_H;
I2C_delay();
SCL_H;
I2C_delay();
SCL_L;
I2C_delay();
}
/*******************************************************************************
*FunctionName:
I2C_WaitAck
*Description:
MasterReseriveSlaveAcknowledgeSingle
*Input:
None
*Output:
None
*Return:
WheatherReseriveSlaveAcknowledgeSingle
*******************************************************************************/
boolI2C_WaitAck(void)//返回为:
=1有ACK,=0无ACK
{
SCL_L;
I2C_delay();
SDA_H;
I2C_delay();
SCL_H;
I2C_delay();
if(SDA_read)
{
SCL_L;
I2C_delay();
returnFALSE;
}
SCL_L;
I2C_delay();
returnTRUE;
}
/*******************************************************************************
*FunctionName:
I2C_SendByte
*Description:
MasterSendaBytetoSlave
*Input:
WillSendDate
*Output:
None
*Return:
None
*******************************************************************************/
voidI2C_SendByte(u8SendByte)//数据从高位到低位//
{
u8i=8;
while(i--)
{
SCL_L;
I2C_delay();
if(SendByte&0*80)
SDA_H;
else
SDA_L;
SendByte<<=1;
I2C_delay();
SCL_H;
I2C_delay();
}
SCL_L;
}
/*******************************************************************************
*FunctionName:
I2C_RadeByte
*Description:
MasterReseriveaByteFromSlave
*Input:
None
*Output:
None
*Return:
DateFromSlave
*******************************************************************************/
unsignedcharI2C_RadeByte(void)//数据从高位到低位//
{
u8i=8;
u8ReceiveByte=0;
SDA_H;
while(i--)
{
ReceiveByte<<=1;
SCL_L;
I2C_delay();
SCL_H;
I2C_delay();
if(SDA_read)
{
ReceiveByte|=0*01;
}
}
SCL_L;
returnReceiveByte;
}
//ZR*
//单字节写入*******************************************
boolSingle_Write(unsignedcharSlaveAddress,unsignedcharREG_Address,unsignedcharREG_data)//void
{
if(!
I2C_Start())returnFALSE;
I2C_SendByte(SlaveAddress);//发送设备地址+写信号//I2C_SendByte(((REG_Address&0*0700)>>7)|SlaveAddress&0*FFFE);//设置高起始地址+器件地址
if(!
I2C_WaitAck()){I2C_Stop();returnFALSE;}
I2C_SendByte(REG_Address);//设置低起始地址
I2C_WaitAck();
I2C_SendByte(REG_data);
I2C_WaitAck();
I2C_Stop();
delay5ms();
returnTRUE;
}
//单字节读取*****************************************
unsignedcharSingle_Read(unsignedcharSlaveAddress,unsignedcharREG_Address)
{unsignedcharREG_data;
if(!
I2C_Start())returnFALSE;
I2C_SendByte(SlaveAddress);//I2C_SendByte(((REG_Address&0*0700)>>7)|REG_Address&0*FFFE);//设置高起始地址+器件地址
if(!
I2C_WaitAck()){I2C_Stop();test=1;returnFALSE;}
I2C_SendByte((u8)REG_Address);//设置低起始地址
I2C_WaitAck();
I2C_Start();
I2C_SendByte(SlaveAddress+1);
I2C_WaitAck();
REG_data=I2C_RadeByte();
I2C_NoAck();
I2C_Stop();
//returnTRUE;
returnREG_data;
}
/*
********************************************************************************
**函数名称:
RCC_Configuration(void)
**函数功能:
时钟初始化
**输入:
无
**输出:
无
**返回:
无
********************************************************************************
*/
voidRCC_Configuration(void)
{
/*RCCsystemreset(fordebugpurpose)*/
RCC_DeInit();
/*EnableHSE*/
RCC_HSEConfig(RCC_HSE_ON);
/*WaittillHSEisready*/
HSEStartUpStatus=RCC_WaitForHSEStartUp();
if(HSEStartUpStatus==SUCCESS)
{
/*HCLK=SYSCLK*/
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/*PCLK2=HCLK*/
RCC_PCLK2Config(RCC_HCLK_Div1);
/*PCLK1=HCLK/2*/
RCC_PCLK1Config(RCC_HCLK_Div2);
/*Flash2waitstate*/
FLASH_SetLatency(FLASH_Latency_2);
/*EnablePrefetchBuffer*/
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/*PLLCLK=8MHz*9=72MHz*/
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
/*EnablePLL*/
RCC_PLLCmd(ENABLE);
/*WaittillPLLisready*/
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)
{
}
/*SelectPLLassystemclocksource*/
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/*WaittillPLLisusedassystemclocksource*/
while(RCC_GetSYSCLKSource()!
=0*08)
{
}
}
/*EnableGPIOA,GPIOB,GPIOC,GPIOD,GPIOE,GPIOF,GPIOGandAFIOclocks*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOF,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG|RCC_APB2Periph_AFIO,ENABLE);
}
/*
********************************************************************************
**函数名称:
GPIO_Configuration(void)
**函数功能:
端口初始化
**输入:
无
**输出:
无
**返回:
无
********************************************************************************
*/
voidGPIO_Configuration(void)
{
GPIO_InitTypeDefGPIO_In
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- mpu6050 详细 语言 程序