ADXL345.docx

上传人:b****3 文档编号:3813550 上传时间:2023-05-06 格式:DOCX 页数:16 大小:17.47KB
下载 相关 举报
ADXL345.docx_第1页
第1页 / 共16页
ADXL345.docx_第2页
第2页 / 共16页
ADXL345.docx_第3页
第3页 / 共16页
ADXL345.docx_第4页
第4页 / 共16页
ADXL345.docx_第5页
第5页 / 共16页
ADXL345.docx_第6页
第6页 / 共16页
ADXL345.docx_第7页
第7页 / 共16页
ADXL345.docx_第8页
第8页 / 共16页
ADXL345.docx_第9页
第9页 / 共16页
ADXL345.docx_第10页
第10页 / 共16页
ADXL345.docx_第11页
第11页 / 共16页
ADXL345.docx_第12页
第12页 / 共16页
ADXL345.docx_第13页
第13页 / 共16页
ADXL345.docx_第14页
第14页 / 共16页
ADXL345.docx_第15页
第15页 / 共16页
ADXL345.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

ADXL345.docx

《ADXL345.docx》由会员分享,可在线阅读,更多相关《ADXL345.docx(16页珍藏版)》请在冰点文库上搜索。

ADXL345.docx

ADXL345

//***************************************

//GY-29ADXL345IIC测试程序

//使用单片机STC89C51

//晶振:

11.0592M

//显示:

LCD1602

//****************************************

#include

#include//Keillibrary

#include//Keillibrary

#include

#defineucharunsignedchar

#defineuintunsignedint

#defineDataPortP0//LCD1602数据端口

sbitSCL=P1^0;//IIC时钟引脚定义

sbitSDA=P1^1;//IIC数据引脚定义

sbitLCM_RS=P2^0;//LCD1602命令端口

sbitLCM_RW=P2^1;//LCD1602命令端口

sbitLCM_EN=P2^2;//LCD1602命令端口

#defineSlaveAddress0xA6//定义器件在IIC总线中的从地址,根据ALTADDRESS地址引脚不同修改

//ALTADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A

typedefunsignedcharBYTE;

typedefunsignedshortWORD;

BYTEBUF[8];//接收数据缓存区

ucharge,shi,bai,qian,wan;//显示变量

intdis_data;//变量

intdata_xyz[3];

 

voiddelay(unsignedintk);

voidInitLcd();//初始化lcd1602

voidInit_ADXL345(void);//初始化ADXL345

voidWriteDataLCM(uchardataW);

voidWriteCommandLCM(ucharCMD,ucharAttribc);

voidDisplayOneChar(ucharX,ucharY,ucharDData);

voidconversion(uinttemp_data);

voidSingle_Write_ADXL345(ucharREG_Address,ucharREG_data);//单个写入数据

ucharSingle_Read_ADXL345(ucharREG_Address);//单个读取内部寄存器数据

voidMultiple_Read_ADXL345();//连续的读取内部寄存器数据

//------------------------------------

voidDelay5us();

voidDelay5ms();

voidADXL345_Start();

voidADXL345_Stop();

voidADXL345_SendACK(bitack);

bitADXL345_RecvACK();

voidADXL345_SendByte(BYTEdat);

BYTEADXL345_RecvByte();

voidADXL345_ReadPage();

voidADXL345_WritePage();

//-----------------------------------

//*********************************************************

voidconversion(uinttemp_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;

}

/*******************************/

voiddelay(unsignedintk)

