搜索
bottom↓
回复: 6

有谁用过MPU-6050角度传感器,求教

[复制链接]

出0入0汤圆

发表于 2013-5-1 16:19:16 | 显示全部楼层 |阅读模式
现在正在弄MPU-6050角度传感器,求质料和430的程序

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2013-5-3 20:53:05 | 显示全部楼层
求不到的,只有自己找前辈写的一些程序自己再改

出0入0汤圆

 楼主| 发表于 2013-5-3 21:36:46 | 显示全部楼层
ppocat_check 发表于 2013-5-3 20:53
求不到的,只有自己找前辈写的一些程序自己再改

这两天用模拟的I2C写,应为430的IO口没有双工模式,写不了,现在正在用硬件I2C写

出0入0汤圆

发表于 2013-5-25 23:38:32 | 显示全部楼层
430用IIC读数据的时候 SDA改成DIR_IN 就可以了- - ......

出0入0汤圆

 楼主| 发表于 2013-5-26 10:06:40 | 显示全部楼层
sxliujin 发表于 2013-5-25 23:38
430用IIC读数据的时候 SDA改成DIR_IN 就可以了- - ......

我是用的模拟I2C写的

出0入0汤圆

发表于 2013-7-16 22:20:49 | 显示全部楼层
#include "i2c.h"
#include  "mpu6050.h"
unsigned char CY=0;
void Delay5us()
{
     _NOP(); _NOP(); _NOP(); _NOP(); _NOP();
     _NOP(); _NOP();_NOP(); _NOP();_NOP();
}

//**************************************
//I2C起始信号
//**************************************
void I2C_Start()
{
    SET_SDA;                   //拉高数据线
    SET_SCL;                   //拉高时钟线
    Delay5us();                 //延时
    RESET_SDA;                   //产生下降沿
    Delay5us();                 //延时
    RESET_SCL;                  //拉低时钟线
}
//**************************************
//I2C停止信号
//**************************************
void I2C_Stop()
{
    RESET_SDA;                    //拉低数据线
    SET_SCL;                    //拉高时钟线
    Delay5us();                 //延时
    SET_SDA;                   //产生上升沿
    Delay5us();                 //延时
}
//**************************************
//I2C发送应答信号
//入口参数:ack (0:ACK 1:NAK)
//**************************************
//(51单片机)
/********************************
void I2C_SendACK(bit ack)
{
    SDA = ack;                  //写应答信号
    SET_SCL;                  //拉高时钟线
    Delay5us();                 //延时
    RESET_SCL;                  //拉低时钟线
    Delay5us();                 //延时
}
*********************************/
//(430单片机)
void I2C_SendACK(uchar ack)
{
   if(ack) SET_SDA;
    else RESET_SDA ;            //写应答信号
    SET_SCL;                  //拉高时钟线
    Delay5us();                 //延时
    RESET_SCL;                  //拉低时钟线
    Delay5us();                 //延时
}
//**************************************
//I2C接收应答信号
//**************************************
uchar I2C_RecvACK()
{
    P1DIR &=0xef; //SDA输入
    SET_SCL;                     //拉高时钟线
    Delay5us();                 //延时
    CY = P1IN&0x10;             //读应答信号
    RESET_SCL;                  //拉低时钟线
    Delay5us();                 //延时
    P1DIR |=0x10; //SDA输出
    return CY;
}
//**************************************
//向I2C总线发送一个字节数据
//**************************************
void I2C_SendByte(uchar dat)
{
    uchar i;
    for (i=0; i<8; i++)         //8位计数器
    {
         //(51单片机)
        //dat <<= 1;              //移出数据的最高位
       // SDA = CY;               //送数据口
      /*******************************/
      // (430单片机)  
        CY=dat&0x80;              
        if(CY==0) RESET_SDA;
          else  SET_SDA;
          dat <<= 1;//移出数据的最高位
       /*******************************/
        SET_SCL;                 //拉高时钟线
        Delay5us();             //延时
        RESET_SCL;                //拉低时钟线
        Delay5us();             //延时
    }
    I2C_RecvACK();
}

//**************************************
//从I2C总线接收一个字节数据
//**************************************
uchar I2C_RecvByte()
{
    uchar i;
    uchar dat = 0;
    P1DIR &=0xef; //SDA输入
    SET_SDA;  //使能内部上拉,准备读取数据,
    for (i=0; i<8; i++)         //8位计数器
    {
        dat <<= 1;
        SET_SCL;                  //拉高时钟线
        Delay5us();             //延时
        dat |= ((P1IN &0x10)>>4);             //读数据               
        RESET_SCL;                //拉低时钟线
        Delay5us();             //延时
    }
    P1DIR |=0x10; //SDA输出
    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;
}

出0入0汤圆

发表于 2013-7-17 15:11:04 | 显示全部楼层
资料可以去智能小车相关的论坛搜搜,很多。

I2C建议参考一下白沙怀表的程序,里面有模拟的I2C程序。

附件是我找的读写AT24c02的硬件I2C程序,

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-18 11:54

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表