单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:13991|回复:24
打印上一主题下一主题

MPU6050加速度传感器显示(lcd+数码管)自己写的!!

 [复制链接]
跳转到指定楼层
楼主
ID:162229发表于 2017-2-12 21:27|只看该作者|只看大图回帖奖励
废话不说,先上几张图
还有一个小视频供大家观赏:http://v.youku.com/v_show/id_XMjUwODY3Mjg5Ng==.html



附件里有MPU6050的中文资料和自己写的程序,包括在lcd1602显示和在数码管显示,另外带有一些其他的一些资料。

数码管显示的程序:
  1. #include< REG52.H>    
  2. #include< math.h>  
  3. #include< stdio.h>  
  4. #include< INTRINS.H>
  5. typedef unsigned char  uchar;
  6. typedef unsigned short ushort;
  7. typedef unsigned int   uint;
  8. //****************************************
  9. // 定义51单片机端口
  10. //****************************************
  11. sbit   SCL=P1^0;             //IIC时钟引脚定义
  12. sbit   SDA=P1^1;             //IIC数据引脚定义
  13. //****************************************
  14. //****************************************
  15. sbit LSA=P2^2;
  16. sbit LSB=P2^3;
  17. sbit LSC=P2^4;
  18. uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  19. uchar deal[8];
  20. void delays(uint i)
  21. {
  22.      while(i--);    
  23. }

  24. void DigDisplay()
  25. {
  26.      uchar i;
  27.      for(i=0;i<8;i++)
  28.      {
  29.          switch(i)       //位选,选择点亮的数码管,
  30.          {
  31.              case(0):
  32.                  LSA=0;LSB=0;LSC=0; break;//显示第0位
  33.              case(1):
  34.                  LSA=1;LSB=0;LSC=0; break;//显示第1位
  35.              case(2):
  36.                  LSA=0;LSB=1;LSC=0; break;//显示第2位
  37.              case(3):
  38.                  LSA=1;LSB=1;LSC=0; break;//显示第3位
  39.              case(4):
  40.                  LSA=0;LSB=0;LSC=1; break;//显示第4位
  41.              case(5):
  42.                  LSA=1;LSB=0;LSC=1; break;//显示第5位
  43.              case(6):
  44.                  LSA=0;LSB=1;LSC=1; break;//显示第6位
  45.              case(7):
  46.                  LSA=1;LSB=1;LSC=1; break;//显示第7位    
  47.          }
  48.          P0=deal[i];//发送段码
  49.          delays(100); //间隔一段时间扫描    
  50.          P0=0x00;//消隐
  51.      }
  52. }
  53. //****************************************
  54. // 定义MPU6050内部地址
  55. //****************************************
  56. #define     SMPLRT_DIV         0x19     //陀螺仪采样率,典型值:0x07(125Hz)
  57. #define     CONFIG             0x1A     //低通滤波频率,典型值:0x06(5Hz)
  58. #define     GYRO_CONFIG         0x1B     //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
  59. #define     ACCEL_CONFIG     0x1C     //加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)
  60. #define     ACCEL_XOUT_H     0x3B
  61. #define     ACCEL_XOUT_L     0x3C
  62. #define     ACCEL_YOUT_H     0x3D
  63. #define     ACCEL_YOUT_L     0x3E
  64. #define     ACCEL_ZOUT_H     0x3F
  65. #define     ACCEL_ZOUT_L     0x40
  66. #define     TEMP_OUT_H         0x41
  67. #define     TEMP_OUT_L         0x42
  68. #define     GYRO_XOUT_H         0x43
  69. #define     GYRO_XOUT_L         0x44    
  70. #define     GYRO_YOUT_H         0x45
  71. #define     GYRO_YOUT_L         0x46
  72. #define     GYRO_ZOUT_H         0x47
  73. #define     GYRO_ZOUT_L         0x48
  74. #define     PWR_MGMT_1         0x6B     //电源管理,典型值:0x00(正常启用)
  75. #define     WHO_AM_I         0x75     //IIC地址寄存器(默认数值0x68,只读)
  76. #define     SlaveAddress     0xD0     //IIC写入时的地址字节数据,+1为读取

  77. int     dis_data;                         //变量

  78. void  delay(unsigned int k);                                         //延时
  79. //MPU6050操作函数
  80. void  InitMPU6050();                                                     //初始化MPU6050
  81. void  Delay5us();
  82. void  I2C_Start();
  83. void  I2C_Stop();
  84. void  I2C_SendACK(bit ack);
  85. bit   I2C_RecvACK();
  86. void  I2C_SendByte(uchar dat);
  87. uchar I2C_RecvByte();
  88. void  I2C_ReadPage();
  89. void  I2C_WritePage();
  90. void  display_ACCEL_x();
  91. void  display_ACCEL_y();
  92. void  display_ACCEL_z();
  93. uchar Single_ReadI2C(uchar REG_Address);                         //读取I2C数据
  94. void  Single_WriteI2C(uchar REG_Address,uchar REG_data);     //向I2C写入数据
  95. //****************************************
  96. //延时
  97. //****************************************
  98. void delay(unsigned int k)    
  99. {                        
  100.      unsigned int i,j;                
  101.      for(i=0;i<k;i++)
  102.      {            
  103.          for(j=0;j<121;j++);
  104.      }                        
  105. }                                
  106. //**************************************
  107. //延时5微秒(STC90C52RC@12M)
  108. //**************************************
  109. void Delay5us()
  110. {
  111.      _nop_();_nop_();_nop_();_nop_();
  112.      _nop_();_nop_();_nop_();_nop_();
  113.      _nop_();_nop_();_nop_();_nop_();
  114.      _nop_();_nop_();_nop_();_nop_();
  115.      _nop_();_nop_();_nop_();_nop_();
  116.      _nop_();_nop_();_nop_();_nop_();
  117. }
  118. //**************************************
  119. //I2C起始信号
  120. //**************************************
  121. void I2C_Start()
  122. {
  123.    SDA = 1;            
  124.    SCL = 1;            
  125.    Delay5us();          
  126.    SDA = 0;            
  127.    Delay5us();        
  128.    SCL = 0;            
  129. }
  130. //**************************************
  131. //I2C停止信号
  132. //**************************************
  133. void I2C_Stop()
  134. {
  135.    SDA = 0;            
  136.    SCL = 1;              
  137.    Delay5us();        
  138.    SDA = 1;            
  139.    Delay5us();          
  140. }
  141. //**************************************
  142. //I2C发送应答信号
  143. //入口参数:ack (0:ACK 1:NAK)
  144. //**************************************
  145. void I2C_SendACK(bit ack)
  146. {
  147.    SDA = ack;          
  148.    SCL = 1;              
  149.    Delay5us();          
  150.    SCL = 0;            
  151.    Delay5us();          
  152. }
  153. //**************************************
  154. //I2C接收应答信号
  155. //**************************************
  156. bit I2C_RecvACK()
  157. {
  158.    SCL = 1;            
  159.    Delay5us();          
  160.    CY = SDA;          
  161.    SCL = 0;            
  162.    Delay5us();          
  163.    return CY;
  164. }
  165. //**************************************
  166. //向I2C总线发送一个字节数据
  167. //**************************************
  168. void I2C_SendByte(uchar dat)
  169. {
  170.    uchar i;
  171.    for (i=0; i<8; i++)      
  172.    {
  173.        dat<< = 1;        
  174.        SDA = CY;        
  175.        SCL = 1;          
  176.        Delay5us();        
  177.        SCL = 0;          
  178.        Delay5us();        
  179.    }
  180.    I2C_RecvACK();
  181. }
  182. //**************************************
  183. //从I2C总线接收一个字节数据
  184. //**************************************
  185. uchar I2C_RecvByte()
  186. {
  187.    uchar i;
  188.    uchar dat = 0;
  189.    SDA = 1;            
  190.    for (i=0; i<8; i++)      
  191.    {
  192.        dat<< = 1;
  193.        SCL = 1;          
  194.        Delay5us();        
  195.        dat |= SDA;              
  196.        SCL = 0;          
  197.        Delay5us();        
  198.    }
  199.    return dat;
  200. }
  201. //**************************************
  202. //向I2C设备写入一个字节数据
  203. //**************************************
  204. void Single_WriteI2C(uchar REG_Address,uchar REG_data)
  205. {
  206.    I2C_Start();            
  207.    I2C_SendByte(SlaveAddress);  
  208.    I2C_SendByte(REG_Address);  
  209.    I2C_SendByte(REG_data);    
  210.    I2C_Stop();            
  211. }
  212. //**************************************
  213. //从I2C设备读取一个字节数据
  214. //**************************************
  215. uchar Single_ReadI2C(uchar REG_Address)
  216. {
  217.      uchar REG_data;
  218.      I2C_Start();            
  219.      I2C_SendByte(SlaveAddress);  
  220.      I2C_SendByte(REG_Address);    
  221.      I2C_Start();            
  222.      I2C_SendByte(SlaveAddress+1);  
  223.      REG_data=I2C_RecvByte();    
  224.      I2C_SendACK(1);          
  225.      I2C_Stop();              
  226.      return REG_data;
  227. }
  228. //**************************************
  229. //初始化MPU6050
  230. //**************************************
  231. void InitMPU6050()
  232. {
  233.      Single_WriteI2C(PWR_MGMT_1, 0x00);
  234.      Single_WriteI2C(SMPLRT_DIV, 0x07);
  235.      Single_WriteI2C(CONFIG, 0x06);
  236.      Single_WriteI2C(GYRO_CONFIG, 0x18);
  237.      Single_WriteI2C(ACCEL_CONFIG, 0x19);
  238. }
  239. //**************************************
  240. //合成数据
  241. //**************************************
  242. int GetData(uchar REG_Address)
  243. {
  244.      char H,L;
  245.      H=Single_ReadI2C(REG_Address);
  246.      L=Single_ReadI2C(REG_Address+1);
  247.      return (H<<8)+L;  
  248. }
  249. void dealdate()
  250. {
  251.      int a;
  252.      a=GetData(ACCEL_ZOUT_H);
  253.      a=a/2;
  254.      if(a>=0)
  255.      {

  256.          deal[7]=0x00;
  257.          deal[5]=smgduan[a/100000];
  258.          deal[4]=smgduan[a%100000/10000];
  259.          deal[3]=smgduan[a%10000/1000];
  260.          deal[2]=smgduan[a%1000/100]|0x80;
  261.          deal[1]=smgduan[a%100/10];
  262.          deal[0]=smgduan[a%10];
  263.      }
  264.      else
  265.      {
  266.          a=a-1;
  267.          a=~a;

  268.          deal[7]=0x40;
  269.          deal[5]=smgduan[a/100000];
  270.          deal[4]=smgduan[a%100000/10000];
  271.          deal[3]=smgduan[a%10000/1000];
  272.          deal[2]=smgduan[a%1000/100]|0x80;
  273.          deal[1]=smgduan[a%100/10];
  274.          deal[0]=smgduan[a%10];
  275.      }
  276. }
  277. void main()
  278. {
  279.      uint k;
  280.      delay(500);            
  281.      InitMPU6050();     //初始化MPU6050
  282.      delay(150);
  283.      dealdate();
  284.      while(1)
  285.      {
  286.          k++;
  287.          if(k>=15)
  288.          {
  289.              dealdate();
  290.              k=0;
  291.          }
  292.          DigDisplay();
  293.      }
  294. }
