📄 mma7455l.c
字号:
/*************************************************************
本实验演示P89LPC9221与MMA7455L的基本操作
MMS7455L在IIC端口为0的情况下,地址为0x3A;
MMS7455L在IIC端口为1的情况下,地址为0x38;
(BRGR1 BRGR0)= 737300/1200 – 16 = = 0x17F0
最后得BRGR1 = 0x17 BRGR1= 0xF0
**************************************************************/
#include <reg922.h>
#include <function.h>
#include <intrins.h>
#include <math.h>
sbit Left_Led=P0^1;
sbit Right_Led=P0^2;
sbit Up_Led=P0^3;
sbit Down_Led=P0^4;
sbit Up_Up_Led=P0^5;
sbit Down_Down_Led=P0^7;
unsigned char ReceiveTemp;
unsigned char X_Y_Z_data[3];
bit ReceiveFlag; /* 接收标志位*/
unsigned char Ready;//
unsigned char X_Y_Z_data_Temp[6];
bit NeedForLight;
int Number;
/*********************************
读三轴数据函数
*********************************/
ReadData()
{
IRcvStr(0x3A,0x6,&X_Y_Z_data[0],1);//x轴
_Nop();
IRcvStr(0x3A,0x7,&X_Y_Z_data[1],1);//y轴
_Nop();
IRcvStr(0x3A,0x8,&X_Y_Z_data[2],1);//z轴
}
/*********************************
主函数
*********************************/
void main()
{
_Nop();
IO_Init();
UART_Init();
Ready = 0;
ReceiveFlag = 0 ;
NeedForLight=0;
EA =1;
MMA7455L_Init();
InitTimer();
while (1)
{
/*
if (ReceiveFlag ==1)
{
SBUF=ReceiveTemp; //发送数据
while(TI==0); //当TI为1时发送完毕
TI=0; //TI清0准备下一次发送
ReceiveFlag = 0;
}
*/
if (Ready == 1)
{
//ISendStr(0x3A,0x17,0x03); //清中断标志
//_Nop();
//ISendStr(0x3A,0x17,0x00);
ReadData();
X_Y_Z_data_Temp[0]=X_Y_Z_data[0];
X_Y_Z_data_Temp[1]=X_Y_Z_data[1];
X_Y_Z_data_Temp[2]=X_Y_Z_data[2];
Ready+=1;
}
if (Ready==3)
{
ReadData();
X_Y_Z_data_Temp[3]=X_Y_Z_data[0];
X_Y_Z_data_Temp[4]=X_Y_Z_data[1];
X_Y_Z_data_Temp[5]=X_Y_Z_data[2];
Ready=0;
if (
(abs(X_Y_Z_data_Temp[0]-X_Y_Z_data_Temp[3])>0x10)
||(abs(X_Y_Z_data_Temp[1]-X_Y_Z_data_Temp[4])>0x10)
||(abs(X_Y_Z_data_Temp[2]-X_Y_Z_data_Temp[5])>0x10)
)
{
Left_Led=0;
Number=0;
}
else
{
Number++;
if(Number>50)
{
Left_Led=1;
Number=0;
}
}
}
////////////////调试用,用户可以屏蔽///////////////////////////
SendData (X_Y_Z_data[0]);//发送到上位机
_Nop();
SendData (X_Y_Z_data[1]);
Nop();
SendData (X_Y_Z_data[2]);
//////////////////////////////////////////////////////////////
}
}
/*********************************
中断接收函数
*********************************/
void Rcv_ISR() interrupt 4//当接收完一个字节RI置1进入Recieve中断
{
ReceiveTemp=SBUF; //保存所读取的数据
RI=0; //RI清0以等待下次发送
ReceiveFlag = 1;
}
/*
*********************************
按键中断函数,在此用做MMA7455L的中断
**********************************
void Key_Press() interrupt 7
{
EKBI = 0;
KBCON = 0x00;
Ready = 1;
}
*/
/*********************************
定时器中断函数,定时读MMA7455L
**********************************/
void Timer1() interrupt 1
{
TH0=0X00;
TL0=0X00;
Ready+=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -