陀螺仪的头文件和i2c的基本函数
mpu6050.h头文件:
- #ifndef _MPU6050_H_
- #define _MPU6050_H_
- #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 // 存储最近的X轴、Y轴、Z轴加速度感应器的测量值 */
- #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 // 存储最近的X轴、Y轴、Z轴陀螺仪感应器的测量值 */ #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,只读) */
- #endif
复制代码
单片机源程序如下:
- #include"Init_i2c.h"
- void Init_mpu6050()
- {
- write_add(PWR_MGMT_1, 0x00); //解除休眠状态
- write_add(SMPLRT_DIV, 0x07);
- write_add(CONFIG, 0x06);
- write_add(ACCEL_CONFIG, 0x01);
- write_add(GYRO_CONFIG, 0x18);
- }
- int get_data(char address)
- {
- char High,Low;
- High=read_add(address); //读取高八位
- Low=read_add(address+1); //读取低八位
- return(High<<8)+Low;
- }
-
- //*******初始化****************
- void init()
- {
- SCL=1; //拉高时钟线
- delay1);
- SDA=1; //拉高数据线
- delay1();
- }
- //***启动信号***********************
- void start()
- {
- SDA=1; //拉高数据线
- delay1();
- SCL=1; //拉高时钟线
- delay1();
- SDA=0; //拉低数据线
- delay1();
- SCL=0; //拉低时钟线
- }
- //************停止信号**************
- void stop()
- {
- SDA=0; //拉低数据线
- delay1();
- SCL=1; //拉高时钟线
- delay1();
- SDA=1; //拉高数据线
- delay1();
- }
- //***********回应信号**************
- void respons()
- {
- uchar i=0;SCL=1;
- delay1();
- while((SDA==1)&&(i<255))
- i++;
- SCL=0;
- delay1();
- }
- //*************写一个字节*************
- void writebyte(uchar date)
- {
- uchar i,temp;
- temp=date;
- for(i=0;i<8;i++)
- {
- temp=temp<<1; //送出最高位
- SCL=0; //拉低时钟线
- delay1();
- SDA=CY; //送数据
- delay1();
- SCL=1; //拉高时钟线
- delay1();
- }
- SCL=0;
- delay1();
- SDA=1;
- delay1();
- }
- //*************读一个字节****************
- uchar readbyte()
- {
- uchar i,j,k;
- SCL=0; //拉低时钟线
- delay1(); // 延时
- SDA=1; //拉高数据线
- for(i=0;i<8;i++)
- {
- SCL=1; //拉高数据线
- delay1();
- if(SDA==1) //判断数据线是否为高电平
- j=1;
- else
- j=0;
- k=(k<<1)|j; //数据存入最低位
- SCL=0; //拉低时钟线
- delay1();
- }
- delay1();
- return k;
- }
- //***************指定地址读一个字节数据****************
- uchar read_add(uchar address)
- {
- uchar dd;
- start(); //启动信号
- writebyte(0xd0); //写入
- respons();
- writebyte(address); //发送寄存器地址
- respons();
- start();
- writebyte(0xd1); //读取
- respons();
- dd=readbyte();
- stop(); //终止信号
- return dd; //返回值
- }
- //*************指定地址写一个字节数据*********
- void write_add(uchar address,uchar info)
- {
- start();
- writebyte(0xd0); //写入
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
Init_i2c.zip
(1.96 KB, 下载次数: 37)
|