微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 我写了mpu6050的驱动程序,可是无法正常运行,望大神解答!

我写了mpu6050的驱动程序,可是无法正常运行,望大神解答!

时间:10-02 整理:3721RD 点击:
单片机我用的是stc15f2k60s2,以下是程序:

  1. 这是主函数:
  2. #include "stc15f2k60s2.H"       
  3. #include "math.h"    //Keil library  
  4. #include "stdio.h"   //Keil library       
  5. #include "intrins.h"
  6. #include "mpu9150.h"

  7. /*********************************/
  8. //存放结果字符串
  9. unsigned char Data[17];
  10. /*********************************/

  11. void Delay(unsigned int q);
  12. int GetData(add);
  13. void Uart1_SendString(unsigned char *PBuf);
  14. void Uart1_Init(void);
  15. void MPU9150_Init(void);
  16. void OUT_put(int value);
  17. void INT_CHAR(unsigned char *PBuf,int value);

  18. //mpu9150***
  19. unsigned char I2C_ReadReg(unsigned char add);
  20. void I2C_WriteReg(unsigned char add,unsigned char dat);
  21. unsigned char I2C_RecvByte(void);
  22. bit I2C_SendByte(unsigned char dat);
  23. bit I2C_RecvACK();
  24. void I2C_SendACK(bit ack);
  25. void I2C_Stop(void);
  26. void I2C_Start(void);
  27. void Delay5us();



  28. void main(void)
  29. {
  30.    Delay(500);
  31.    Uart1_Init();
  32.    MPU9150_Init();
  33.    Delay(150);
  34.    while(1)
  35.    {
  36.       OUT_put(GetData(ACCEL_XOUT_H));
  37.       Uart1_SendString("aa");
  38.       OUT_put(GetData(ACCEL_YOUT_H));
  39.       Uart1_SendString("bb");
  40.       OUT_put(GetData(ACCEL_ZOUT_H));
  41.       Uart1_SendString("cc");

  42.       OUT_put(GetData(GYRO_XOUT_H));
  43.       Uart1_SendString("dd");
  44.       OUT_put(GetData(GYRO_YOUT_H));
  45.       Uart1_SendString("ee");
  46.       OUT_put(GetData(GYRO_ZOUT_H));
  47.       Uart1_SendString("ff");
  48.       OUT_put(I2C_ReadReg(WHO_AM_I));
  49.       Delay(500);
  50.    }
  51. }
  52. //*************mpu9150初始化************
  53. void MPU9150_Init(void)
  54. {
  55.    I2C_WriteReg(PWR_MGMT_1,0x00);
  56.    I2C_WriteReg(SMPLRT_div,0x07);
  57.    I2C_WriteReg(CONFIG,0x06);
  58.    I2C_WriteReg(GYRO_CONFIG,0x18);
  59.    I2C_WriteReg(ACCEL_CONFIG,0x01);

  60. }

  61. /*******************延时*********************/
  62. void Delay(unsigned int q)   //误差 -0.005353009259us
  63. {
  64.     for(;q>0;q--);
  65.     _nop_();  //if Keil,require use intrins.h
  66. }

  67. /***********************************************
  68. *函数名称:Uart1_SendChar
  69. *功    能:串口1发送单个字符函数
  70. *入口参数:Udat:欲发送的数据
  71. *返 回 值:无       
  72. *备    注:无
  73. ************************************************/
  74. void Uart1_SendChar(unsigned char Udat)
  75. {
  76.         SBUF=Udat;                //将数据放入发送缓冲区
  77.         while(!TI);                //等待发送完成
  78.     TI=0;                     //清零TI               
  79. }
  80. /***********************************************
  81. *函数名称:Uart_SendString
  82. *功    能:串口发送字符串函数
  83. *入口参数:*PBuf:指向字符串的指针            
  84. *返 回 值:无       
  85. *备    注:无
  86. ************************************************/
  87. void Uart1_SendString(unsigned char *PBuf)
  88. {
  89.     while(*PBuf!='\0')             //未到字符串末尾
  90.     {
  91.                     Uart1_SendChar(*PBuf);//发送数据
  92.                   PBuf++;                                  //移动指针
  93.     }
  94. }

  95. /*************读取数据***********************/
  96. int GetData(add)
  97. {
  98.    unsigned char H,L,T;
  99.    H=I2C_ReadReg(add);
  100.    L=I2C_ReadReg(add+1);
  101.    T=H+L;
  102.    return T;
  103. }
  104. /***********************************************
  105. 函数名称:Uart1_Init
  106. 功    能:串口1初始化函数
  107. 入口参数:无
  108. 返 回 值:无       
  109. 备    注:STC15F2K60S2单片机串口1
  110.           可以选择定时器1或者定时器2作为波特率发生器
  111. ************************************************/
  112. void Uart1_Init(void)
  113. {
  114.         SCON=0x50;      //0101 0000 模式1: 1 位起始位; 8 位数据;  1 位停止位;允许接收
  115.         T2L=0xe8;                //波特率9600  11.0592MHz       
  116.         T2H=0xff;
  117.         AUXR |=0x11;        //串口选择定时器2作为波特率发生器,并且启动定时器       
  118. }
  119. /****************输出处理*******************/

  120. void OUT_put(int value)
  121. {
  122.    INT_CHAR(Data,value);
  123.    Uart1_SendString(Data);      
  124. }

  125. /****************int转char***********************/
  126. void INT_CHAR(unsigned char *Data,value)
  127. {
  128.    if(value<0)
  129.    {
  130.       value=-value;
  131.       *Data='-';
  132.    }
  133.    else
  134.    {
  135.    *Data=' ';
  136.    }
  137.    *++Data  = value/1000000000000000+0x30;
  138.    value    = value%1000000000000000;

  139.    *++Data  = value/100000000000000+0x30;
  140.    value    = value%100000000000000;

  141.    *++Data  = value/10000000000000+0x30;
  142.    value    = value%10000000000000;

  143.    *++Data  = value/1000000000000+0x30;
  144.    value    = value%1000000000000;

  145.    *++Data  = value/100000000000+0x30;
  146.    value    = value%100000000000;

  147.    *++Data  = value/10000000000+0x30;
  148.    value    = value%10000000000;

  149.    *++Data  = value/1000000000+0x30;
  150.    value    = value%1000000000;

  151.    *++Data  = value/100000000+0x30;
  152.    value    = value%100000000;     

  153.    *++Data  = value/10000000+0x30;
  154.    value    = value%10000000;

  155.    *++Data  = value/1000000+0x30;
  156.    value    = value%1000000;

  157.    *++Data  = value/100000+0x30;
  158.    value    = value%100000;

  159.    *++Data  = value/10000+0x30;
  160.    value    = value%10000;

  161.    *++Data  = value/1000+0x30;
  162.    value    = value%1000;

  163.    *++Data  = value/100+0x30;
  164.    value    = value%100;

  165.    *++Data  = value/10+0x30;
  166.    value    = value%10;

  167.    *++Data  = value+0x30;
  168.    value    = value;            
  169. }

  170. #ifndef __mpu9150_h__
  171. #define        __mpu9150_h__

  172. #include "stc15f2k60s2.h"


  173. //****************************************
  174. // 定义51单片机端口
  175. //****************************************
  176. sbit    SCL=P1^0;                        //IIC时钟引脚定义
  177. sbit    SDA=P1^1;                        //IIC数据引脚定义
  178. //****************************************
  179. // 定义MPU6050内部地址
  180. //****************************************
  181. #define        SMPLRT_div                0x19        //陀螺仪采样率,典型值:0x07(125Hz)
  182. #define        CONFIG                        0x1A        //低通滤波频率,典型值:0x06(5Hz)
  183. #define        GYRO_CONFIG                0x1B        //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
  184. #define        ACCEL_CONFIG        0x1C        //加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)
  185. #define        ACCEL_XOUT_H        0x3B
  186. #define        ACCEL_XOUT_L        0x3C
  187. #define        ACCEL_YOUT_H        0x3D
  188. #define        ACCEL_YOUT_L        0x3E
  189. #define        ACCEL_ZOUT_H        0x3F
  190. #define        ACCEL_ZOUT_L        0x40
  191. #define        TEMP_OUT_H                0x41
  192. #define        TEMP_OUT_L                0x42
  193. #define        GYRO_XOUT_H                0x43
  194. #define        GYRO_XOUT_L                0x44       
  195. #define        GYRO_YOUT_H                0x45
  196. #define        GYRO_YOUT_L                0x46
  197. #define        GYRO_ZOUT_H                0x47
  198. #define        GYRO_ZOUT_L                0x48
  199. #define        PWR_MGMT_1                0x6B        //电源管理,典型值:0x00(正常启用)
  200. #define        WHO_AM_I                        0x75        //IIC地址寄存器(默认数值0x68,只读)
  201. #define        SlaveAddress        0xd0        //IIC写入时的地址字节数据,+1为读取




  202. #endif
  203. #include <mpu9150.h>       
  204. #include <stc15f2k60s2.H>
  205. #include <INTRINS.H>
  206. #include <mpu9150.h>
  207. typedef unsigned char  uchar;
  208. typedef unsigned short ushort;
  209. typedef unsigned int   uint;



  210. //**************************************
  211. //延时5微秒(STC90C52RC@12M)
  212. //不同的工作环境,需要调整此函数
  213. //当改用1T的MCU时,请调整此延时函数
  214. //**************************************
  215. void Delay5us()
  216. {
  217.     unsigned char a,b;
  218.     for(b=3;b>0;b--)
  219.         for(a=2;a>0;a--);
  220.     _nop_();  //if Keil,require use intrins.h
  221. }
  222. //**************************************
  223. //I2C起始信号
  224. //**************************************
  225. void I2C_Start(void)
  226. {
  227.     SDA = 1;                    //拉高数据线
  228.     SCL = 1;                    //拉高时钟线
  229.     Delay5us();                 //延时
  230.     SDA = 0;                    //产生下降沿
  231.     Delay5us();                 //延时
  232.     SCL = 0;                    //拉低时钟线
  233.     Delay5us();                 //延时
  234. }
  235. //**************************************
  236. //I2C停止信号
  237. //**************************************
  238. void I2C_Stop(void)
  239. {
  240.     SDA = 0;                    //拉低数据线
  241.     SCL = 1;                    //拉高时钟线
  242.     Delay5us();                 //延时
  243.     SDA = 1;                    //产生上升沿
  244.     Delay5us();                 //延时
  245. }
  246. //**************************************
  247. //I2C发送应答信号
  248. //入口参数:ack (0:ACK 1:NAK)
  249. //**************************************
  250. void I2C_SendACK(bit ack)
  251. {
  252.     SDA = ack;                  //写应答信号
  253.     SCL = 1;                    //拉高时钟线
  254.     Delay5us();                 //延时
  255.     SCL = 0;                    //拉低时钟线
  256.     Delay5us();                 //延时
  257. }
  258. //**************************************
  259. //I2C接收应答信号
  260. //**************************************
  261. bit I2C_RecvACK()
  262. {
  263.         bit ack;
  264.     SCL = 1;                    //拉高时钟线
  265.     Delay5us();                 //延时
  266.     ack = SDA;                   //读应答信号
  267.     SCL = 0;                    //拉低时钟线
  268.     Delay5us();                 //延时
  269.     return ack;
  270. }
  271. //**************************************
  272. //向I2C总线发送一个字节数据
  273. //**************************************
  274. bit I2C_SendByte(uchar dat)
  275. {
  276.     uchar i;

  277.     for (i=0; i<8; i++)         //8位计数器
  278.     {
  279.                 if( (dat&0x80)==0x80 )        //先发送高字节
  280.                  {
  281.                            SDA = 1;
  282.                  }
  283.                  else
  284.                  {
  285.                            SDA = 0;
  286.                  }
  287.         dat <<= 1;              //移出数据的最高位
  288.         SCL = 1;         //拉高时钟线
  289.         Delay5us();      //延时
  290.         SCL = 0;         //拉低时钟线
  291.         Delay5us();      //延时
  292.     }   
  293.     return I2C_RecvACK();
  294. }
  295. //**************************************
  296. //向I2C总线接收一个字节数据
  297. //**************************************
  298. unsigned char I2C_RecvByte(void)
  299. {
  300.     unsigned char i;
  301.     unsigned char dat = 0;

  302.       SDA=1;                            

  303.     for (i=0; i<8; i++)         //8位计数器
  304.     {
  305.         dat <<= 1;
  306.         SCL=1;               //拉高时钟线
  307.         Delay5us();      //延时
  308.         dat |= SDA;   //读数据
  309.         SCL=0;         //拉低时钟线
  310.         Delay5us();      //延时
  311.     }
  312.     return dat;
  313. }

  314. /************写mpu9150寄存器************************/


  315. void I2C_WriteReg(unsigned char add,unsigned char dat)
  316. {
  317.     I2C_Start();                            //起始信号
  318.     I2C_SendByte(SlaveAddress);          //发送设备地址+写信号
  319.     I2C_SendByte(add);                           //发送寄存器地址
  320.            I2C_SendByte(dat);                                //发送寄存器数据
  321.     I2C_Stop();                             //停止信号
  322. }

  323. /************读mpu9150寄存器********************/
  324. unsigned char I2C_ReadReg(unsigned char add)
  325. {
  326.         unsigned char dat;
  327.     I2C_Start();                            //起始信号
  328.     I2C_SendByte(SlaveAddress);  //发送设备地址+写信号
  329.     I2C_SendByte(add);                           //发送寄存器地址
  330.     I2C_Start();                            //起始信号
  331.     I2C_SendByte(SlaveAddress+1);  //发送设备地址+读信号

  332.         dat=I2C_RecvByte();                                //接收数据

  333.         I2C_SendACK(1);                         //最后一个数据需要NAK
  334.     I2C_Stop();                             //停止信号
  335.         return dat;
  336. }

复制代码



这个比较专业,看不懂也帮顶

LZ流芳万世,继续造福坛友吧!谢谢了

138./****************int转char***********************/
139.void INT_CHAR(unsigned char *Data,value)
140.{
141.   if(value<0)
142.   {
143.      value=-value;
144.      *Data='-';
145.   }
146.   else
147.   {
148.   *Data=' ';
149.   }
150.   *++Data  = value/1000000000000000+0x30;  //value是什么类型虹呀!我还没用个这么大的数呢!
151.   value    = value%1000000000000000;

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top