HMC5883L电子指南针罗盘模块 GY-271三轴磁场传感器 的相关教程 带Arduino 51源代码
时间:2022-11-14 21:00:01
//***************************************
// 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黑下载附件…………