新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > MPU6050使用I2C協議讀出X軸原始數據的51單片機程序

        MPU6050使用I2C協議讀出X軸原始數據的51單片機程序

        作者: 時間:2016-12-01 來源:網絡 收藏
        主:STC89C54

        下面代碼

        #include
        #define uchar unsigned char
        //#define addr_x 0xae // 寫
        //#define addr_d 0xaf // 讀
        sbit sda = P2^1; //數據管腳
        sbit scl = P2^0; //時鐘管腳
        bit ack;
        //****************************************
        // 定義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)
        #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為讀取
        void DelayUs2x(unsigned char t) //延時1
        {
        while(--t);
        }
        void DelayMs(unsigned char t) //延時2
        {
        while(t--)
        {
        //大致延時1mS
        DelayUs2x(245);
        DelayUs2x(245);
        }
        }
        void delay() //延時大于4μs
        {;;}
        //*******************I2C操作協議******************************
        void i2_qs() //起始信號
        {
        sda = 1; //拉高數據
        scl = 1; //拉高時鐘
        delay(); //延時大于 4μs
        sda = 0; //拉低數據產生起始信號(下降沿)
        delay(); //延時大于 4μs
        scl = 0; //拉低時鐘
        delay(); //延時大于 4μs
        }
        void i2_tz() //停止信號
        {
        sda = 0; //拉低數據
        scl = 1; //拉高時鐘
        delay(); //延時大于 4μs
        sda = 1; //拉高時鐘產生結束信號(上升沿)
        delay(); //延時大于 4μs
        }
        void i2_ack(bit _ack) //入口產生 0 ack 1 nak
        {
        sda = _ack; //ack或者nak
        scl = 1; //拉高時鐘
        delay(); //延時大于 4μs
        scl = 0; //拉低時鐘
        delay(); //延時大于 4μs
        }
        void i2_fs(uchar Data) //發送8位數據
        {
        uchar i;
        for(i=0;i<8;i++) //8位計數
        {
        Data <<= 1; //把最高位移送到進制標志位中(CY)
        sda = CY; //把進制位中的數據賦值給數據線
        scl = 1; //拉高時鐘
        delay(); //延時大于 4μs
        scl = 0; //拉低時鐘
        //這里
        }
        //下面代碼是接收ACK的代碼
        delay();//延時大于 4μs
        sda = 1; //拉高數據準備接收ACK
        scl = 1; //拉高時鐘產生穩定的有效的數據(相對的)
        if(sda==1) //確認接收的是ACK還是NAK
        ack = 0;//ack
        else
        ack = 1;//nak
        scl = 0; //拉低時鐘
        delay(); //延時大于 4us
        }
        uchar i2_js() //接收8位數據
        {
        uchar i,Data = 0;
        sda = 1; //使能內部上拉,準備讀取數據
        for(i=0;i<8;i++) //8位計數器
        {
        Data <<= 1; //移出數據的最高位
        scl = 1; //拉高時鐘
        delay(); //延時大于 4us
        Data |= sda;//接收數據
        scl = 0; //拉低時鐘
        delay(); //延時大于 4us
        }
        return Data;
        }
        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 蕉岭县| 七台河市| 黎川县| 同心县| 永寿县| 太康县| 八宿县| 萝北县| 京山县| 苗栗市| 阿拉善右旗| 灵台县| 翼城县| 绥宁县| 长岛县| 开化县| 盖州市| 太原市| 洛扎县| 修水县| 繁昌县| 乌海市| 壤塘县| 松原市| 裕民县| 金门县| 彰化县| 罗山县| 台南县| 菏泽市| 红河县| 灌云县| 三台县| 天津市| 进贤县| 新建县| 高密市| 景德镇市| 双桥区| 太白县| 康乐县|