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

HMC5883L电子指南针罗盘模块 GY-271三轴磁场传感器 的相关教...

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-1-9 13:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
HMC5883L电子指南针罗盘模块 GY-271三轴磁场传感器 的相关教程% \( I# ^5 J) u5 z+ Q& o
GY-271模块教程分享,这是HMC5883L电子指南针罗盘模块 三轴磁场传感器 的相关教程,带stc单片机。avr单片机和Arduino平台的源码。有需要的同学可以看看6 k1 I% T" N6 u

4 D# {9 I. D( @2 AGY-271 HMC5883L模块外观图:( }% f0 r% |/ R! [
7 d# h3 _( z  B" A- ~

, i, R7 o* z& O1 o6 n; U4 e) GGY-271 HMC5883L模块原理图:
  y/ i8 U/ @( T 7 y- {) Q1 n, ]. Z  e
4 V* @/ A; z* V$ v0 S& k
GY-271 HMC5883L模块尺寸图:
3 J; q9 B/ u# w  X1 J; X; P 9 e6 D; l& H& T1 r8 H
* W# c: t7 d8 C' q9 Q7 e5 [5 l# [
9 x7 Y7 w" e2 p$ Z2 R3 l
7 ]9 @9 a7 i; o* r0 D! F7 I3 S
与单片机的通讯接口程序:
7 a' c- u% ^! _, b) ^' J//***************************************
- w$ L5 c$ B+ Z" k/ f// HMC5883 51串口测试程序
5 L0 q1 R+ N8 N: w: n// 使用单片机STC89C51 4 j& R" V0 b9 e5 i. J
// 晶振:11.0592M
7 y; t5 F/ ~, I: V' q4 i// 显示:PC串口1 J5 |8 [4 E8 |
// 编译环境 Keil uVision2
% {; f# D4 O8 q// 参考宏晶网站24c04通信程序5 ^* [9 O5 U7 C" O; e0 t
// 时间:2011年3月1日
4 y# ?- M; a; S3 \$ L- C//****************************************1 Y2 d6 K' b# h& y
#include  <REG51.H>        7 p5 Q2 Y8 `; g" @: b
#include  <math.h>    //Keil library  
0 e& x1 U: |( a; r8 H8 ]+ |#include  <stdio.h>   //Keil library        
- k: l9 [' P/ P5 f#include  <INTRINS.H>. l2 a4 {0 k3 r' q# W1 t2 b  X
#define   uchar unsigned char
* J3 v3 n0 C# U) x' ]8 O+ Z#define   uint  unsigned int        
7 y9 ]3 W4 J$ T//使用的端口,请按照以下接线
: ]/ a- O. q5 ]& M#define DataPort P0        //LCD1602数据端口
" R, H& k* \. I4 R5 Msbit        SCL=P1^0;      //IIC时钟引脚定义2 ~! F7 W/ \# w. N4 P, k! K9 _
sbit        SDA=P1^1;      //IIC数据引脚定义! }! R0 T- I  Y0 c* u4 f
4 g, c8 h  i9 t, I4 s/ }

& T* S1 Q2 @( Y: q/ U7 T5 [( o) \& Y" o
1 ?7 J: ^( T4 r3 a
#define        SlaveAddress   0x3C          //定义器件5883在IIC总线中的从地址/ q0 t$ [  }2 @. g' _; R4 R5 K6 @
typedef unsigned char BYTE;
) }% l) a2 L$ Z- Otypedef unsigned short WORD;# |% i, {3 M. b7 D

. H4 W& h8 p* l* }, w! t- _2 n- |0 M
  p! v" v1 p$ l- l4 w# t: o' p
BYTE BUF[8];                         //接收数据缓存区              8 _4 J5 P7 t& p8 m$ C
uchar ge,shi,bai,qian,wan;           //显示变量
" n/ a" K! e8 _  i3 C" }- j: f  Zint  dis_data;                       //变量
: O/ R( @8 I: ?* R//************# D& P$ {1 t# j0 o; H7 B4 v

6 e9 f) A( W+ ]' ]5 Y, Q

