#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();
}
}