欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1651|回復: 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 單片機教程網

快速回復 返回頂部 返回列表