资讯详情

ADXL345单片机计步器程序

#include

#include

#include"1602.h"

#include

#define SlaveAddress 0xA6 //1010 0110 定义器件在IIC从地址到总线,根据ALTADDRESS地址引脚不同修改

//ALTADDRESS引脚接地时地址为0xA6.接电源时地址为0x3A 0011 1010

sbit sclk=P0^0;

sbit sda=P0^1;

floatdis_datax,dis_datay,dis_dataz,acc,acc1=1000;

uchar BUF[8];

uchar wan, qian, bai, shi ,ge,flag,miao,miao1,n;

uint count;

void conversion(uint temp_data)

{

wan=temp_data/10000 0x30 ;

temp_data=temp_data000; ///取余运算

qian=temp_data/1000 0x30 ;

temp_data=temp_data00; ///取余运算

bai=temp_data/100 0x30 ;

temp_data=temp_data0; ///取余运算 -e----------------eee-e

shi=temp_data/10 0x30 ;

temp_data=temp_data; ///取余运算

ge=temp_data 0x30;

}

void delay6us() //6us延时函数

{

_nop_(); _nop_();

}

void delay_ms(uint n) //N ms延时函数

{

uint x,y;

for(x=n;x>0;x--)

for(y=110;y>0;y--);

}

/

void ADXL345_Start()

{

sda = 1; ///提高数据线

sclk = 1; //提高时钟线

delay6us(); //延时

sda = 0; //产生下降边

delay6us(); //延时

sclk = 0; //拉低时钟线

}

void ADXL345_Stop()

{

sda = 0; ///拉低数据线

sclk = 1; //提高时钟线

delay6us(); //延时

sda = 1; //产生上升沿

delay6us(); //延时

}

void ADXL345_SendACK(bit ack)

{

sda = ack; //写响应信号

sclk = 1; //提高时钟线

delay6us(); //延时

sclk = 0; //拉低时钟线

delay6us(); //延时

}

bit ADXL345_RecvACK()

{

sclk = 1; //提高时钟线

delay6us(); //延时

CY = sda; //阅读响应信号

sclk = 0; //拉低时钟线

delay6us(); //延时

return CY;

}

void ADXL345_SendByte(uchar dat)

{

uchar i;

// sclk = 0; //拉低时钟线

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

{

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

sda = CY; /p

sclk = 1;                //拉高时钟线

delay6us();             //延时

sclk = 0;                //拉低时钟线

delay6us();             //延时

}

ADXL345_RecvACK();

}

uchar ADXL345_RecvByte()

{

uchar i;

uchar dat = 0;

sda = 1;

//        write_com(0x80);

//使能内部上拉,准备读取数据,

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

{

dat <<= 1;

sclk = 1;                //拉高时钟线

delay6us();             //延时

dat |= sda;             //读数据

sclk = 0;                //拉低时钟线

delay6us();             //延时

}

return dat;

}

void Single_Write_ADXL345(uchar REG_Address,uchar REG_data)

{

ADXL345_Start();                  //起始信号

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

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

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

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

}

uchar Single_Read_ADXL345(uchar REG_Address)

{

uchar REG_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();                           //停止信号

return REG_data;

}

void Multiple_read_ADXL345()

{

uchar i;

ADXL345_Start();                          //起始信号

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

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

ADXL345_Start();                          //起始信号

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

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();                          //停止信号

delay_ms(10);

}

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

{

//        delay(500);                                          //上电延时

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

Single_Write_ADXL345(0x2C,0x06);   //0000 0110速率设定为6.25 参考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页

}

float operation(uchar starti)

{

float  dis_data        ;

int temp;

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

//        write_com(0x80);

if(temp<0)

{

temp=-temp;

flag=1;

}

else flag=0; //显示空格

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

return dis_data;

}

void display_x()         //显示x轴

{

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

write_com(0x80);

if(flag==0)        write_dat(' ');

else write_dat('-');

write_dat('X');

write_dat(':');

write_dat(qian);

write_dat('.');

write_dat(bai);

write_dat(shi);

write_dat('g');

}

void display_y()        //显示y轴

{

// dis_datay=operation(2);

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

write_com(0x80+8);

if(flag==0)         write_dat(' ');

else write_dat('-');

write_dat('Y');

write_dat(':');

write_dat(qian);

write_dat('.');

write_dat(bai);

write_dat(shi);

write_dat('g');

}

void display_z()           //显示z轴

{

//  dis_dataz=operation(4);

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

write_com(0x80+0x40);

if(flag==0)                  write_dat(' ');

else write_dat('-');

write_dat('Z');

write_dat(':');

write_dat(qian);

write_dat('.');

write_dat(bai);

write_dat(shi);

write_dat('g');

}

void countstep()

{

dis_datax=operation(0);

dis_datay=operation(2);

dis_dataz=operation(4);

acc1=acc;

acc=sqrt(dis_dataz*dis_dataz+dis_datax*dis_datax+dis_datay*dis_datay)  ;

if(acc1<990&&acc>1010)

//        if(fabs(acc-acc1)>140&&miao1!=miao)

{

//        miao1=miao;

count++;

}

write_com(0x80);

conversion(acc);

write_dat('A');

write_dat(':');

write_dat(qian);

write_dat('.');

write_dat(bai);

write_dat(shi);

write_dat('g');

write_com(0x80+0x40);

write_dat('C');

write_dat('o');

write_dat('u');

write_dat('n');

write_dat('t');

write_dat(':');

write_dat(count/100+0x30);

write_dat((count%100)/10+0x30);

write_dat(count%10+0x30);

}

void ADXL345_Measure()                         //测量角度值并显示

{

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

//        display_x();                 //---------显示X轴

//        display_y();                 //---------显示Y轴

//        display_z();                 //---------显示Z轴

countstep();

}

void main()

{

init();

Init_ADXL345();

while(1)

{

ADXL345_Measure();

}

}

标签: 连接器345

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台