找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12885|回复: 24
收起左侧

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

  [复制链接]
ID:162229 发表于 2017-2-12 21:27 | 显示全部楼层 |阅读模式
废话不说,先上几张图 1614625945.jpg 1614625947.jpg 1614625948.jpg 还有一个小视频供大家观赏: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. }
复制代码
0.png
0.png
所有资料下载:
陀螺仪,加速度计.zip (4.82 MB, 下载次数: 294)

评分

参与人数 1黑币 +50 收起 理由
admin + 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 | 显示全部楼层
不错不错,正好需要
回复

使用道具 举报

ID:171544 发表于 2017-8-3 17:42 | 显示全部楼层
觉得很好呢,正是我需要的
回复

使用道具 举报

ID:110278 发表于 2017-8-4 13:40 | 显示全部楼层
学习了。
回复

使用道具 举报

ID:225554 发表于 2017-8-7 17:55 | 显示全部楼层
厉害找了大半天,都快放弃结果找到这个赶紧试试
回复

使用道具 举报

ID:229064 发表于 2017-8-24 08:29 | 显示全部楼层
为什么,烧录完之后,LCD什么都没显示?
回复

使用道具 举报

ID:189279 发表于 2017-9-13 09:39 | 显示全部楼层
我觉得0X1C和0X1A两个寄存器配置有点不妥,首先0X1A这个寄存器的后三位是配置加速度计和角速度计的低通滤波器的,配成0X06就是带宽为5HZ的低通滤波器,而0X1C这个滤波器的后三位是配置加速度计的高通滤波器,配成0X19,是带宽为5HZ的高通滤波器,所以加速度计的数大部分被滤掉了,自然不会怎么变化
回复

使用道具 举报

ID:325745 发表于 2018-5-15 17:23 | 显示全部楼层
和单片机的连接图是什么?
回复

使用道具 举报

ID:340209 发表于 2018-5-28 23:06 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:345795 发表于 2018-6-5 22:22 | 显示全部楼层
谢谢,学习了
回复

使用道具 举报

ID:355312 发表于 2018-6-20 16:29 | 显示全部楼层
下载看看不知道能不能用上
回复

使用道具 举报

ID:104846 发表于 2019-2-21 21:51 | 显示全部楼层
还不错,为我的设计提供了一些思路,感谢
回复

使用道具 举报

ID:512597 发表于 2019-4-15 13:24 来自手机 | 显示全部楼层
siyaqq 发表于 2019-2-21 21:51
还不错,为我的设计提供了一些思路,感谢

你好,你有做出来吗?能分享一下程序吗?
回复

使用道具 举报

ID:512597 发表于 2019-4-15 13:26 来自手机 | 显示全部楼层
siyaqq 发表于 2019-2-21 21:51
还不错,为我的设计提供了一些思路,感谢

你好,请问你也在做这个吗?有没有代码可以分享一下吗?
回复

使用道具 举报

ID:512597 发表于 2019-4-15 18:07 来自手机 | 显示全部楼层
各位做出来的能飞享一下代码吗?非常感谢!
回复

使用道具 举报

ID:501294 发表于 2019-4-25 13:45 | 显示全部楼层
18850042681 发表于 2017-4-4 20:19
为什么LCD显示的的值是01.2g,而且不会变化呢?

+1为什么数值不变
回复

使用道具 举报

ID:592398 发表于 2019-7-31 10:11 | 显示全部楼层
谢谢分享还没下载
回复

使用道具 举报

ID:394154 发表于 2019-8-1 11:19 | 显示全部楼层
可以用
回复

使用道具 举报

ID:719801 发表于 2020-4-7 20:54 | 显示全部楼层
您好,请问这个是显示的角度 还是加速度?
回复

使用道具 举报

ID:709373 发表于 2020-5-29 21:07 | 显示全部楼层
木小璃 发表于 2019-4-25 13:45
+1为什么数值不变

你好  问题解决了吗
回复

使用道具 举报

ID:579230 发表于 2020-9-12 00:17 | 显示全部楼层
18850042681 发表于 2017-4-4 20:19
为什么LCD显示的的值是01.2g,而且不会变化呢?

我也是,这咋处理啊
回复

使用道具 举报

ID:664698 发表于 2021-3-30 16:45 | 显示全部楼层
fangyf 发表于 2020-9-12 00:17
我也是,这咋处理啊

你好大佬,请问这个问题解决了吗?是怎么回事呀?
回复

使用道具 举报

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 单片机教程网

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