找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1631|回复: 0
收起左侧

陀螺仪

[复制链接]
ID:239625 发表于 2017-11-22 18:43 | 显示全部楼层 |阅读模式
  • #include <REG52.H>
  • #include <math.h>
  • #include <stdio.h>
  • #include <INTRINS.H>
  • typedef unsigned char  uchar;
  • typedef unsigned short ushort;
  • typedef unsigned int   uint;
  • //****************************************
  • // 定义51单片机端口
  • //****************************************
  • sbit    SCL=P1^0;                        //IIC时钟引脚定义
  • sbit    SDA=P1^1;                        //IIC数据引脚定义
  • //****************************************
  • //****************************************
  • sbit LSA=P2^2;
  • sbit LSB=P2^3;
  • sbit LSC=P2^4;
  • uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  • uchar deal[8];
  • void delays(uint i)
  • {
  •         while(i--);
  • }
  • void DigDisplay()
  • {
  •         uchar i;
  •         for(i=0;i<8;i++)
  •         {
  •                 switch(i)         //位选,选择点亮的数码管,
  •                 {
  •                         case(0):
  •                                 LSA=0;LSB=0;LSC=0; break;//显示第0位
  •                         case(1):
  •                                 LSA=1;LSB=0;LSC=0; break;//显示第1位
  •                         case(2):
  •                                 LSA=0;LSB=1;LSC=0; break;//显示第2位
  •                         case(3):
  •                                 LSA=1;LSB=1;LSC=0; break;//显示第3位
  •                         case(4):
  •                                 LSA=0;LSB=0;LSC=1; break;//显示第4位
  •                         case(5):
  •                                 LSA=1;LSB=0;LSC=1; break;//显示第5位
  •                         case(6):
  •                                 LSA=0;LSB=1;LSC=1; break;//显示第6位
  •                         case(7):
  •                                 LSA=1;LSB=1;LSC=1; break;//显示第7位
  •                 }
  •                 P0=deal;//发送段码
  •                 delays(100); //间隔一段时间扫描
  •                 P0=0x00;//消隐
  •         }
  • }
  • //****************************************
  • // 定义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为读取
  • int        dis_data;                                                //变量
  • void  delay(unsigned int k);                                                                                //延时
  • //MPU6050操作函数
  • void  InitMPU6050();                                                                                                        //初始化MPU6050
  • void  Delay5us();
  • void  I2C_Start();
  • void  I2C_Stop();
  • void  I2C_SendACK(bit ack);
  • bit   I2C_RecvACK();
  • void  I2C_SendByte(uchar dat);
  • uchar I2C_RecvByte();
  • void  I2C_ReadPage();
  • void  I2C_WritePage();
  • void  display_ACCEL_x();
  • void  display_ACCEL_y();
  • void  display_ACCEL_z();
  • uchar Single_ReadI2C(uchar REG_Address);                                                //读取I2C数据
  • void  Single_WriteI2C(uchar REG_Address,uchar REG_data);        //向I2C写入数据
  • //****************************************
  • //延时
  • //****************************************
  • void delay(unsigned int k)
  • {
  •         unsigned int i,j;
  •         for(i=0;i<k;i++)
  •         {
  •                 for(j=0;j<121;j++);
  •         }
  • }
  • //**************************************
  • //延时5微秒(STC90C52RC@12M)
  • //**************************************
  • void Delay5us()
  • {
  •         _nop_();_nop_();_nop_();_nop_();
  •         _nop_();_nop_();_nop_();_nop_();
  •         _nop_();_nop_();_nop_();_nop_();
  •         _nop_();_nop_();_nop_();_nop_();
  •         _nop_();_nop_();_nop_();_nop_();
  •         _nop_();_nop_();_nop_();_nop_();
  • }
  • //**************************************
  • //I2C起始信号
  • //**************************************
  • void I2C_Start()
  • {
  •     SDA = 1;
  •     SCL = 1;
  •     Delay5us();
  •     SDA = 0;
  •     Delay5us();
  •     SCL = 0;
  • }
  • //**************************************
  • //I2C停止信号
  • //**************************************
  • void I2C_Stop()
  • {
  •     SDA = 0;
  •     SCL = 1;
  •     Delay5us();
  •     SDA = 1;
  •     Delay5us();
  • }
  • //**************************************
  • //I2C发送应答信号
  • //入口参数:ack (0:ACK 1:NAK)
  • //**************************************
  • void I2C_SendACK(bit ack)
  • {
  •     SDA = ack;
  •     SCL = 1;
  •     Delay5us();
  •     SCL = 0;
  •     Delay5us();
  • }
  • //**************************************
  • //I2C接收应答信号
  • //**************************************
  • bit I2C_RecvACK()
  • {
  •     SCL = 1;
  •     Delay5us();
  •     CY = SDA;
  •     SCL = 0;
  •     Delay5us();
  •     return CY;
  • }
  • //**************************************
  • //向I2C总线发送一个字节数据
  • //**************************************
  • void I2C_SendByte(uchar dat)
  • {
  •     uchar i;
  •     for (i=0; i<8; i++)
  •     {
  •         dat <<= 1;
  •         SDA = CY;
  •         SCL = 1;
  •         Delay5us();
  •         SCL = 0;
  •         Delay5us();
  •     }
  •     I2C_RecvACK();
  • }
  • //**************************************
  • //从I2C总线接收一个字节数据
  • //**************************************
  • uchar I2C_RecvByte()
  • {
  •     uchar i;
  •     uchar dat = 0;
  •     SDA = 1;
  •     for (i=0; i<8; i++)
  •     {
  •         dat <<= 1;
  •         SCL = 1;
  •         Delay5us();
  •         dat |= SDA;
  •         SCL = 0;
  •         Delay5us();
  •     }
  •     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);
  •         I2C_Start();
  •         I2C_SendByte(SlaveAddress+1);
  •         REG_data=I2C_RecvByte();
  •         I2C_SendACK(1);
  •         I2C_Stop();
  •         return REG_data;
  • }
  • //**************************************
  • //初始化MPU6050
  • //**************************************
  • void InitMPU6050()
  • {
  •         Single_WriteI2C(PWR_MGMT_1, 0x00);
  •         Single_WriteI2C(SMPLRT_DIV, 0x07);
  •         Single_WriteI2C(CONFIG, 0x06);
  •         Single_WriteI2C(GYRO_CONFIG, 0x18);
  •         Single_WriteI2C(ACCEL_CONFIG, 0x19);
  • }
  • //**************************************
  • //合成数据
  • //**************************************
  • int GetData(uchar REG_Address)
  • {
  •         char H,L;
  •         H=Single_ReadI2C(REG_Address);
  •         L=Single_ReadI2C(REG_Address+1);
  •         return (H<<8)+L;
  • }
  • void dealdate()
  • {
  •         int a;
  •         a=GetData(ACCEL_ZOUT_H);
  •         a=a/2;
  •         if(a>=0)
  •         {
  •                 deal[7]=0x00;
  •                 deal[5]=smgduan[a/100000];
  •                 deal[4]=smgduan[a%100000/10000];
  •                 deal[3]=smgduan[a%10000/1000];
  •                 deal[2]=smgduan[a%1000/100]|0x80;
  •                 deal[1]=smgduan[a%100/10];
  •                 deal[0]=smgduan[a%10];
  •         }
  •         else
  •         {
  •                 a=a-1;
  •                 a=~a;
  •                 deal[7]=0x40;
  •                 deal[5]=smgduan[a/100000];
  •                 deal[4]=smgduan[a%100000/10000];
  •                 deal[3]=smgduan[a%10000/1000];
  •                 deal[2]=smgduan[a%1000/100]|0x80;
  •                 deal[1]=smgduan[a%100/10];
  •                 deal[0]=smgduan[a%10];
  •         }
  • }
  • void main()
  • {
  •         uint k;
  •         delay(500);
  •         InitMPU6050();        //初始化MPU6050
  •         delay(150);
  •         dealdate();
  •         while(1)
  •         {
  •                 k++;
  •                 if(k>=15)
  •                 {
  •                         dealdate();
  •                         k=0;
  •                 }
  •                 DigDisplay();
  •         }
  • }

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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