+ U6 a. e! Q6 `  t5 f( r% l7 v2 y//************# s; F5 M1 g* M; j
void delay(unsigned int k);0 z$ W) b: z# d- }
void Init_HMC5883(void);            //初始化58837 h, H) O8 W% f3 u3 _3 D% |- J
void conversion(uint temp_data);
5 Y$ K7 G5 `4 g! J/ @$ }! a  s4 s, I) S. g3 I/ N
: z& y/ @, j5 E; k
void  Single_Write_HMC5883(uchar REG_Address,uchar REG_data);   //单个写入数据+ e* p: U: D$ G5 u5 F' _- r: q7 h* b
//uchar Single_Read_HMC5883(uchar REG_Address);                   //单个读取内部寄存器数据
1 ?' j! @2 t0 [3 @void  Multiple_Read_HMC5883();                                  //连续的读取内部寄存器数据
2 f4 f2 b' ]- K/ j. A//以下是模拟iic使用函数-------------
9 d' }- X4 ~7 ]& Dvoid Delay5us();6 T) l- G, ?$ e0 z- F$ x6 {
void Delay5ms();
+ z$ ]6 ?  Y- z& C) Hvoid HMC5883_Start();
" w( a0 a/ z8 I( O. w5 e) W8 F5 ]3 _( Hvoid HMC5883_Stop();/ Z* p+ m  {* t4 k
void HMC5883_SendACK(bit ack);8 a+ x* ~$ e) x* C' e- A0 g
bit  HMC5883_RecvACK();8 \  Y% O4 h8 @, b) O' @
void HMC5883_SendByte(BYTE dat);
: z( u# m7 p- u6 i% r) |, {% ~1 KBYTE HMC5883_RecvByte();
. X# S7 N3 h: X6 @4 F3 n' h0 jvoid HMC5883_ReadPage();
. u( N/ P1 B' u, N8 z) h5 I4 Nvoid HMC5883_WritePage();
" T- E. Z9 m- }: f6 |' h9 t6 P//-----------------------------------
6 T, b. N' R6 Q: L4 _  ?8 d! a% q3 V! ?- }+ F8 H7 ^! T4 R

( Q6 y" i8 d/ }2 b! N5 @  n# r7 B: z& ]//*********************************************
( }; n; }8 d5 w, B//串口初始化0 O8 H1 M; [+ l4 B* p) a
//9600 bps @ 11.059 MHz   M- `$ l. N; V. I. _0 ?$ ^
void init_uart()1 h4 E9 w+ u9 B& J9 `+ ]  ?1 {
{# S" S( w8 v( |4 n7 Q% P
        TMOD=0x21;                                * d, H4 n  h4 d: x' w+ F
        TH1=0xfd;                                
& P5 c; {# {; Y$ D: l: K: I        TL1=0xfd;                                
9 @- D4 g7 m; A9 E, r, ~        SCON=0x50;0 y" I4 ]: d) @0 _* I. i" d
        PS=1;      //串口中断设为高优先级别
/ M1 `' Q' @& V; k8 e        TR0=1;           //启动定时器                        2 _' c0 x7 k6 c, F6 z0 i
        TR1=1;
4 d+ k- X0 N  z) v9 I  S2 {        ET0=1;     //打开定时器0中断                        % T0 D7 N2 m# p1 l. ]5 z! X; b
        ES=1;        
  S4 K- ^& L# j4 l5 @+ \}
! Y5 k& y" u1 f/ p: E" b3 v# N7 ~9 I4 t, A
8 b2 I9 k* k" m7 Y3 B  K
//*********串口数据发送******************
# y) H! M8 o1 P% @. k' t/ D" yvoid  SeriPushSend(uchar send_data)6 w$ W$ |+ y8 g4 u- Z/ E+ Y5 B
{
. M5 L4 M8 n* {. o# P5 S    SBUF=send_data;  
! O" Y" s2 _, p( g2 o* Z) \! U        while(!TI);TI=0;          - m2 O6 G) K/ c2 a7 ~
}
! o* D7 I+ r7 g7 ^//*********************************************************
! j: d9 q8 J2 q4 h$ jvoid conversion(uint temp_data)  
: @& N( `3 P3 r7 z5 O, y{  
2 o6 U& o. v( K& z" N& U# d1 [# a    wan=temp_data/10000+0x30 ;- H/ r# M" j; \5 J2 r4 _. q5 F' X% v
    temp_data=temp_data%10000;   //取余运算
7 F9 V/ {1 |( Y0 _; f        qian=temp_data/1000+0x30 ;
/ a. ?& c1 h+ m    temp_data=temp_data%1000;    //取余运算
, ^1 y5 Q1 f( a( ~7 b    bai=temp_data/100+0x30   ;
: a, I0 Y/ Q+ i0 A% k9 k    temp_data=temp_data%100;     //取余运算
9 U" S, ^' f7 A    shi=temp_data/10+0x30    ;
2 A7 g9 {. w. ]3 o, V5 I    temp_data=temp_data%10;      //取余运算$ f# x& L% T7 [! c) L3 Z2 A
    ge=temp_data+0x30;         9 F8 u7 M, y" t, G
}+ O  Q9 r& H  d6 A! j

6 Y8 F1 N4 [- `% B
/ z- G( E; x7 p. }8 U& k
/*******************************/* Y' ]; Q" B1 h8 e
void delay(unsigned int k)        , u. @% L- F1 ~3 N# `! U
{                                                % ^. K1 s8 v+ N+ |4 i) `2 y
unsigned int i,j;                                
- I7 B7 Q4 J2 m# X( L! bfor(i=0;i<k;i++)/ W1 l) w+ [. [! U) e( U! M7 t, A
{                        4 X( l, P$ L/ _* _+ e
for(j=0;j<121;j++)                        
0 K) t0 [. f- Z) Y) n5 }) r4 b{;}}                                                4 {. }4 v1 l9 o! t: c. H9 k
}& }, C5 J' C5 m* {
        
. g* p# x7 b. w) e) Q8 j+ a, ^2 ]- ^3 t' j3 ?

9 ?3 Y) X) x; V# s3 m/**************************************
4 F/ Y; q* ?# h7 c延时5微秒(STC90C52RC@12M)
2 a* p9 w" ?" Q! S/ c& B不同的工作环境,需要调整此函数,注意时钟过快时需要修改# c2 x8 a+ [+ a2 g' i. y
当改用1T的mcu时,请调整此延时函数3 F5 X8 W9 s8 K5 s
**************************************/- o* Z: \9 |% k# {/ `) l9 Q
void Delay5us()
( t$ x" Z2 C+ J+ y9 x" l{& N0 B6 ]) }" f* d/ k, a3 n1 A
    _nop_();_nop_();_nop_();_nop_();5 s1 P, m, A9 [5 h, Q& I! c9 F* I
    _nop_();_nop_();_nop_();_nop_();5 N$ Z, g; N  e3 X! t
        _nop_();_nop_();_nop_();_nop_();* O. V9 ?2 P7 D: Z4 D! M' L' o
        _nop_();_nop_();_nop_();_nop_();0 Q7 Z7 P7 X0 y7 f
    _nop_();_nop_();_nop_();_nop_();7 z3 U, C. Z3 I3 t
}
" i. J. q9 u0 F8 ?. v3 W% I# k# [0 A7 D" r+ _6 r
' X9 K7 J. j% @+ e: N
/**************************************
% J: ?; D# _% Y, W延时5毫秒(STC90C52RC@12M)
5 d, h5 S9 p% e) h不同的工作环境,需要调整此函数
& d: I, T' ?% D- B) I当改用1T的MCU时,请调整此延时函数
1 u  y  `7 O& `3 l9 d/ M  o**************************************/
8 T2 p" y2 j9 S6 @void Delay5ms()3 j5 J6 O3 a9 u! r2 ^+ I
{
6 B. R, P' F$ K1 U    WORD n = 560;: \8 ^; K, H! ~" C
, n% F' e; Q; v4 u. U& ?# c
* S. l7 d# y/ @4 Q5 e! J! A  Y
    while (n--);
- c3 y3 b. i# y8 {( a* m}
" I) y( {2 I, [7 c$ G( L# ]& q" p2 j0 C; X

% w' u0 d. v2 n6 \1 a3 k  S/**************************************+ M& |0 B$ ^" k5 `! l! J8 x) n9 w
起始信号
. c0 g7 E2 _0 f**************************************/
8 @& x$ y; d/ i5 j* x- n# uvoid HMC5883_Start()- ~$ j, w; k4 F& T% @2 R- n
{
( N2 x% f9 A% P    SDA = 1;                    //拉高数据线: ?. ^% c$ D& t6 ?5 G8 k2 T
    SCL = 1;                    //拉高时钟线
& n+ f8 N- E: X* U4 r. j$ e" {    Delay5us();                 //延时: E3 _+ G" A* [" a  c8 {6 g
    SDA = 0;                    //产生下降沿8 q1 q# ~( q) j# w! _/ f
    Delay5us();                 //延时
8 M! ?4 H2 i  D$ C' A! L    SCL = 0;                    //拉低时钟线
/ ?* N# D* g' Z}
1 \% w8 r5 C( d9 }# i9 z( X1 J! S) q
: y; X. _# F  `* u

, J2 H$ V6 |. K8 z$ F/**************************************
$ T% i5 S/ x" o9 Y/ Q) L) D停止信号: B9 }* w; I7 Q7 k, A+ `4 g3 c# N
**************************************/
8 d2 k  j; z. pvoid HMC5883_Stop()7 q0 e8 B$ w# c/ B9 e
{- f0 y* _4 `; i- k; C2 \
    SDA = 0;                    //拉低数据线
) k% ~* W' p" l& Y$ S2 F8 L8 j    SCL = 1;                    //拉高时钟线
- L2 v* ^! ]2 S6 C# _$ g4 c5 W; q    Delay5us();                 //延时* C4 P0 F* ?' H
    SDA = 1;                    //产生上升沿
* O' r% p4 A  c- j, `- U$ r    Delay5us();                 //延时" d+ N, F* ^* y5 t. u
}
0 n& t  }2 A: C4 \) P
, }4 L2 \& z% _# ^' t6 _9 ?% e
4 I2 a- M9 i7 Q' D5 n9 _8 O
/**************************************5 a: c7 L* ]! N* I! @  K. F
发送应答信号$ n1 R, p; z* J" T+ M2 Y
入口参数:ack (0:ACK 1:NAK)- K- Q3 A+ x5 m! v2 j9 f! s1 d9 O
**************************************/. |+ v$ Q  k. O" ^) n  F5 U# N6 f
void HMC5883_SendACK(bit ack)
; R( |& _( z2 Z  t1 a, C* t{! t0 w# |6 y8 n9 c( t
    SDA = ack;                  //写应答信号
! i( J3 a0 c2 p: i    SCL = 1;                    //拉高时钟线
! _7 {" D4 U, V) S    Delay5us();                 //延时
/ `3 q6 ?7 S+ j4 Q9 c3 f4 O% W    SCL = 0;                    //拉低时钟线
9 `4 s9 N; `' r: Y    Delay5us();                 //延时
$ i  h. `& G; a1 p& l}1 F& S, g" v, p8 T0 w, ?

+ J, B( q3 [1 M& H/ Z' T. u" n6 J
3 R. e1 Z- }9 d) j  S4 O
/**************************************
* y& Y) h4 A3 ?+ y接收应答信号/ K! \1 K; X& \& F& o
**************************************/5 g  N" o; F$ Z* V
bit HMC5883_RecvACK()
$ ~5 [" X& F/ A: `# a: l5 z{5 H# X; K( N2 N" G( [# W* h
    SCL = 1;                    //拉高时钟线
. F3 ^3 s  b* r" k) D5 s8 ?5 w' a    Delay5us();                 //延时
# x1 N: p: ?8 n5 {, t& W: \8 ?" {  n- I    CY = SDA;                   //读应答信号
9 z% J' U2 E" k! |$ X    SCL = 0;                    //拉低时钟线) C8 ~$ P5 [% ]+ S/ T( a
    Delay5us();                 //延时
. b3 S5 F4 d- B+ t- [/ _; o; R6 p$ K6 A- \2 |/ ~! r% F3 K, U

6 _- Y; j! Y! @, L8 V( E    return CY;
- A5 [# P5 e$ [8 Q8 T$ a; p}
) b: s$ J( J: b# H  U0 J+ H0 U& \
& {& S$ W; o) y& W# H
/**************************************3 t9 H( U- K* L0 _6 G2 u8 P- O9 |
向IIC总线发送一个字节数据& F  i! i' s% D1 ^9 M' }& S9 U/ h
**************************************/& |$ S% x* X" d1 w8 g" E6 d
void HMC5883_SendByte(BYTE dat)$ A" p/ X7 z" q& a" s( X
{- v  h& U% R+ `' ^, y. c2 I0 t0 X
    BYTE i;# T* I+ ~+ L5 n* C0 H. d
- n( w+ h9 L* X

1 j' \1 G" Q0 O# k! u( `    for (i=0; i<8; i++)         //8位计数器* T/ W( W2 |, X. r% t% [4 O
    {, \, O- }/ N" V$ M4 m) e/ U
        dat <<= 1;              //移出数据的最高位: e; l) {4 e: |( Q
        SDA = CY;               //送数据口
/ l, F/ f2 o3 T  R6 X2 k7 d" j        SCL = 1;                //拉高时钟线
0 h/ |) }# J$ Y: Y6 G1 _+ j! N2 O: d5 R        Delay5us();             //延时$ V* b$ m' m2 l$ w+ }
        SCL = 0;                //拉低时钟线
5 n( g6 `3 }, w- ?! {) ?        Delay5us();             //延时
; Z0 S; p- X' U0 T1 v    }
6 r, W- K8 L& W+ P    HMC5883_RecvACK();8 e+ D; }: {7 L
}6 V6 ?* @' e/ _! J2 ^8 ~
/ N& `4 C3 Z6 g) M* }$ k  u9 O  Y, h

2 ]( V- ]  Q; o2 w( B/**************************************
3 G% Y9 R4 n% G; f- n1 v7 N从IIC总线接收一个字节数据
) U/ R, M/ n# z3 [; @8 D9 E. t9 K**************************************/
4 _$ C" q  f, L2 W# A9 B- {, BBYTE HMC5883_RecvByte()  }( f6 A) U" I$ X6 G
{3 c2 I# k0 ^) w
    BYTE i;. [* n) y7 h5 d# V$ d8 a
    BYTE dat = 0;) k* H# s6 e; t0 B; T

$ V* G: y' z, L  p0 p

- n# A- M+ h* u& G( o2 Q    SDA = 1;                    //使能内部上拉,准备读取数据,8 ^" f. B* n5 P8 F
    for (i=0; i<8; i++)         //8位计数器! c5 k/ i$ d: n/ e  S
    {0 N6 a5 R4 i1 Y3 E7 z4 i
        dat <<= 1;) [2 q8 g9 i  X; b% {: Y, d+ B/ M
        SCL = 1;                //拉高时钟线
+ U' L; d% }9 E  k. E        Delay5us();             //延时
: G$ V7 K  ]% v' d0 r& E        dat |= SDA;             //读数据               
8 _; \8 K5 s4 c4 Q1 c; r        SCL = 0;                //拉低时钟线
9 u* {7 b; U- \5 m* O        Delay5us();             //延时
3 Y$ V$ }! \  N# c    }8 c8 g9 i% @+ \7 e8 Y% I
    return dat;
* F% X# }+ v; v( w}- G; n, r; y+ A, _/ M$ |
0 G# g7 v+ {& \! ]6 A9 u
0 `3 X: y  N# o2 l) K3 @* N# Z, o' i
//***************************************************0 H% J4 l$ ]; p5 G1 F" h! y
1 m$ v; K1 L' U' \6 p  M7 c7 a# s
  f) `, q2 V9 l; k$ E
void Single_Write_HMC5883(uchar REG_Address,uchar REG_data)
$ N4 ?. _4 a/ g' R: v$ c{
6 U2 t# e  c/ c: X% \. `
7 R) B5 X: E' {: o
, D  ~2 n% |- E$ W( R9 D

0 Z1 p  b$ ~# W  n% z8 H4 l9 E+ ]7 O0 c
5 d5 x, H6 I/ G4 E+ a3 ]7 i2 ~
…………限于本文篇幅 余下代码请下载附件…………
7 `$ W0 _" u7 u, `3 a' n6 w
4 q) d5 R1 e4 x2 q
4 L: F/ A( Y/ ~! b$ L* y
游客,如果您要查看本帖隐藏内容请回复
9 s8 T6 w/ L* ?) E7 b
: b3 v0 f9 v) T- w& Q1 j: ]

0 N" u% v5 y* v, w' h8 B/ t
( _% y' M2 S# A2 C( e2 V+ _9 q- C+ s9 ~; S% n) I( [
1 d3 h" x. c% F) X: j, H+ V+ y
$ z! h" @3 A* S) A& E9 D
4 b+ m) z9 m8 q; M/ Q1 w) j% z8 r
4 F' x$ M0 Y; R/ Y: I" {' }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-5 17:05 , Processed in 0.203125 second(s), 26 queries , Gzip On.

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

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

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