锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

HMC5883L电子指南针罗盘模块 GY-271三轴磁场传感器 的相关教程 带Arduino 51源代码

时间:2022-11-14 21:00:01 传感器hmc5883l271m三轴磁场传感器模块gy

//***************************************

// HMC5883 51串口测试程序

// 使用单片机STC89C51

// 晶振:11.0592M

// 显示:PC串口

// 编译环境 Keil uVision2

// 参考宏晶网站24c04通信程序

// 时间:2011年3月1日

//****************************************

#include

#include //Keil library

#include //Keil library

#include

#define uchar unsigned char

#define uintunsigned int

//使用的端口请遵循以下接线

#define DataPort P0 //LCD1602数据端口

sbit SCL=P1^0; //IIC时钟引脚定义

sbit SDA=P1^1; //IIC数据引脚定义

#define SlaveAddress 0x3C //定义器件5883IIC从地址到总线

typedef unsigned char BYTE;

typedef unsigned short WORD;

BYTE BUF[8]; //接收数据缓存区

uchar ge,shi,bai,qian,wan; //显示变量

intdis_data; //变量

//************

//************

void delay(unsigned int k);

void Init_HMC5883(void); //初始化5883

void conversion(uint temp_data);

voidSingle_Write_HMC5883(uchar REG_Address,uchar REG_data); //单独写入数据

//uchar Single_Read_HMC5883(uchar REG_Address); //单个读取内部寄存器数据

voidMultiple_Read_HMC5883(); ///连续读取内部寄存器数据

以下是模拟iic使用函数-------------

void Delay5us();

void Delay5ms();

void HMC5883_Start();

void HMC5883_Stop();

void HMC5883_SendACK(bit ack);

bitHMC5883_RecvACK();

void HMC5883_SendByte(BYTE dat);

BYTE HMC5883_RecvByte();

void HMC5883_ReadPage();

void HMC5883_WritePage();

//-----------------------------------

//*********************************************

//串口初始化

//9600 bps @ 11.059 MHz

void init_uart()

{

TMOD=0x21;

TH1=0xfd;

TL1=0xfd;

SCON=0x50;

PS=1; ///串口中断设置为高优先级

TR0=1; ///启动定时器

TR1=1;

ET0=1; ///打开定时器0中断

ES=1;

}

//*********发送串口数据******************

voidSeriPushSend(uchar send_data)

{

SBUF=send_data;

while(!TI);TI=0;

}

//*********************************************************

void conversion(uint temp_data)

{

wan=temp_data/10000 0x30 ;

temp_data=temp_data000; ///取余运算

qian=temp_data/1000 0x30 ;

temp_data=temp_data00; ///取余运算

bai=temp_data/100 0x30 ;

temp_data=temp_data0; ///取余运算

shi=temp_data/10 0x30 ;

temp_data=temp_data; //取余运算

ge=temp_data 0x30;

}

/*******************************/

void delay(unsigned int k)

{

unsigned int i,j;

for(i=0;i

{

for(j=0;j<121;j )

{;}}

}

/**************************************

延时5微秒(STC90C52RC@12M)

对于不同的工作环境,需要调整此函数,注意时钟过快时需要修改

当改用1T的MCU请调整此延迟函数

**************************************/

void Delay5us()

{

_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();

}

/**************************************

延时5毫秒(STC90C52RC@12M)

该函数需要调整不同的工作环境

当改用1T的MCU请调整此延迟函数

**************************************/

void Delay5ms()

p>{

WORD n = 560;

while (n--);

}

/**************************************

起始信号

**************************************/

void HMC5883_Start()

{

SDA = 1;                    //拉高数据线

SCL = 1;                    //拉高时钟线

Delay5us();                 //延时

SDA = 0;                    //产生下降沿

Delay5us();                 //延时

SCL = 0;                    //拉低时钟线

}

/**************************************

停止信号

**************************************/

void HMC5883_Stop()

{

SDA = 0;                    //拉低数据线

SCL = 1;                    //拉高时钟线

Delay5us();                 //延时

SDA = 1;                    //产生上升沿

Delay5us();                 //延时

}

/**************************************

发送应答信号

入口参数:ack (0:ACK 1:NAK)

**************************************/

void HMC5883_SendACK(bit ack)

{

SDA = ack;                  //写应答信号

SCL = 1;                    //拉高时钟线

Delay5us();                 //延时

SCL = 0;                    //拉低时钟线

Delay5us();                 //延时

}

/**************************************

接收应答信号

**************************************/

bit HMC5883_RecvACK()

{

SCL = 1;                    //拉高时钟线

Delay5us();                 //延时

CY = SDA;                   //读应答信号

SCL = 0;                    //拉低时钟线

Delay5us();                 //延时

return CY;

}

/**************************************

向IIC总线发送一个字节数据

**************************************/

void HMC5883_SendByte(BYTE dat)

{

BYTE i;

for (i=0; i<8; i++)         //8位计数器

{

dat <<= 1;              //移出数据的最高位

SDA = CY;               //送数据口

SCL = 1;                //拉高时钟线

Delay5us();             //延时

SCL = 0;                //拉低时钟线

Delay5us();             //延时

}

HMC5883_RecvACK();

}

/**************************************

从IIC总线接收一个字节数据

**************************************/

BYTE HMC5883_RecvByte()

{

BYTE i;

BYTE dat = 0;

SDA = 1;                    //使能内部上拉,准备读取数据,

for (i=0; i<8; i++)         //8位计数器

{

dat <<= 1;

SCL = 1;                //拉高时钟线

Delay5us();             //延时

dat |= SDA;             //读数据

SCL = 0;                //拉低时钟线

Delay5us();             //延时

}

return dat;

}

//***************************************************

void Single_Write_HMC5883(uchar REG_Address,uchar REG_data)

{

…………限于本文篇幅 余下代码请从51黑下载附件…………

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章