找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

基于STC15W的风力摆控制系统设计 带视频与程序(电赛测控题)

查看数: 3202 | 评论数: 1 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2017-9-6 16:26

正文摘要:

风力摆视频演示: $('flv_u9m').innerHTML=(AC_FL_RunContent('width', '500', 'height', '375', 'allowNetworking', 'internal', 'allowScriptAccess', 'never', 'src', 'http://player.youku.com/player.php/sid/ ...

回复

ID:1 发表于 2017-9-6 17:01
MPU-6050.C
  1. //========================================================================
  2. //        城建学院电子实验室
  3. //        修改日期2017.07.30
  4. //        版本V1.0
  5. //========================================================================
  6. //特别声明:此程序
  7. //         
  8. //
  9. //
  10. //                                 MCU工作频率:24MHz
  11. //=========================================================================
  12. #include <STC15F2K60S2.h>        //STC15F2K60S2 STC15系列通用头文件
  13. #include <intrins.h>
  14. #include <MPU6050.H>

  15. sbit    SCL=P3^5;                        //IIC时钟引脚定义
  16. sbit    SDA=P3^4;                        //IIC数据引脚定义

  17. typedef unsigned char uchar;
  18. typedef unsigned char uint;       
  19. void  InitMPU6050();                //初始化MPU6050
  20. void  Delay2us();
  21. void  I2C_Start();
  22. void  I2C_Stop();
  23. bit   I2C_RecvACK();
  24. void  I2C_SendByte(uchar dat);
  25. uchar I2C_RecvByte();
  26. void  I2C_ReadPage();
  27. void  I2C_WritePage();
  28. uchar Single_ReadI2C(uchar REG_Address);                                        //读取I2C数据
  29. void  Single_WriteI2C(uchar REG_Address,uchar REG_data);        //向I2C写入数据
  30. //I^C时序中延时设置,具体参见各芯片的数据手册  6050推荐最小1.3us 但是会出问题,这里延时实际1.9us左右
  31. void Delay2us()       
  32. {
  33.         unsigned char i;
  34.         i = 11;
  35.         while (--i);
  36. }
  37. //**************************************
  38. //I2C起始信号
  39. //**************************************
  40. void I2C_Start()
  41. {
  42.     SDA = 1;                    //拉高数据线
  43.     SCL = 1;                    //拉高时钟线
  44.     Delay2us();                 //延时
  45.     SDA = 0;                    //产生下降沿
  46.     Delay2us();                 //延时
  47.     SCL = 0;                    //拉低时钟线
  48. }
  49. //**************************************
  50. //I2C停止信号
  51. //**************************************
  52. void I2C_Stop()
  53. {
  54.     SDA = 0;                    //拉低数据线
  55.     SCL = 1;                    //拉高时钟线
  56.     Delay2us();                 //延时
  57.     SDA = 1;                    //产生上升沿
  58.     Delay2us();                 //延时
  59. }
  60. //**************************************
  61. //I2C接收应答信号
  62. //**************************************
  63. bit I2C_RecvACK()
  64. {
  65.     SCL = 1;                    //拉高时钟线
  66.     Delay2us();                 //延时
  67.     CY = SDA;                   //读应答信号
  68.     SCL = 0;                    //拉低时钟线
  69.     Delay2us();                 //延时
  70.     return CY;
  71. }
  72. //**************************************
  73. //向I2C总线发送一个字节数据
  74. //**************************************
  75. void I2C_SendByte(uchar dat)
  76. {
  77.     uchar i;
  78.     for (i=0; i<8; i++)         //8位计数器
  79.     {
  80.         dat <<= 1;              //移出数据的最高位
  81.         SDA = CY;               //送数据口
  82.         SCL = 1;                //拉高时钟线
  83.         Delay2us();             //延时
  84.         SCL = 0;                //拉低时钟线
  85.         Delay2us();             //延时
  86.     }
  87.     I2C_RecvACK();
  88. }
  89. //**************************************
  90. //从I2C总线接收一个字节数据
  91. //**************************************
  92. uchar I2C_RecvByte()
  93. {
  94.     uchar i;
  95.     uchar dat = 0;
  96.     SDA = 1;                    //使能内部上拉,准备读取数据,
  97.     for (i=0; i<8; i++)         //8位计数器
  98.     {
  99.         dat <<= 1;
  100.         SCL = 1;                //拉高时钟线
  101.         Delay2us();             //延时
  102.         dat |= SDA;             //读数据
  103.         SCL = 0;                //拉低时钟线
  104.         Delay2us();             //延时
  105.     }
  106.     return dat;
  107. }
  108. //**************************************
  109. //向I2C设备写入一个字节数据
  110. //**************************************
  111. void Single_WriteI2C(uchar REG_Address,uchar REG_data)
  112. {
  113.     I2C_Start();                  //起始信号
  114.     I2C_SendByte(SlaveAddress);   //发送设备地址+写信号
  115.     I2C_SendByte(REG_Address);    //内部寄存器地址,
  116.     I2C_SendByte(REG_data);       //内部寄存器数据,
  117.     I2C_Stop();                   //发送停止信号
  118. }
  119. //**************************************
  120. //从I2C设备读取一个字节数据
  121. //**************************************
  122. uchar Single_ReadI2C(uchar REG_Address)
  123. {
  124.         uchar REG_data;
  125.         I2C_Start();                   //起始信号
  126.         I2C_SendByte(SlaveAddress);    //发送设备地址+写信号
  127.         I2C_SendByte(REG_Address);     //发送存储单元地址,从0开始
  128.         I2C_Start();                   //起始信号
  129.         I2C_SendByte(SlaveAddress+1);  //发送设备地址+读信号
  130.         REG_data=I2C_RecvByte();       //读出寄存器数据
  131.        
  132.         SDA = 1;                    //写应答信号
  133.         SCL = 1;                    //拉高时钟线
  134.         Delay2us();                 //延时
  135.         SCL = 0;                    //拉低时钟线
  136.         Delay2us();                 //延时
  137.        
  138.         I2C_Stop();                    //停止信号
  139.         return REG_data;
  140. }

  141. //**************************************
  142. //初始化MPU6050
  143. //**************************************
  144. void InitMPU6050()
  145. {
  146.         Single_WriteI2C(PWR_MGMT_1, 0x00);        //解除休眠状态
  147.         Single_WriteI2C(SMPLRT_DIV, 0x07);  //陀螺仪125hz
  148.         Single_WriteI2C(CONFIG, 0x04);      //21HZ滤波 延时A8.5ms G8.3ms  此处取值应相当注意,延时与系统周期相近为宜
  149.         Single_WriteI2C(GYRO_CONFIG, 0x08); //陀螺仪500度/S 65.5LSB/g
  150.         Single_WriteI2C(ACCEL_CONFIG, 0x08);//加速度+-4g  8192LSB/g
  151. }
  152. //**************************************
  153. //合成数据
  154. //**************************************
  155. int GetData(uchar REG_Address)
  156. {
  157.         char H,L;
  158.         H=Single_ReadI2C(REG_Address);
  159.         L=Single_ReadI2C(REG_Address+1);
  160.         return (H<<8)+L;   //合成数据
  161. }

  162.        
复制代码

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

Powered by 单片机教程网

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