2019-03-24 17:50发布
michael_llh 发表于 2015-10-31 22:07 这个也不好说的程序有问题没有,再说你只有部分代码,6050的代码官方给的就是用430写的,你可以去看看
最多设置5个标签!
这是IIC的
#ifndef __IIC_H
#define __IIC_H
#include "Delay.h"
#define uint unsigned int
#define uchar unsigned char
//****端口定义--IIC时钟引脚定义P5^0;IIC数据引脚定义P5^1;**************************
#define SCL1 P5OUT |=BIT0
#define SCL0 P5OUT &=~BIT0
#define SCLOUT P5DIR |= BIT0;
#define SDA1 P5OUT |=BIT1 //IIC数据引脚
#define SDA0 P5OUT &=~BIT1
#define SDAIN P5DIR &=~BIT1
#define SDAOUT P5DIR |=BIT1
#define SDADATA P5IN & BIT1 //IIC数据SDA引脚定义P5^1,与运算,【取第1位】观察值;
#define SlaveAddress 0xD0 //IIC写入时的地址字节数据?+1为读取
/*********I2C开始信号*****************************/
void I2C_Start()
{
SDAOUT;
SDA1; //拉高数据线
//SCLOUT;
SCL1; //拉高时钟线
delayus(5); //延时
SDA0; //产生下降沿
delayus(5); //延时
SCL0; //拉低时钟线
}
/*********I2C停止信号*****************************/
void I2C_Stop()
{
SDAOUT;
SCL0; //拉低时钟线
SDA0; //拉低数据线
//SCLOUT;
delayus(5); //延时
SCL1; //拉高时钟线
//delayus(5); //延时
SDA1; //产生上升沿
delayus(5); //延时
}
void I2C_INIT()//?
{
SCLOUT;
SDAIN;
SCL0;
I2C_Stop();
}
//I2C发送应答信号
//入口参数:ack (0:ACK 1:NAK) ----I2C_SendACK(1);此时即为'非应答’信号
void I2C_SendACK(uchar ack)
{
SDAOUT;
//SCLOUT;
//---写应答信号
if(ack)
SDA1; //--判断,ack=1即为NAK,SDA为高
else
SDA0; //--判断,ack=0即为ACK,SDA为低
// SDA = ack; //写应答信号
SCL1; //拉高时钟线
delayus(5); //延时
SCL0; //拉低时钟线
delayus(5); //延时
}
//**************************************
//I2C接收应答信号
//**************************************
uchar I2C_RecvACK()
{
uchar cy;
SCLOUT;
SCL1; //拉高时钟线
SDAIN; //--接收
delayus(5); //延时
if(SDADATA) //--读应答信号=1即SDA为高,置1
{
cy=1;
}
else
{
cy=0;
}
// cy = SDA; //读应答信号
SCL0; //拉低时钟线
delayus(5); //延时
SDAOUT;
return cy;
}
//**************************************
//向I2C总线发送一个字节数据
//**************************************
void I2C_SendByte(uchar dat)
{
uchar i;
SDAOUT; //---发送
for (i=0; i<8; i++) //8位计数器
{
if((dat<<i)&0x80) //---送数据口 dat<<1 ??
{ SDA1;}
else
{ SDA0;}
SCLOUT;
SCL1; //拉高时钟线
delayus(5); //延时
SCL0; //拉低时钟线
delayus(5); //延时
}
I2C_RecvACK();
}
//**************************************
//从I2C总线接收一个字节【数据】
//**************************************
uchar I2C_RecvByte()
{
uchar i;
uchar dat = 0,cy;
SDAOUT;
SCLOUT;
SDA1; //使能内部上拉,准备读取数据,
SDAIN;
for (i=0; i<8; i++) //8位计数器
{
dat<<= 1;
SCL1; //拉高时钟线
delayus(5); //延时
if(SDADATA)
{ cy=1; }
else
{ cy=0; }
dat |= cy; //读数据 SCL0; //拉低时钟线
delayus(5); //延时
}
SDAOUT; //???需要此语句吗?
return dat;
}
//**************************************
//向I2C设备【写】入一个【字节】数据
//【内部】寄存器【地址】和内部寄存器【数据】****************
void Single_WriteI2C(uchar REG_Address,uchar REG_data)
{
I2C_Start(); //起始信号
I2C_SendByte(SlaveAddress); //发送设备地址+写信号
I2C_SendByte(REG_Address); //内部寄存器地址?
I2C_SendByte(REG_data); //内部寄存器数据?
I2C_Stop(); //发送停止信号
}
//**************************************
//从I2C设备【读】取一个【字节】数据
//**************************************
uchar Single_ReadI2C(uchar REG_Address)
{
uchar REG_data;
I2C_Start(); //起始信号
I2C_SendByte(SlaveAddress); //发送设备地址+写信号
I2C_SendByte(REG_Address); //发送存储单元地址?从0开始
I2C_Start(); //起始信号
I2C_SendByte(SlaveAddress+1); //发送设备地址+读信号
REG_data=I2C_RecvByte(); //读出寄存器数据
I2C_SendACK(1); //接收应答信号
I2C_Stop(); //停止信号
return REG_data;
}
#endif
这是主函数
#include <msp430x14x.h>
#include "math.h"
/*功能模块头文件*/
#include "1602.h"
#include "mpu6050.h"
#include "Delay.h"
#include "CLOCKINIT.h"
#define uint unsigned int
#define uchar unsigned char
void main()
{
WDTCTL = WDTPW + WDTHOLD;
delay(300); //-上电延时
clockINIT(); //-时钟初始化
P6DIR=0XFF; P6OUT=0Xff; //点亮液晶
LcdReset(); //液晶初始化
delay(500);
I2C_INIT();
delayms(500);
InitMPU6050();
delay(200);
while(1)
{
Display10BitData(GetData(ACCEL_XOUT_H),2,0); //显示X轴加速度
Display10BitData(GetData(ACCEL_YOUT_H),7,0); //显示Y轴加速度
Display10BitData(GetData(ACCEL_ZOUT_H),12,0); //显示Z轴加速度
Display10BitData(GetData(GYRO_XOUT_H),2,1); //显示X轴角速度
Display10BitData(GetData(GYRO_YOUT_H),7,1); //显示Y轴角速度
Display10BitData(GetData(GYRO_ZOUT_H),12,1); //显示Z轴角速度
delayms(250);
}
}
这是6050的
#ifndef __mpu6050_H
#define __mpu6050_H
#include "IIC.h"
#include "Delay.h"
// 定义MPU6050内部地址
//****************************************
#define SMPLRT_DIV 0x19 //陀螺仪采样率?典型值?0x07(125Hz)
#define CONFIG 0x1A //低通滤波频率?典型值?0x06(5Hz)
#define GYRO_CONFIG 0x1B //陀螺仪自检及测量范围?典型值?0x18(不自检?2000deg/s)
#define ACCEL_CONFIG 0x1C //加速计自检、测量范围及高通滤波频率?典型值?0x01(不自检?2G?5Hz) ---里面有AFS_SEL
//--!!!!!!1根据AFS_sel设置的不同,【转换单位】需要除以相应的系数
#define ACCEL_XOUT_H 0x3B
#define ACCEL_XOUT_L 0x3C
#define ACCEL_YOUT_H 0x3D
#define ACCEL_YOUT_L 0x3E
#define ACCEL_ZOUT_H 0x3F
#define ACCEL_ZOUT_L 0x40
#define TEMP_OUT_H 0x41
#define TEMP_OUT_L 0x42
#define GYRO_XOUT_H 0x43
#define GYRO_XOUT_L 0x44
#define GYRO_YOUT_H 0x45
#define GYRO_YOUT_L 0x46
#define GYRO_ZOUT_H 0x47
#define GYRO_ZOUT_L 0x48
#define PWR_MGMT_1 0x6B //电源管理?典型值?0x00(正常启用)
#define WHO_AM_I 0x75 //IIC地址寄存器(默认数值0x68?只读)
//#define SlaveAddress 0xD0 //IIC写入时的地址字节数据?+1为读取
//****************MPU6050
/********初始化MPU6050*/
//--向I2C设备【写】入一个【字节】数据
//--【内部】寄存器【地址】和内部寄存器数据*
void InitMPU6050()
{
//Single_WriteI2C(PWR_MGMT_1, 0x80); //解除休眠状态
/*int i=0,j=0; //在初始化之前要延时一段时间,若没有延时,则断电后再上电数据可能会出错
for (i=0; i<1000; i++)
{
for (j=0; j<1000; j++)
{;}
}*/
Single_WriteI2C(PWR_MGMT_1, 0x01); //选时钟
Single_WriteI2C(SMPLRT_DIV, 0x07); //陀螺仪采样率1KHZ
Single_WriteI2C(CONFIG, 0x06); //加速度44hz滤波,陀螺仪42hz滤波
Single_WriteI2C(GYRO_CONFIG, 0x18); //灵敏度---P14:±2000 °/s
Single_WriteI2C(ACCEL_CONFIG, 0x01); ;//最大量程---P15:
}
//**********合成数据****************************
int GetData(uchar REG_Address)
{
char H,L;
H=Single_ReadI2C(REG_Address);
L=Single_ReadI2C(REG_Address+1);
return (H<<8)+L; //合成数据 -->换具体函数
}
#endif
这是延时
#ifndef __Delay_H
#define __Delay_H
#define uint unsigned int
#define uchar unsigned char
#define CPU_F ((double)8000000)
#define delayus(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) //宏定义延时函数
#define delayms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
/*******************************************
函数名称:Delay5ms
功 能:延时约5ms
参 数:无
返回值 :无
********************************************/
void Delay5ms(void)
{
uint i=40000;
while (i != 0)
{
i--;
}
}
/*******************************************
函数名称:delay5us
功 能:延时约15us的时间
参 数:无
返回值 :无
********************************************/
void delay5us(void)
{
uchar i;
for(i = 0;i < 15;i++)
_NOP();
}
//功 能:延时约1000ms
void Delay1000ms(void)
{
uint i,j;
for(i=40000;i>0;i--)
{
for(j=200;j>0;j--);
}
}
//延时
//****************************************
void delay(unsigned int k)
{
unsigned int i,j;
for(i=0;i<k;i++)
{
for(j=0;j<121;j++);
}
}
#endif
。。。求帮忙看看,实在愁怀了,一周了
一周热门 更多>