欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機驅(qū)動MMA7455源程序
[打印本頁]
作者:
51hei圓圓
時間:
2022-9-9 15:56
標題:
單片機驅(qū)動MMA7455源程序
MMA7455.C文件
#include "MMA7455.H"
//sbit sda=P2^3; //I2C 數(shù)據(jù)傳送位
//sbit scl=P2^4; //I2C 時鐘傳送位
unsigned char sign_flag; //輸出數(shù)據(jù)正負標記位
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 左移,后邊補一寫位 0 ,得到0x3A
#define MMA7455_ADDER_READ 0x3B //0x1D 左移,后邊補一讀位 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軸補償?shù)妥止?jié)
#define MMA7455_RW_YOFFL 0x12 //Y軸補償?shù)妥止?jié)、
#define MMA7455_RW_ZOFFL 0x14 //Z軸補償?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ù)制代碼
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1