android 磁场传感器 罗盘,HMC5883L电子指南针罗盘模块 GY-271三轴磁场传感器 的相关教程 带Arduino 51源代码...
//***************************************
// 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? ?uint??unsigned int
//使用的端口,請按照以下接線
#define DataPort P0? ? ? ? //LCD1602數據端口
sbit? ? ? ? SCL=P1^0;? ?? ?//IIC時鐘引腳定義
sbit? ? ? ? SDA=P1^1;? ?? ?//IIC數據引腳定義
#define? ? ? ? SlaveAddress? ?0x3C? ? ? ?? ?//定義器件5883在IIC總線中的從地址
typedef unsigned char BYTE;
typedef unsigned short WORD;
BYTE BUF[8];? ?? ?? ?? ?? ?? ?? ?? ? //接收數據緩存區
uchar ge,shi,bai,qian,wan;? ?? ?? ???//顯示變量
int??dis_data;? ?? ?? ?? ?? ?? ?? ???//變量
//************
//************
void delay(unsigned int k);
void Init_HMC5883(void);? ?? ?? ?? ?//初始化5883
void conversion(uint temp_data);
void??Single_Write_HMC5883(uchar REG_Address,uchar REG_data);? ?//單個寫入數據
//uchar Single_Read_HMC5883(uchar REG_Address);? ?? ?? ?? ?? ?? ? //單個讀取內部寄存器數據
void??Multiple_Read_HMC5883();? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? //連續的讀取內部寄存器數據
//以下是模擬iic使用函數-------------
void Delay5us();
void Delay5ms();
void HMC5883_Start();
void HMC5883_Stop();
void HMC5883_SendACK(bit ack);
bit??HMC5883_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;
}
//*********串口數據發送******************
void??SeriPushSend(uchar send_data)
{
SBUF=send_data;
while(!TI);TI=0;
}
//*********************************************************
void conversion(uint temp_data)
{
wan=temp_data/10000+0x30 ;
temp_data=temp_data%10000;? ?//取余運算
qian=temp_data/1000+0x30 ;
temp_data=temp_data%1000;? ? //取余運算
bai=temp_data/100+0x30? ?;
temp_data=temp_data%100;? ???//取余運算
shi=temp_data/10+0x30? ? ;
temp_data=temp_data%10;? ?? ?//取余運算
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()
{
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黑下載附件…………
總結
以上是生活随笔為你收集整理的android 磁场传感器 罗盘,HMC5883L电子指南针罗盘模块 GY-271三轴磁场传感器 的相关教程 带Arduino 51源代码...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何在 iPhone 14 上使用实况文
- 下一篇: qq互联android sdk,qq互联