复制代码


所有资料下载:
陀螺仪,加速度计.zip(4.82 MB, 下载次数: 296)





评分

黑币 +50
收起理由
+ 50
共享资料的黑币奖励!

查看全部评分

沙发
ID:158248发表于 2017-2-13 09:03|只看该作者
不错不错,mpu6050资源
板凳
ID:185718发表于 2017-4-4 20:19|只看该作者
为什么LCD显示的的值是01.2g,而且不会变化呢?
地板
ID:216265发表于 2017-7-1 08:55|只看该作者
不错不错,正好需要
5#
ID:171544发表于 2017-8-3 17:42|只看该作者
觉得很好呢,正是我需要的
6#
ID:110278发表于 2017-8-4 13:40|只看该作者
学习了。
7#
ID:225554发表于 2017-8-7 17:55|只看该作者
厉害找了大半天,都快放弃结果找到这个赶紧试试
8#
ID:229064发表于 2017-8-24 08:29|只看该作者
为什么,烧录完之后,LCD什么都没显示?
9#
ID:189279发表于 2017-9-13 09:39|只看该作者
我觉得0X1C和0X1A两个寄存器配置有点不妥,首先0X1A这个寄存器的后三位是配置加速度计和角速度计的低通滤波器的,配成0X06就是带宽为5HZ的低通滤波器,而0X1C这个滤波器的后三位是配置加速度计的高通滤波器,配成0X19,是带宽为5HZ的高通滤波器,所以加速度计的数大部分被滤掉了,自然不会怎么变化
10#
ID:325745发表于 2018-5-15 17:23|只看该作者
和单片机的连接图是什么?
11#
ID:340209发表于 2018-5-28 23:06|只看该作者
谢谢分享
12#
ID:345795发表于 2018-6-5 22:22|只看该作者
谢谢,学习了
13#
ID:355312发表于 2018-6-20 16:29|只看该作者
下载看看不知道能不能用上
14#
ID:104846发表于 2019-2-21 21:51|只看该作者
还不错,为我的设计提供了一些思路,感谢
15#
ID:512597发表于 2019-4-15 13:24来自手机|只看该作者
siyaqq 发表于 2019-2-21 21:51
还不错,为我的设计提供了一些思路,感谢

