|
MMA7455.C文件
- #include "MMA7455.H"
- //sbit sda=P2^3; //I2C 數(shù)據(jù)傳送位
- //sbit scl=P2^4; //I2C 時(shí)鐘傳送位
- unsigned char sign_flag; //輸出數(shù)據(jù)正負(fù)標(biāo)記位
- void IIC_MMA7455_init()
- {
- IIC_start();
- IIC_writebyte(MMA7455_ADDER_WRITE); //1. 在IIC總線上尋址MMA7455
- while(IIC_respons());
- IIC_writebyte(MMA7455_Mode_Control_Register); //2. 模式設(shè)置寄存器尋址
- while(IIC_respons());
- IIC_writebyte(MMA7455_2G_Measurement_Mode); //3. 模式寄存器數(shù)據(jù)寫入
- while(IIC_respons());
- IIC_stop();
- IIC_start();
- IIC_writebyte(MMA7455_ADDER_WRITE); //1. 在IIC總線上尋址MMA7455
- while(IIC_respons());
- IIC_writebyte(MMA7455_Mode_Control_Register); //2. 模式設(shè)置寄存器尋址
- while(IIC_respons());
- IIC_writebyte(MMA7455_2G_Measurement_Mode); //3. 模式寄存器數(shù)據(jù)寫入
- while(IIC_respons());
- IIC_stop();
- }
- void IIC_MMA7455_writedata(uchar byte_add,uchar wdata)//函數(shù)功能:按地址寫入一字節(jié)數(shù)據(jù)
- {
- unsigned char temp;
- temp=(IIC_WRITE<<1);
- IIC_start();
- IIC_writebyte(temp);
- while(IIC_respons());
- IIC_writebyte(byte_add);
- while(IIC_respons());
- IIC_writebyte(wdata);
- while(IIC_respons());
- IIC_stop();
- }
- unsigned char IIC_MMA7455_readdata(uchar byte_add) //函數(shù)功能:按地址讀出一字節(jié)數(shù)據(jù)
- {
- unsigned char temp;
- char x_y_z ;
- temp=(IIC_WRITE<<1);
- IIC_start();
- IIC_writebyte(0x3A);
- while(IIC_respons());
- IIC_writebyte(byte_add);
- while(IIC_respons());
- temp=((IIC_READ<<1)|0x01);
- IIC_start();
- IIC_writebyte(0x3B);
- while(IIC_respons());
- x_y_z=IIC_readbyte();
- while(IIC_respons());
- IIC_stop();
- return x_y_z;
- }
- unsigned char IIC_MMA7455_test()
- {
- unsigned char temp;
- for(temp=255;temp<=1;temp--);
- IIC_MMA7455_writedata(0x16,0x05);
- for(temp=255;temp<=1;temp--);
- temp=IIC_MMA7455_readdata(0x16);
- if(temp==0x05) {return 1;}
- else{return 0;}
- }
- unsigned char IIC_MMA7455_checkbusy()
- {
- unsigned char temp;
- temp=IIC_MMA7455_readdata(MMA7455_READ_STATUS);
- if((temp&0x01)==1)
- {
- return 1;
- }
- else
- {
- return 0;
- }
- }
- unsigned char IIC_MMA7455_getvalue(unsigned char address_byte)
- {
- unsigned char temp;
- while(!IIC_MMA7455_checkbusy());
- temp=IIC_MMA7455_readdata(address_byte);
- if((temp&0x80)==0x00)
- {
- sign_flag=0;
- return temp;
-
- }
- else
- {
- sign_flag=1;
- temp=temp-0x01;
- temp=~temp;
- return temp;
- }
- }
- unsigned char IIC_MMA7455_getaverage(unsigned char address_byte)
- {
- unsigned char num,temp;
- unsigned int temps=0x00;
- for(num=50;num>0;num--)
- {
- temp=IIC_MMA7455_getvalue(address_byte);
- temps=temps+temp;
- }
- temp=temps/50;
- return temp;
- }
- unsigned char IIC_MMA7455_getacceleration(unsigned char address_byte)
- {
- unsigned int temp;
- temp=IIC_MMA7455_getaverage(address_byte);
- temp=temp*200;
- temp=temp>>7;
- return temp;
- }
- unsigned char IIC_MMA7455_calibrate_X()
- {
- unsigned char tempX,time;
- while(!IIC_MMA7455_checkbusy());
- tempX=IIC_MMA7455_readdata(MMA7455_READ_X);
- for(time=100;time>0;time--)
- {
- if((tempX&0x80)==0x00)
- {
- tempX=tempX+tempX;
- tempX=~tempX+1;
- IIC_MMA7455_writedata(MMA7455_RW_XOFFL,tempX);
- }
- else
- {
- tempX=tempX-1;
- tempX=~tempX;
- tempX=tempX+tempX;
- IIC_MMA7455_writedata(MMA7455_RW_XOFFL,tempX);
- }
- tempX=IIC_MMA7455_readdata(MMA7455_READ_X);
- if((tempX<=10)&&(tempX>=-10)){break;}
- }
- return 1;
- }
- unsigned char IIC_MMA7455_calibrate_Y()
- {
- unsigned char tempY,time;
- while(!IIC_MMA7455_checkbusy());
- tempY=IIC_MMA7455_readdata(MMA7455_READ_Y);
- for(time=100;time>0;time--)
- {
- if((tempY&0x80)==0x00)
- {
- tempY=tempY+tempY;
- tempY=~tempY+1;
- IIC_MMA7455_writedata(MMA7455_RW_XOFFL,tempY);
- }
- else
- {
- tempY=tempY-1;
- tempY=~tempY;
- tempY=tempY+tempY;
- IIC_MMA7455_writedata(MMA7455_RW_XOFFL,tempY);
- }
- tempY=IIC_MMA7455_readdata(MMA7455_READ_Y);
- if((tempY<=10)&&(tempY>=-10)){break;}
- }
- return 1;
- }
- unsigned char IIC_MMA7455_calibrate_Z()
- {
- unsigned char tempZ,time;
- while(!IIC_MMA7455_checkbusy());
- tempZ=IIC_MMA7455_readdata(MMA7455_READ_Z);
- for(time=100;time>0;time--)
- {
- if((tempZ&0x80)==0x00)
- {
-
- tempZ=64-tempZ;
- if(tempZ==0){break;}
- if(tempZ>0)
- {
- tempZ=tempZ+tempZ;
- tempZ=~tempZ+1;
- IIC_MMA7455_writedata(MMA7455_RW_XOFFL,tempZ);
- }
- if(tempZ<0)
- {
- tempZ=tempZ+tempZ;
- IIC_MMA7455_writedata(MMA7455_RW_XOFFL,tempZ);
- }
- }
- else
- {
- tempZ=tempZ-1;
- tempZ=~tempZ;
- tempZ=64+tempZ;
- tempZ=tempZ+tempZ;
- IIC_MMA7455_writedata(MMA7455_RW_XOFFL,tempZ);
- }
- tempZ=IIC_MMA7455_readdata(MMA7455_READ_Z);
- if((tempZ<=70)&&(tempZ>=50)){break;}
- }
- return 1;
- }
復(fù)制代碼
MMA7455.H頭文件
- #ifndef __MMA7455_H__
- #define __MMA7455_H__
- #include "IIC.H"
- #define uchar unsigned char
- #define uint unsigned int
- #define IIC_READ 0x1D //定義讀指令
- #define IIC_WRITE 0x1D //定義寫指令
- #define MMA7455_ADDER_WRITE 0x3A //0x1D 左移,后邊補(bǔ)一寫位 0 ,得到0x3A
- #define MMA7455_ADDER_READ 0x3B //0x1D 左移,后邊補(bǔ)一讀位 1 ,得到0x3B
- #define MMA7455_Mode_Control_Register 0x16
- #define MMA7455_WHOAMI 0X0F
- #define MMA7455_2G_Measurement_Mode 0x05
- #define MMA7455_READ_X 0x06 //讀 8bits X軸數(shù)據(jù)地址
- #define MMA7455_READ_Y 0x07 //讀 8bits y軸數(shù)據(jù)地址
- #define MMA7455_READ_Z 0x08 //讀 8bits y軸數(shù)據(jù)地址
- #define MMA7455_READ_STATUS 0x09 // 8位狀態(tài)寄存器
- #define MMA7455_RW_XOFFL 0x10 //X軸補(bǔ)償?shù)妥止?jié)
- #define MMA7455_RW_YOFFL 0x12 //Y軸補(bǔ)償?shù)妥止?jié)、
- #define MMA7455_RW_ZOFFL 0x14 //Z軸補(bǔ)償?shù)妥止?jié)
- void IIC_MMA7455_init();
- void IIC_MMA7455_writedata(uchar byte_add,uchar wdata);//函數(shù)功能:按地址寫入一字節(jié)數(shù)據(jù)
- unsigned char IIC_MMA7455_readdata(uchar byte_add); //函數(shù)功能:按地址讀出一字節(jié)數(shù)據(jù)
- unsigned char IIC_MMA7455_test();
- unsigned char IIC_MMA7455_calibrate_X();
- unsigned char IIC_MMA7455_calibrate_Y();
- unsigned char IIC_MMA7455_calibrate_Z();
- unsigned char IIC_MMA7455_getvalue(unsigned char address_byte);
- unsigned char IIC_MMA7455_getaverage(unsigned char address_byte);
- unsigned char IIC_MMA7455_getacceleration(unsigned char address_byte);
- #endif
復(fù)制代碼
|
|