#include "MMC2020MG.h"
#include<intrins.h>
#include<math.h>
#include <string.h>
#define MMC2020MG_ADD 0x64//0x60写 0x61读
#define TARGET_ADD 0x00
#define SET_CODE 0x02
#define RESET_CODE 0x04
#define WAKE_UP_CODE 0x01
#define pi 3.1415926535
#define I2C_DELAY_TIME 10
#define SENSOR_DIREC 0
extern INT16U time;
INT8U X_h=0,X_l=0,Y_h=0,Y_l=0,Reg=0;////??????
INT16U Hx=0,Hy=0;//用于存储X与Y轴的数据
INT16U Hx_max=0,Hx_min=4095;
INT16U Hy_max=0,Hy_min=4095;
INT32U IAcc;
//float x_sf,y_sf;//X与Y轴的定标因数
//float x_off,y_off;//X与Y轴的零偏移值
INT16U x_offset,y_offset;
INT16U x_sensitivity,y_sensitivity;
bit bXPositive,bYPositive;
INT16 X_raw , Y_raw;
INT8 const xdata cAtanStep[19]={0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23};
INT16 const xdata iAtanPoint[19]={0x020C,0x0998,0x0d60,0x1057,0x12cd,0x1508,0x1702,0x18ca,0x1a8c,0x1c2c,0x1da6,0x1f12,0x206e,0x21b8,0x2258,0x244d,0x2576,0x26a8,0x2710};
INT16 const xdata iAtanAngle[19]={0x001e,0x008a,0x00bd,0x00e3,0x0101,0x011b,0x0131,0x0144,0x0156,0x0166,0x0174,0x0181,0x018d,0x0198,0x01a3,0x01ad,0x01b6,0x01bf,0x01c2};
//INT16U g_angle;//全局角度变量
extern INT8U flag;
bit Ack; /*应答标志位*/
/*****************************************************/
/* 函数名称 : Delay1us */
/* 函数功能 : 1us延迟 */
/* 参数 : 延迟的us时间参数 */
/* 返回值 : 无 */
/*---------------------------------------------------*/
void Delay1us(INT16U us)
{
while(us--)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
/*****************************************************/
/* 函数名称 : I2C_Start */
/* 函数功能 : 开始I2C接口总线 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*---------------------------------------------------*/
void I2C_Start()
{
SDA=1; /*发送起始条件的数据信号*/
SCL=1;
Delay1us(I2C_DELAY_TIME); /*起始条件建立时间大于4.7us,延时*/
SDA=0; /*发送起始信号*/
Delay1us(I2C_DELAY_TIME); /* 起始条件锁定时间大于4μs*/
SCL=0; /*钳住I2C总线,准备发送或接收数据 */
Delay1us(I2C_DELAY_TIME);
}
/*****************************************************/
/* 函数名称 : I2C_Stop */
/* 函数功能 : 结束I2C接口总线 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*---------------------------------------------------*/
void I2C_Stop()
{
SDA=0; /*发送结束条件的数据信号*/
SCL=1; /*发送结束条件的时钟信号*/
Delay1us(I2C_DELAY_TIME); /*结束条件建立时间大于4us*/
SDA=1; /*发送I2C总线结束信号*/
Delay1us(I2C_DELAY_TIME);
}
/*****************************************************/
/* 函数名称 : SEND_0 */
/* 函数功能 : 往SDA信号线上写0 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*---------------------------------------------------*/
void SEND_0(void) /* SEND 0 */
{
/*发送0,在SCL为高电平时使SDA信号为低*/
SDA=0;
SCL=1;
Delay1us(I2C_DELAY_TIME);
SCL=0;
//I2C_DELAY(I2C_DELAY_TIME);
}
/*****************************************************/
/* 函数名称 : SEND_1 */
/* 函数功能 : 往SDA信号线上写1 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*---------------------------------------------------*/
void SEND_1(void)
{
/*发送1,在SCL为高电平时使SDA信号为高*/
SDA=1;
SCL=1;
Delay1us(I2C_DELAY_TIME);
SCL=0;
//I2C_DELAY(I2C_DELAY_TIME);
SDA=0;
}
/*****************************************************/
/* 函数名称 : WriteI2CByte */
/* 函数功能 : MCU往从设备写一个字节数据 */
/* 参数 : 所写的字节数据 */
/* 返回值 : 无 */
/*---------------------------------------------------*/
void WriteI2CByte(INT8U b)
{
/*向I2C总线写一个字节*/
INT8U i;
for(i=0;i<8;i++)
if((b<<i)&0x80)
SEND_1();
else
SEND_0();
Delay1us(I2C_DELAY_TIME/2);
SDA=1; /*8位发送完后释放数据线,准备接收应答位*/
Delay1us(I2C_DELAY_TIME/2);
SCL=1;
Delay1us(I2C_DELAY_TIME/2);
if(SDA==1)
Ack=1;
else
Ack=0; /*判断是否接收到应答信号*/
SCL=0;
Delay1us(I2C_DELAY_TIME/2);
}
/*****************************************************/
/* 函数名称 : ReadI2CByte */
/* 函数功能 : MCU读取从设备的一个字节数据 */
/* 参数 : 无 */
/* 返回值 : 所读取到的字节数据 */
/*---------------------------------------------------*/
INT8 ReceiveByte()
{
bit temp3;
/*从I2C总线读一个字节*/
INT8U b=0,i;
for(i=0;i<8;i++)
{
SDA=1;
SCL=1;
Delay1us(I2C_DELAY_TIME);
temp3=SDA;
Delay1us(I2C_DELAY_TIME);
SCL=0;
if(temp3==1)
{
b=b<<1;
b=b|0x01;
}
else
b=b<<1;
}
return b;
}
/*****************************************************/
/* 函数名称 : SEND_ACK */
/* 函数功能 : 发送应答信号 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*---------------------------------------------------*/
void SEND_ACK(void) /* SEND ACK */
{
/*发送0,在SCL为高电平时使SDA信号为低*/
SDA=0;
Delay1us(I2C_DELAY_TIME/2);
SCL=1;
Delay1us(I2C_DELAY_TIME); /*时钟低电平周期大于4μs*/
SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/
Delay1us(I2C_DELAY_TIME/2);
}
/*****************************************************/
/* 函数名称 : SEND_NACK */
/* 函数功能 : 发送非应答信号 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*---------------------------------------------------*/
void SEND_NACK(void) /* SEND ACK */
{
/*发送0,在SCL为高电平时使SDA信号为低*/
SDA=1;
Delay1us(I2C_DELAY_TIME/2);
SCL=1;
Delay1us(I2C_DELAY_TIME); /*时钟低电平周期大于4μs*/
SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/
Delay1us(I2C_DELAY_TIME/2);
}
/*****************************************************/
/* 函数名称 : Init_Serialcomm */
/* 函数功能 : 初始化串口 */
/* 参数 : 无 */
/* 返回值 : 无 */
/*---------------------------------------------------*/
void Init_Serialcomm()
{
SCON = 0x50; // uart 模式1 (8 bit), REN=1;
TMOD = TMOD | 0x20 ; // 定时器1 模式2;
TH1 = 0xFF; // 9600 Bds at 11.059MHz
TL1 = 0xFF;
ES = 1; //允许uart中断;
EA = 1; //允许CPU中断;
TR1 = 1;
}
/*****************************************************/
/* 函数名称 : Send_Char_Com */
/* 函数功能 : 向串口发送一个字节的�
MMC212xMG.rar_mmc罗盘_电子罗盘_罗盘
版权申诉
179 浏览量
2022-09-20
21:30:48
上传
评论
收藏 5KB RAR 举报
小波思基
- 粉丝: 72
- 资源: 1万+