你好,你有做出来吗?能分享一下程序吗?
16#
ID:512597发表于 2019-4-15 13:26来自手机|只看该作者
siyaqq 发表于 2019-2-21 21:51
还不错,为我的设计提供了一些思路,感谢

你好,请问你也在做这个吗?有没有代码可以分享一下吗?
17#
ID:512597发表于 2019-4-15 18:07来自手机|只看该作者
各位做出来的能飞享一下代码吗?非常感谢!
18#
ID:501294发表于 2019-4-25 13:45|只看该作者
18850042681 发表于 2017-4-4 20:19
为什么LCD显示的的值是01.2g,而且不会变化呢?

+1为什么数值不变
19#
ID:592398发表于 2019-7-31 10:11|只看该作者
谢谢分享还没下载
20#
ID:394154发表于 2019-8-1 11:19|只看该作者
可以用
21#
ID:719801发表于 2020-4-7 20:54|只看该作者
您好,请问这个是显示的角度 还是加速度?
22#
ID:709373发表于 2020-5-29 21:07|只看该作者
木小璃 发表于 2019-4-25 13:45
+1为什么数值不变

你好  问题解决了吗
23#
ID:579230发表于 2020-9-12 00:17|只看该作者
18850042681 发表于 2017-4-4 20:19
为什么LCD显示的的值是01.2g,而且不会变化呢?

我也是,这咋处理啊
24#
ID:664698发表于 2021-3-30 16:45|只看该作者
fangyf 发表于 2020-9-12 00:17
我也是,这咋处理啊

你好大佬,请问这个问题解决了吗?是怎么回事呀?
25#
ID:873664发表于 2021-7-4 16:38|只看该作者
18850042681 发表于 2017-4-4 20:19
为什么LCD显示的的值是01.2g,而且不会变化呢?

您好,请问楼主这个是用什么软件打开的?

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

Powered by 单片机教程网