找回密码
 注册
关于网站域名变更的通知
查看: 265|回复: 2
打印 上一主题 下一主题

51单片机+MPU6050陀螺仪+LCD1602显示程序

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-8-17 09:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
最近在机器人调试过程中,需要用到陀螺仪,用51单片机通过调试能够测量到陀螺仪的数据并在LCD1602上显示,但根据测量数据进行控制机器人还需要进一步调试。测量数据的读取关键在于IIC总线和获取数据的寄存器地址不要搞错
, Y. Z, X; u; {0 w#include <REG52.H>
; p' D% \4 D2 z+ g5 c9 }5 E#include <math.h>    //Keil library- o. b8 N1 w7 S( m+ T
#include <stdio.h>   //Keil library
! J. P/ A) D. r) Q, l#include <INTRINS.H>. x2 ~& |. l' O# B7 |
typedef unsigned char  uchar;4 Y: B# }4 }' X& E& v' R% Q; \) J
typedef unsigned short ushort;3 ^0 g4 p  K2 _$ t* p
typedef unsigned int   uint;6 v4 F% w& m1 X0 u8 Q
//****************************************2 E+ y/ D( T+ q  A+ T% ]' Q& [
// 定义51单片机端口
* W) e! k' D$ ?$ \6 [//****************************************1 T# E9 M5 D, t! x& }$ t
#define DataPort P0                    //LCD1602数据端口
- C% M$ V9 U7 E' u7 {sbit    SCL=P1^0;                        //IIC时钟引脚定义- ]0 p! W* w& |' e. o1 \
sbit    SDA=P1^1;                        //IIC数据引脚定义$ Q) v1 T4 ~* W: A+ J& y
sbit    LCM_RS=P2^0;                //LCD1602命令端口* m) Y" _/ W% ?! b6 u& o4 u' @/ y
sbit    LCM_RW=P2^1;                //LCD1602命令端口+ _8 |* B4 y% c$ g7 a! M  t
sbit    LCM_EN=P2^2;                //LCD1602命令端口
" k. w/ y6 J9 E' }+ v//****************************************( w7 g$ l& w6 D- u  u
// 定义MPU6050内部地址
1 Y* h& R4 w  M# V+ X+ y/ A$ @9 g: {//****************************************
3 C* o& y: [0 k+ h#define        SMPLRT_DIV                0x19        //陀螺仪采样率,典型值:0x07(125Hz)) ?4 N; X, N0 M; S
#define        CONFIG                        0x1A        //低通滤波频率,典型值:0x06(5Hz)  ]8 r) I/ f! N7 G' T) D# i1 N
#define        GYRO_CONFIG                0x1B        //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)/ Y" l, ~" A9 [6 r% B8 t5 \9 h/ O
#define        ACCEL_CONFIG        0x1C        //加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)
6 B& U# B" V3 J8 \1 e#define        ACCEL_XOUT_H        0x3B
  L( v; v. |9 @; g#define        ACCEL_XOUT_L        0x3C5 m( T4 ^+ M+ R. v" [
#define        ACCEL_YOUT_H        0x3D' F7 h$ C- l, Q6 X; s
#define        ACCEL_YOUT_L        0x3E4 Y7 H0 W& O3 c2 u
#define        ACCEL_ZOUT_H        0x3F
7 }2 |4 w2 ?. _% a+ {" y' g#define        ACCEL_ZOUT_L        0x40
- D8 i/ o3 n0 ~#define        TEMP_OUT_H                0x418 e" L. H) ~+ e% u* `' w
#define        TEMP_OUT_L                0x42
) U3 e& s$ M, Q( {#define        GYRO_XOUT_H                0x43
( v% L0 h; H# n) v# U#define        GYRO_XOUT_L                0x44- A7 p. V; P. b9 E4 g
#define        GYRO_YOUT_H                0x45
( V- M6 S% U! J( M3 B. B1 Q: m6 ^#define        GYRO_YOUT_L                0x46
4 ^9 Q* }+ C6 ~9 r/ U! y+ y#define        GYRO_ZOUT_H                0x47
: a: l: Q6 f! Q8 G4 W#define        GYRO_ZOUT_L                0x48  m  j- z8 n; [
#define        PWR_MGMT_1                0x6B        //电源管理,典型值:0x00(正常启用)6 J  D) P) {5 B+ P2 O
#define        WHO_AM_I                0x75        //IIC地址寄存器(默认数值0x68,只读)
3 ~  V, `) H. |' v; ?& o#define        SlaveAddress        0xD0        //IIC写入时的地址字节数据,+1为读取* L3 a2 \! Q* \) E, T8 U
//****************************************
# N- A2 X8 S! |0 T//定义类型及变量
; O) B7 D6 _6 J' F//****************************************/ |1 F0 M& [4 ]( @2 d$ Z8 I- H
uchar dis[4];                                                        //显示数字(-511至512)的字符数组
9 F9 ]* |/ L; u2 W; a/ e/ S) I: B' mint        dis_data;                                                    //变量
+ f6 F5 p5 v" k//int        Temperature,Temp_h,Temp_l;            //温度及高低位数据
1 f9 ~( [6 F: T4 u. p4 g0 _//****************************************
+ }: j7 ~) Q2 m) r* Y8 {* P) b& p//函数声明, a2 P0 q7 B* v  ]! w4 A
//****************************************
: q1 `" @2 A: g; L2 Zvoid  delay(unsigned int k);                                                                                //延时' c! z3 P' f5 Z' V5 F' A4 f
//LCD相关函数- p: P$ p; I" x/ i0 o! x+ ?
void  InitLcd();                                                                                                        //初始化lcd1602- }4 ]3 T7 t  k6 f2 w  j* o4 M8 P
void  lcd_printf(uchar *s,int temp_data);
% M0 Z6 w$ \5 G" |! ]5 S+ k# Nvoid  WriteDataLCM(uchar dataW);                                                                        //LCD数据  r  M, ?1 B' M& \2 H1 O9 X
void  WriteCommandLCM(uchar CMD,uchar Attribc);                                        //LCD指令
  j( m5 ?2 w& rvoid  DisplayOneChar(uchar X,uchar Y,uchar DData);                                //显示一个字符
6 W7 R2 C: l9 w+ Kvoid  DisplayListChar(uchar X,uchar Y,uchar *DData,L);                    //显示字符串' B- t6 t% o1 z/ ^7 u9 Q) e% D7 f
//MPU6050操作函数/ L$ I) C8 `4 a: N0 i9 `
void  InitMPU6050();                                                                                                //初始化MPU6050
2 C1 U3 q4 r6 E6 [1 B1 K2 Cvoid  Delay5us();# G& [3 O. Y: E
void  I2C_Start();
+ N- M! m6 j! Evoid  I2C_Stop();
9 c* ]: c+ w9 k6 f( w  I6 A& z* i7 d+ L: F
void  I2C_SendACK(bit ack);- K9 C( @. E5 ?3 T# [
bit   I2C_RecvACK();/ f! \% J  v3 n/ G5 |* x
6 `( B( M9 A* }! O$ B  o
void  I2C_SendByte(uchar dat);
( \1 Z6 b5 N; \uchar I2C_RecvByte();
0 ~& _7 @, {: e$ w
# }; ^( I9 z; K. N7 L: L7 ~( Y$ E1 Ivoid  I2C_ReadPage();
; w: w( L% X8 G& M9 hvoid  I2C_WritePage();4 I' b7 `/ |1 f2 }
void  display_ACCEL_x();. y$ v3 V3 s' Z+ S3 O
void  display_ACCEL_y();
4 |* z$ f- S" v/ Z9 vvoid  display_ACCEL_z();
9 _2 P6 J8 S- h* @uchar Single_ReadI2C(uchar REG_Address);                                        //读取I2C数据: h, Z, c3 u+ W4 o3 X
void  Single_WriteI2C(uchar REG_Address,uchar REG_data);        //向I2C写入数据# k. \: W/ G0 c9 @2 ~, C

5 V- \( j0 x% Z2 ^' g& r# D9 X' g( p. t; m
//****************************************
1 s1 ~# C7 V0 S! a, T//整数转字符串
: q* _: x, ?/ M' A2 d5 s& P: [//****************************************
$ a! h: ~, _6 n( pvoid lcd_printf(uchar *s,  int temp_data)
8 [5 i6 r3 z- x* I{
! v6 t. Q) ]/ G1 h* C        if(temp_data<0)
$ T) J; \! S  M$ Q) h% v, ?        {
$ R/ d; u  a/ C, L3 ^                temp_data=-temp_data;
% x+ H) Y# k7 `! ^2 L: r+ R                *s='-';
0 n. c# g  s2 X1 ?* D        }
: _- U: t2 ?: j: P        else *s=' ';5 w. m: `2 j3 I5 h8 V3 C9 A  d
        *++s =temp_data/100+0x30;1 a7 O  @$ {: W' _. N
        temp_data=temp_data%100;     //取余运算) B* I. }: O' P/ v) l
        *++s =temp_data/10+0x30;
. ^) e3 h+ Y! p        temp_data=temp_data%10;      //取余运算/ s& B- j3 n# d0 u' m
        *++s =temp_data+0x30;+ f  S/ J* T& g6 T8 w7 A
}0 n' a/ J6 k% p" z$ Z+ E% G
//****************************************7 _9 C! @4 Y& d. B
//延时# D& A1 O  L3 T% b7 C8 c" Q
//****************************************; U# q, i' v0 ?. m$ @! S, u* L+ B
void delay(unsigned int k)
0 Z$ e( C" y; W6 S* d1 N! y$ }{
7 {  I+ t3 s: s) I        unsigned int i,j;
8 k& k/ v+ @0 T) L2 N        for(i=0;i<k;i++)+ ^, \: o+ _! Y3 j3 Z
        {8 K1 g' ^2 e6 H% m
                for(j=0;j<121;j++);) V, z$ [; P! A, w' y" U/ F
        }# _9 I6 O* x) P; a- C
}
/ `* Z# Z) L% v* D//****************************************
6 E7 N  z/ w" r0 v//LCD1602初始化
5 a; G% e, q9 P; E//****************************************( Z6 a- }3 Q5 |' x3 V
void InitLcd()
. }) R4 L) P3 |) G{
9 C/ ?# S8 |5 u+ @        WriteCommandLCM(0x38,1);
$ g& W+ v! @- G  y5 c0 R        WriteCommandLCM(0x08,1);& d4 ?7 q/ h  O, |
        WriteCommandLCM(0x01,1);
. l: x+ a/ y0 b1 p$ H% Y        WriteCommandLCM(0x06,1);: e3 e) S8 ?3 Z- Z. T: e/ X1 b7 g
        WriteCommandLCM(0x0c,1);! V# c& t0 P0 f( c: l6 }- b8 i
        DisplayOneChar(0,0,'A');
8 w/ |; |8 l4 c+ d0 z6 Y        DisplayOneChar(0,1,'G');
8 [' s2 o5 }) s! A2 O" I. k. ~}
3 N3 F# l' \" x0 g//****************************************) m6 `8 A: L9 _& G! c
//LCD1602写允许
: P# r1 L4 M* ~+ P/ J- o* H, L//****************************************/ @8 x$ W' Q/ Z4 Q" ^% h, Z
void WaitForEnable(void), q' ?) d) y2 t  ~9 j7 M
{( Z* Y, c0 |* l  s# n' _0 K1 x7 y
        DataPort=0xff;6 R& c$ Z. D0 ]2 s4 [
        LCM_RS=0;LCM_RW=1;_nop_();
, D9 b+ x7 d2 U0 u4 i        LCM_EN=1;_nop_();_nop_();
* Z! z) y# P5 y/ R& I7 h; a1 F        while(DataPort&0x80);
6 l; Z1 D7 _7 ^. G9 P$ ]% n* ?        LCM_EN=0;
/ [# u; l; R$ A: w- O}
( T# f8 C$ w. ?$ h1 y5 j" Q: d/ S//****************************************+ ~. S3 c- _' z7 n7 J
//LCD1602写入命令
) {$ R7 ~# h9 y4 }) u) c5 U. Z//****************************************6 |4 [6 p) S0 A$ r
void WriteCommandLCM(uchar CMD,uchar Attribc)
: C; U& W* P2 g7 R" U{! }5 S% E* ^0 Y8 M, o
        if(Attribc)WaitForEnable();
0 _% Y. Q/ x/ e) O        LCM_RS=0;LCM_RW=0;_nop_();
: w. b0 f0 `& [3 A6 D+ u        DataPort=CMD;_nop_();
1 H) n" {7 y! k, Y2 b        LCM_EN=1;_nop_();_nop_();LCM_EN=0;9 h% G' e3 j- ?2 g" [/ M5 \( S! P
}
; |' m9 d2 W3 _7 U( ^# r! A//****************************************
# ^* [7 g; }. S, R& Y//LCD1602写入数据
7 N0 E4 C7 I  P//****************************************& l* c2 N# _% U7 R. Q! _! A6 H
void WriteDataLCM(uchar dataW)& I% C* L4 S& _9 s
{. c" u) |; p* f0 q  j, j
        WaitForEnable();- _: w- e" k9 d& s( I! t8 {( J+ m
        LCM_RS=1;LCM_RW=0;_nop_();5 h# ]# {- v3 U9 N
        DataPort=dataW;_nop_();" ^- O/ R8 Y* _" o6 a( b
        LCM_EN=1;_nop_();_nop_();LCM_EN=0;- y2 V* ]% k* @. L  N
}
% K+ N: p, V  R+ t: V0 a3 w//****************************************
/ i. m& @1 g. A& s//LCD1602写入一个字符
; I' G6 R+ T0 f//****************************************
. b$ ^. b% o7 Vvoid DisplayOneChar(uchar X,uchar Y,uchar DData)
" B1 K& C5 \$ ^: @" \0 ~* Q, q{2 y1 W; R8 ~& U* g& I8 _
        Y&=1;
) A) F! o) b1 p4 E        X&=15;
; ]! L, ?- X( u- }- F0 W( p# X' w        if(Y)X|=0x40;
; L" q. X3 V$ k! \) C        X|=0x80;& P7 U6 y7 g. }' z
        WriteCommandLCM(X,0);+ V' Q5 c* {3 V
        WriteDataLCM(DData);; M! A* [# G7 l  A. V, I; l7 }0 Z
}5 M; @) X9 b( S% Q0 H5 j: p7 ]( A# Q
//****************************************
7 a5 Y2 J: H8 Y2 b7 i; P//LCD1602显示字符串
* e' m% F5 k5 u) m$ Q//****************************************- E! m% j) q# f; m
void DisplayListChar(uchar X,uchar Y,uchar *DData,L)7 B' C# J4 N& q# G0 o
{
' Z% a  K/ }4 K' n/ [        uchar ListLength=0;
# g) g' j( K8 m" q( {0 u+ E        Y&=0x1;, b6 n% ?3 H- A
        X&=0xF;8 l% g% c6 g' S6 v* q+ Q' E
        while(L--)
8 X7 A3 B! A  \! i6 k2 E( [/ a        {& u3 `. {2 o  b' E- Y4 {; R
                DisplayOneChar(X,Y,DData[ListLength]);
: A( u7 o' Y$ N( l+ ]& D) S                ListLength++;! w6 |" H  k8 b2 e
                X++;% l. [0 o4 @8 k
        }
: M; Q# L5 b- x% H# R: M1 N- u7 `}
. U9 H. M& @1 K. [  `# d- f' \
. Q$ B' ~5 I7 C% T//**************************************8 w& \! F5 E  n: L7 \
//延时5微秒(STC90C52RC@12M)
3 }; J9 T5 J  R  L) d//不同的工作环境,需要调整此函数5 G0 w% m+ c7 s
//当改用1T的mcu时,请调整此延时函数& _$ ]0 k6 r9 U4 h5 x
//**************************************; l6 N5 e8 e! d# t7 W
void Delay5us()
( h2 j" L* v$ L8 c* J! |{/ H' \! F& Z; c& J
        _nop_();_nop_();_nop_();_nop_();
0 f4 g1 D( x3 u) k        _nop_();_nop_();_nop_();_nop_();
3 E: U- l$ _; l        _nop_();_nop_();_nop_();_nop_();
0 i7 l, t1 A! u( B) j) Z        _nop_();_nop_();_nop_();_nop_();
8 y6 q% a) v( @- \' c* E        _nop_();_nop_();_nop_();_nop_();
! b2 }, ^- d& {; k        _nop_();_nop_();_nop_();_nop_();
4 l3 l* K0 n7 N0 r}
/ f) I" Q' Y- d- n3 d//**************************************
( f4 G) `! d1 ?3 c6 E- Y//I2C起始信号
2 [7 ^2 N8 n7 r' \" o4 x//**************************************
* |+ e% ?( l) b* M9 h. Nvoid I2C_Start()
; `7 v  z, x& L2 @: q{% M" ^0 e  w, H9 l- m! N
    SDA = 1;                    //拉高数据线
4 r/ b% \/ m4 l    SCL = 1;                    //拉高时钟线
5 m# S6 O) {( Q; w6 u    Delay5us();                 //延时8 v( _2 ~* O/ J8 N4 ^0 _+ ^
    SDA = 0;                    //产生下降沿2 ~1 Z1 j6 j& h1 W/ n2 j
    Delay5us();                 //延时
, H5 X& O( e9 h1 ]5 M    SCL = 0;                    //拉低时钟线
4 ~; e6 N. l" Y! _}" s  _7 Q: A$ d2 ?: F! k: g
//**************************************
2 e3 M! X8 z; D3 a6 @4 U//I2C停止信号0 C' ^/ s1 v* g5 ^
//**************************************$ X0 j7 N( N, _0 J  u
void I2C_Stop(). S4 ?5 @' i2 O
{
# C6 v' s! u; D# V2 l* W( i    SDA = 0;                    //拉低数据线8 V+ Y$ F# e' [3 _1 T! w
    SCL = 1;                    //拉高时钟线
4 U2 q- G/ A* v0 E/ B0 A' @    Delay5us();                 //延时
( v8 O! Y: n; K3 b! j' ]    SDA = 1;                    //产生上升沿
! v/ |' m2 {% J- _& U2 p( ^    Delay5us();                 //延时1 u6 A: P1 Y2 e
}
( U) |# t6 f4 p, S; N//**************************************
& H5 P6 m6 f6 \//I2C发送应答信号/ ^# V4 N& h- a! ]! i9 T- p
//入口参数:ack (0:ACK 1:NAK). e6 N& V! Q3 P" o' ?
//**************************************
0 |, s* S# e# ]; S0 uvoid I2C_SendACK(bit ack)  E5 U5 Z+ _2 k
{
; S/ a4 j6 i( [3 f$ E    SDA = ack;                  //写应答信号
* Z% T3 q, k2 j0 j% I) r/ E+ \    SCL = 1;                    //拉高时钟线: P& A2 i. ?# J4 E* j
    Delay5us();                 //延时5 }- Y1 T) Y, b* n
    SCL = 0;                    //拉低时钟线* }; |% y8 F, [/ O" g) J  J4 {
    Delay5us();                 //延时" F# |6 p' V3 ~. f
}
3 w0 z1 f8 E) }8 y: J) P//**************************************
. f0 W* ^* o& H! U0 |8 n//I2C接收应答信号- E, c3 N) p. g0 X& X8 `
//**************************************
5 H1 D7 ]1 h+ k9 G* L1 c0 jbit I2C_RecvACK()$ D! |' Q. d# [  F! y
{
4 k' w- ^& v6 P    SCL = 1;                    //拉高时钟线1 Y1 h! F+ V4 q; Z3 N, e( n' y" {
    Delay5us();                 //延时" W. }4 l- a5 |, L6 F6 m
    CY = SDA;                   //读应答信号
, e) a2 P" o6 I. H    SCL = 0;                    //拉低时钟线
8 A8 M" n; [# G    Delay5us();                 //延时( A; K  Q* n& t! G! l% `6 D" ^
    return CY;
8 w, O. K' _7 U/ n- {4 M3 e}0 Q" V7 V# F% u
//**************************************
. _, ?) e3 L- R7 |: ^: L# |  a//向I2C总线发送一个字节数据( f. Q8 s1 R0 p' X& ~
//**************************************1 O+ A2 t* V" k8 {) a0 t8 v0 Q
void I2C_SendByte(uchar dat)* b# ]' i, ~* |# w) z3 E; R
{/ Z! [9 y: a3 S% w; Z
    uchar i;
* `& N8 j3 f3 ?! A& `    for (i=0; i<8; i++)         //8位计数器
5 J: |" Z3 x. g  J# q4 p0 \6 o% b    {' u9 H0 _( z/ j& ~4 ~
        dat <<= 1;              //移出数据的最高位- H# d& M& R& n+ t2 k0 U
        SDA = CY;               //送数据口
1 T, S% ~0 B2 }: P" H8 Z        SCL = 1;                //拉高时钟线
3 ?  z# H* ?1 e0 @- H        Delay5us();             //延时3 a2 K0 f' U3 [$ Z1 X3 x
        SCL = 0;                //拉低时钟线
& f& c# s) J" T' ~. e- o        Delay5us();             //延时
; [- O- w& D9 E    }
1 u% i6 {  U) Y6 E$ ~    I2C_RecvACK();
% g& S8 i- Y2 Y; A( Z) R, m}  B5 m2 v4 l9 \# D
//**************************************
7 ?3 a6 ?. r$ ^! H//从I2C总线接收一个字节数据
1 P  ^, j+ w8 F/ a0 p//**************************************
$ h9 [/ S- y9 O+ `' {uchar I2C_RecvByte()3 G; B& C$ x  s+ }
{- p2 `: u2 X* j5 R
    uchar i;/ t6 i! R; A! F$ q8 w5 g6 l
    uchar dat = 0;& ^1 ]+ p' q# d, s
    SDA = 1;                    //使能内部上拉,准备读取数据,0 ^# p9 q% x9 M- f
    for (i=0; i<8; i++)         //8位计数器
& g1 V  l& c# V6 o+ L% o; b5 [    {' Q; I3 S) E$ P; U8 a
        dat <<= 1;6 O( H. ^4 k- j. m
        SCL = 1;                //拉高时钟线
5 k, j7 ^8 s( T: V6 a        Delay5us();             //延时
, [: B" M0 c5 f& N6 ]8 Y2 o. [) G8 D        dat |= SDA;             //读数据
2 p  L3 H. L/ E" G" U        SCL = 0;                //拉低时钟线
5 E) f8 a# Y, v- Q  C        Delay5us();             //延时
5 n% ~4 _) q8 e: H8 D3 n+ G& k    }
" H9 ]7 g8 {+ n& a; D2 k    return dat;0 o8 }9 X" [0 b! U  y6 m. t% s
}
+ H, x1 _- L$ y! P0 v" L% d//**************************************
" k$ {, p) J0 T//向I2C设备写入一个字节数据) K5 _( X. V* |* {2 t
//**************************************% P& X8 X& A5 z3 A
void Single_WriteI2C(uchar REG_Address,uchar REG_data)
6 b! ~7 J; D7 ]& s7 x{
1 j( H* R' G" X    I2C_Start();                  //起始信号
5 J5 K: F0 S/ T7 @4 D0 E8 W    I2C_SendByte(SlaveAddress);   //发送设备地址+写信号: Q- |8 s! y) \* Z6 U4 z
    I2C_SendByte(REG_Address);    //内部寄存器地址,
% B! R* d1 L9 ]0 K) e    I2C_SendByte(REG_data);       //内部寄存器数据,; J  f# u, D; I8 W" S1 G
    I2C_Stop();                   //发送停止信号& o4 o3 z+ m; o* O
}& b8 q- g* j( t, Z
//**************************************: L# R9 l& C- i" H+ j
//从I2C设备读取一个字节数据! T, e; Y8 Y5 G
//**************************************) j6 `4 [1 a, F4 {$ `' `
uchar Single_ReadI2C(uchar REG_Address)# ^; I7 [4 s" F+ m9 r
{
% r! D' h8 K5 o+ t+ `. Q0 h        uchar REG_data;
, ]4 W) e# x  D  ^. W4 w# T        I2C_Start();                   //起始信号
% u1 T( u4 A, _8 Z) O        I2C_SendByte(SlaveAddress);    //发送设备地址+写信号
( f. \: f# J- Y$ u, z! o# F# p        I2C_SendByte(REG_Address);     //发送存储单元地址,从0开始
8 y! o8 q/ Y0 k* o! [        I2C_Start();                   //起始信号
- w; I# {& Z; w: D8 X7 g" v* V        I2C_SendByte(SlaveAddress+1);  //发送设备地址+读信号, U; k  j0 X& [! w
        REG_data=I2C_RecvByte();       //读出寄存器数据
6 J7 ?& x# n) l; f6 d; M        I2C_SendACK(1);                //接收应答信号) ?: ?" ^4 s9 ^1 n& c; g6 E9 N' Z7 u0 Z
        I2C_Stop();                    //停止信号
7 r$ d5 e+ e8 `6 H2 k6 q; j        return REG_data;$ B* ^( W- E. _6 q- c
}; H' b& {) I: L& b3 Z

1 U, r2 R' }' q  `" Z8 `, O1 _) K( ?/ h; `! M$ a
//**************************************
: p1 ?- s5 X5 F//初始化MPU60500 {3 ]$ x" j' A$ ^% B+ q, u( v3 S
//**************************************
) ?' p% g. B+ N- x% B3 n# ]) A& s) Wvoid InitMPU6050()' X5 M! y9 A+ G
{
# r7 d$ a5 D; a9 ~/ d- r: [4 K        Single_WriteI2C(PWR_MGMT_1, 0x00);        //解除休眠状态
, z1 {! l) P* t  X- t7 }        Single_WriteI2C(SMPLRT_DIV, 0x07);
. \: R3 T+ K4 G4 v        Single_WriteI2C(CONFIG, 0x06);  ?6 ^3 c; u5 [; p
        Single_WriteI2C(GYRO_CONFIG, 0x18);
0 F$ @; ^1 b# O9 x( G8 t- G2 Y) |        Single_WriteI2C(ACCEL_CONFIG, 0x01);0 f* G) S1 x6 u0 A% m+ U# j7 P
}: Z$ z+ {1 x( f+ d
//**************************************
, w4 g" I+ p, N6 r& O//在1602上显示10位数据+ c: c: L& Z( i4 e  M% w2 I
//**************************************
& |* Q/ t: `) V" [. i! K4 E. m* _void Display10BitData  (int value,uchar x,uchar y)) s) P" d  k2 @7 Q7 G8 `3 h9 r
{
* t7 I# X8 @  X" v4 s        value/=64;                                                //转换为10位数据 value=value/64  右移动六位
) h' s* `. B7 P0 B. t" f        lcd_printf(dis, value);                                //转换数据显示: u5 |6 B6 _& q& K! n
        DisplayListChar(x, y, dis, 4);                        //启始列,行,显示数组,显示长度
9 J: R. o  T/ [# {}1 F4 n* L0 |- a) n. m
//**************************************
, Q) N4 k7 ^; O, S  z+ n. j# G//合成数据9 n7 y# U! z* m+ A" O
//**************************************
4 G, G, B0 p1 {; \# [$ C: Y3 I3 vint GetData(uchar REG_Address)9 x% K8 r$ T" W& S  l. p- R9 B
{
3 U2 [8 o/ U. ~' {' N$ _        char H,L;7 I4 S6 a8 P$ U0 O' ?
        H=Single_ReadI2C(REG_Address);
9 k) h/ U- x- ~. }# U: [        L=Single_ReadI2C(REG_Address+1);
$ v$ s7 j5 R7 N  M        return (H<<8)+L;   //合成数据: O3 F9 W7 e4 R+ V4 }, b7 A
}" K0 v8 {4 F1 {, S

$ T5 m: N9 A+ r. E. \
' J/ Z! w! y( E" e3 v- [0 R5 ~
& |% t9 N$ G- J; E7 Q2 D- B6 C0 Q( a9 H
//**************************************
3 n5 s1 d6 v8 T. ^8 x//显示温度
2 T# Y5 A1 M! w8 y6 d5 ?5 I//**************************************
4 [5 I% d9 X4 ]9 h1 Q" [- g" K/ E//void display_temp()
" V' V9 c! _: u  O- R% m2 O//{% Q) Y8 ~* w, V* ]- n
//        Temp_h=Single_ReadI2C(TEMP_OUT_H); //读取温度
/ `7 p' i# x: A//        Temp_l=Single_ReadI2C(TEMP_OUT_L); //读取温度, a& Z8 n$ A  E  B& x, s. d
//        Temperature=Temp_h<<8|Temp_l;     //合成温度* a( L2 G- O% F
//        Temperature = 35+ ( (double) (Temperature + 13200)) / 280; // 计算出温度" z; j4 F! W: P" W5 R0 n' l5 x
//        lcd_printf(dis,Temperature);     //转换数据显示  w) g5 [3 \! G1 ?$ v7 Y
//        DisplayListChar(11,1,dis,4);     //启始列,行,显示数组,显示位数
9 k5 ?9 p' N4 A. B8 C& @( Q  u: B//}
8 h! o( C) O+ r- u* ~7 [5 H//*********************************************************" G, i8 j9 |% x* P6 I
//主程序% L# C, J  j  k- p
//*********************************************************
' r6 M8 j" X; z/ \) C4 \5 x. Lvoid main()/ F* i  [$ P! ^  D) w2 h& s
{% r5 y+ j8 B2 {# q7 g; k0 c
        delay(500);                //上电延时
' I. d- Y. C! U8 Q0 z9 s; T" }+ d# @        InitLcd();                //液晶初始化# G) i4 C( v# h/ \9 Z$ K
        InitMPU6050();        //初始化MPU60506 U! [2 {, i# `
        delay(150);3 T0 i- y$ |) L8 p; H
        while(1)) e& J" O( F4 s* G+ e
        {) Y" T/ g: a; m  O. e: ?# t
                Display10BitData  (GetData(ACCEL_XOUT_H),  2,  0);        //显示X轴加速度5 y/ z7 u/ @6 b; [# B& a4 N3 h: ^
                Display10BitData  (GetData(ACCEL_YOUT_H),  7,  0);        //显示Y轴加速度
- [, @3 v9 {2 q: q: c/ @+ w# B/ j4 n                Display10BitData  (GetData(ACCEL_ZOUT_H) ,  12,  0);//显示Z轴加速度
3 ]+ Q* J. O- M; c6 z9 Q. p                Display10BitData  (GetData(GYRO_XOUT_H) ,  2,  1);        //显示X轴角速度
5 D; b% A, v) {. a                Display10BitData  (GetData(GYRO_YOUT_H),  7,  1);        //显示Y轴角速度) u2 J$ q; @+ Y$ c8 U3 q
                Display10BitData  (GetData(GYRO_ZOUT_H),  12,  1);        //显示Z轴角速度
7 |1 d" U0 ]7 i. _% p6 i                delay(500);
) a  X4 [. t, E        }& S' k. b( u& q4 z9 \
}
" V+ C! I  v- _' t- }, H+ \

该用户从未签到

2#
发表于 2022-8-17 10:38 | 只看该作者
谢谢分享,很棒

该用户从未签到

3#
发表于 2022-8-17 13:10 | 只看该作者
谢谢分享!!!!!学习
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-28 19:20 , Processed in 0.093750 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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