{

unsignedinti,j;

for(i=0;i

{

for(j=0;j<121;j++)

{;}}

}

/*******************************/

voidWaitForEnable(void)

{

DataPort=0xff;

LCM_RS=0;LCM_RW=1;_nop_();

LCM_EN=1;_nop_();_nop_();

while(DataPort&0x80);

LCM_EN=0;

}

/*******************************/

voidWriteCommandLCM(ucharCMD,ucharAttribc)

{

if(Attribc)WaitForEnable();

LCM_RS=0;LCM_RW=0;_nop_();

DataPort=CMD;_nop_();

LCM_EN=1;_nop_();_nop_();LCM_EN=0;

}

/*******************************/

voidWriteDataLCM(uchardataW)

{

WaitForEnable();

LCM_RS=1;LCM_RW=0;_nop_();

DataPort=dataW;_nop_();

LCM_EN=1;_nop_();_nop_();LCM_EN=0;

}

/***********************************/

voidInitLcd()

{

WriteCommandLCM(0x38,1);

WriteCommandLCM(0x08,1);

WriteCommandLCM(0x01,1);

WriteCommandLCM(0x06,1);

WriteCommandLCM(0x0c,1);

}

/***********************************/

voidDisplayOneChar(ucharX,ucharY,ucharDData)

{

Y&=1;

X&=15;

if(Y)X|=0x40;

X|=0x80;

WriteCommandLCM(X,0);

WriteDataLCM(DData);

}

/**************************************

延时5微秒(STC90C52RC@12M)

不同的工作环境,需要调整此函数,注意时钟过快时需要修改

当改用1T的MCU时,请调整此延时函数

**************************************/

voidDelay5us()

{

_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();

}

/**************************************

延时5毫秒(STC90C52RC@12M)

不同的工作环境,需要调整此函数

当改用1T的MCU时,请调整此延时函数

**************************************/

voidDelay5ms()

{

WORDn=560;

while(n--);

}

/**************************************

起始信号

**************************************/

voidADXL345_Start()

{

SDA=1;//拉高数据线

SCL=1;//拉高时钟线

Delay5us();//延时

SDA=0;//产生下降沿

Delay5us();//延时

SCL=0;//拉低时钟线

}

/**************************************

停止信号

**************************************/

voidADXL345_Stop()

{

SDA=0;//拉低数据线

SCL=1;//拉高时钟线

Delay5us();//延时

SDA=1;//产生上升沿

Delay5us();//延时

}

/**************************************

发送应答信号

入口参数:

ack(0:

ACK1:

NAK)

**************************************/

voidADXL345_SendACK(bitack)

{

SDA=ack;//写应答信号

SCL=1;//拉高时钟线

Delay5us();//延时

SCL=0;//拉低时钟线

Delay5us();//延时

}

/**************************************

接收应答信号

**************************************/

bitADXL345_RecvACK()

{

SCL=1;//拉高时钟线

Delay5us();//延时

CY=SDA;//读应答信号

SCL=0;//拉低时钟线

Delay5us();//延时

returnCY;

}

/**************************************

向IIC总线发送一个字节数据

**************************************/

voidADXL345_SendByte(BYTEdat)

{

BYTEi;

for(i=0;i<8;i++)//8位计数器

{

dat<<=1;//移出数据的最高位

SDA=CY;//送数据口

SCL=1;//拉高时钟线

Delay5us();//延时

SCL=0;//拉低时钟线

Delay5us();//延时

}

ADXL345_RecvACK();

}

/**************************************

从IIC总线接收一个字节数据

**************************************/

BYTEADXL345_RecvByte()

{

BYTEi;

BYTEdat=0;

SDA=1;//使能内部上拉,准备读取数据,

for(i=0;i<8;i++)//8位计数器

{

dat<<=1;

SCL=1;//拉高时钟线

Delay5us();//延时

dat|=SDA;//读数据

SCL=0;//拉低时钟线

Delay5us();//延时

}

returndat;

}

//******单字节写入*******************************************

voidSingle_Write_ADXL345(ucharREG_Address,ucharREG_data)

{

ADXL345_Start();//起始信号

ADXL345_SendByte(SlaveAddress);//发送设备地址+写信号

ADXL345_SendByte(REG_Address);//内部寄存器地址,请参考中文pdf22页

ADXL345_SendByte(REG_data);//内部寄存器数据,请参考中文pdf22页

ADXL345_Stop();//发送停止信号

}

//********单字节读取*****************************************

ucharSingle_Read_ADXL345(ucharREG_Address)

{ucharREG_data;

ADXL345_Start();//起始信号

ADXL345_SendByte(SlaveAddress);//发送设备地址+写信号

ADXL345_SendByte(REG_Address);//发送存储单元地址,从0开始

ADXL345_Start();//起始信号

ADXL345_SendByte(SlaveAddress+1);//发送设备地址+读信号

REG_data=ADXL345_RecvByte();//读出寄存器数据

ADXL345_SendACK

(1);

ADXL345_Stop();//停止信号

returnREG_data;

}

//*********************************************************

//

//连续读出ADXL345内部加速度数据,地址范围0x32~0x37

//

//*********************************************************

voidMultiple_read_ADXL345(void)

{uchari;

ADXL345_Start();//起始信号

ADXL345_SendByte(SlaveAddress);//发送设备地址+写信号

ADXL345_SendByte(0x32);//发送存储单元地址,从0x32开始

ADXL345_Start();//起始信号

ADXL345_SendByte(SlaveAddress+1);//发送设备地址+读信号

for(i=0;i<6;i++)//连续读取6个地址数据,存储中BUF

{

BUF[i]=ADXL345_RecvByte();//BUF[0]存储0x32地址中的数据

if(i==5)

{

ADXL345_SendACK

(1);//最后一个数据需要回NOACK

}

else

{

ADXL345_SendACK(0);//回应ACK

}

}

ADXL345_Stop();//停止信号

Delay5ms();

}

 

//*****************************************************************

//初始化ADXL345,根据需要请参考pdf进行修改************************

voidInit_ADXL345()

{

Single_Write_ADXL345(0x31,0x0B);//测量范围,正负16g,13位模式

Single_Write_ADXL345(0x2C,0x08);//速率设定为12.5参考pdf13页

Single_Write_ADXL345(0x2D,0x08);//选择电源模式参考pdf24页

Single_Write_ADXL345(0x2E,0x80);//使能DATA_READY中断

Single_Write_ADXL345(0x1E,0x00);//X偏移量根据测试传感器的状态写入pdf29页

Single_Write_ADXL345(0x1F,0x00);//Y偏移量根据测试传感器的状态写入pdf29页

Single_Write_ADXL345(0x20,0x05);//Z偏移量根据测试传感器的状态写入pdf29页

}

//***********************************************************************

//显示x轴

voiddisplay_x()

{floattemp;

dis_data=(BUF[1]<<8)+BUF[0];//合成数据

if(dis_data<0){

dis_data=-dis_data;

DisplayOneChar(2,0,'-');//显示正负符号位

}

elseDisplayOneChar(2,0,'');//显示空格

temp=(float)dis_data*3.9;//计算数据和显示,查考ADXL345快速入门第4页

conversion(temp);//转换出显示需要的数据

DisplayOneChar(0,0,'X');//第0行,第0列显示X

DisplayOneChar(1,0,':

');

DisplayOneChar(3,0,qian);

DisplayOneChar(4,0,'.');

DisplayOneChar(5,0,bai);

DisplayOneChar(6,0,shi);

DisplayOneChar(7,0,'g');

}

//***********************************************************************

//显示y轴

voiddisplay_y()

{floattemp;

dis_data=(BUF[3]<<8)+BUF[2];//合成数据

if(dis_data<0){

dis_data=-dis_data;

DisplayOneChar(2,1,'-');//显示正负符号位

}

elseDisplayOneChar(2,1,'');//显示空格

temp=(float)dis_data*3.9;//计算数据和显示,查考ADXL345快速入门第4页

conversion(temp);//转换出显示需要的数据

DisplayOneChar(0,1,'Y');//第1行,第0列显示y

DisplayOneChar(1,1,':

');

DisplayOneChar(3,1,qian);

DisplayOneChar(4,1,'.');

DisplayOneChar(5,1,bai);

DisplayOneChar(6,1,shi);

DisplayOneChar(7,1,'g');

}

//***********************************************************************

//显示z轴

voiddisplay_z()

{floattemp;

dis_data=(BUF[5]<<8)+BUF[4];//合成数据

if(dis_data<0){

dis_data=-dis_data;

DisplayOneChar(10,1,'-');//显示负符号位

}

elseDisplayOneChar(10,1,'');//显示空格

temp=(float)dis_data*3.9;//计算数据和显示,查考ADXL345快速入门第4页

conversion(temp);//转换出显示需要的数据

/*

DisplayOneChar(10,0,'Z');//第0行,第10列显示Z

DisplayOneChar(11,0,':

');

DisplayOneChar(11,1,qian);

DisplayOneChar(12,1,'.');

DisplayOneChar(13,1,bai);

DisplayOneChar(14,1,shi);

DisplayOneChar(15,1,'g');

*/

}

 

//*********************************************************

//******主程序********

//*********************************************************

voidmain()

{

uchardevid;

floatRoll,Pitch,Q,T,K;

delay(500);//上电延时

InitLcd();//液晶初始化ADXL345

Init_ADXL345();//初始化ADXL345

devid=Single_Read_ADXL345(0X00);//读出的数据为0XE5,表示正确

while

(1)//循环

{

Init_ADXL345();//初始化ADXL345

Multiple_Read_ADXL345();//连续读出数据,存储在BUF中

data_xyz[0]=(BUF[1]<<8)+BUF[0];//合成数据

data_xyz[1]=(BUF[3]<<8)+BUF[2];//合成数据

data_xyz[2]=(BUF[5]<<8)+BUF[4];//合成数据

//分别是加速度X,Y,Z的原始数据,10位的

Q=(float)data_xyz[0]*3.9;

T=(float)data_xyz[1]*3.9;

K=(float)data_xyz[2]*3.9;

Q=-Q;

Roll=(float)(((atan2(K,Q)*180)/3.14159265)+180);//X轴角度值

Pitch=(float)(((atan2(K,T)*180)/3.14159265)+180);//Y轴角度值

conversion(Roll);//转换出显示需要的数据X轴,或者Y轴

DisplayOneChar(9,1,'A');

DisplayOneChar(10,1,':

');

DisplayOneChar(11,1,bai);

DisplayOneChar(12,1,shi);

DisplayOneChar(13,1,ge);

delay(200);//延时

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2