#include <iom128v.h>
#include <macros.h>
#include"1602.h"
#include"delay8M.h"
#define uchar unsigned char
#define uint unsigned int
#define SDA_set PORTC |=BIT(0)
#define SDA_clr PORTC &=~BIT(0)
#define SDA_in DDRC &=~BIT(0)
#define SDA_out DDRC |=BIT(0)
#define SDA_R PINC & BIT(0)
#define SCL_set PORTC |=BIT(1)
#define SCL_clr PORTC &=~BIT(1)
#define SCL_out DDRC |=BIT(1)
#define SlaveAddress 0xA6 //器件地址
unsigned char acc_databuf[6];
signed int acc_x=0,acc_y=0,acc_z=0;
signed char acc_x_flag=0,acc_y_flag=0,acc_z_flag=0;
float Temp_x,Temp_y,Temp_z;
float Angle;
/*起始信号*/
void IIC_Start(void)
{
SDA_out;
SDA_set;
SCL_set;
delay_nus(5);
SDA_clr;
delay_nus(5);
SCL_clr;
}
/*停止信号*/
void IIC_Stop(void)
{
SDA_out;
SDA_clr;
SCL_set;
delay_nus(5);
SDA_set;
delay_nus(5);
}
/*发送应答信号*/
void IIC_Send_Ack(void)
{
SDA_out;
SDA_clr;
SCL_set;
delay_nus(5);
SCL_clr;
delay_nus(5);
}
/*发送非应答信号*/
void IIC_Send_NoAck(void)
{
SDA_out;
SDA_set;
SCL_set;
delay_nus(5);
SCL_clr;
delay_nus(5);
}
/*接收应答信号*/
void IIC_Recv_Ack(void)
{
//unsigned char i=0;
SDA_in;
SCL_set;
delay_nus(5);
//i=SDA_R;
SCL_clr;
delay_nus(5);
//return i;
}
/*IIC总线发送一个字节数据*/
void IIC_Send_Byte(unsigned char data)
{
unsigned char i=0;
SDA_out;
for(i=0;i<8;i++)
{
if(data&0x80)
SDA_set;
else
SDA_clr;
SCL_set;
delay_nus(5);
SCL_clr;
delay_nus(5);
data<<=1;
}
IIC_Recv_Ack();
}
/*IIC总线接收一个字节数据*/
unsigned char IIC_Recv_Byte(void)
{
unsigned char i;
unsigned char value=0;
SDA_set;
SDA_in;
for(i=0;i<8;i++)
{
value<<=1;
SCL_set;
delay_nus(5);
if(SDA_R)
value |=0x01;
SCL_clr;
delay_nus(5);
}
return value;
}
/*向ADXL345写入一个字节*/
void ADX345_Write_Byte(uchar Addr,uchar Data)
{
IIC_Start();
IIC_Send_Byte(SlaveAddress);
IIC_Send_Byte(Addr);
IIC_Send_Byte(Data);
IIC_Stop();
}
/*向ADXL345读出一个字节*/
unsigned char ADX345_Read_Byte(uchar Add)
{
unsigned char Result=0;
IIC_Start();
IIC_Send_Byte(SlaveAddress);
IIC_Send_Byte(Add);
IIC_Start();
IIC_Send_Byte(SlaveAddress+1);
Result=IIC_Recv_Byte();
IIC_Send_NoAck();
IIC_Stop();
return Result;
}
/*连续读出ADXL345内部加速度数据,地址范围0x32~0x37*/
void Multiple_Read_ADX345(void)
{
unsigned char i=0;
IIC_Start();
IIC_Send_Byte(SlaveAddress);
IIC_Send_Byte(0x32);
IIC_Start();
IIC_Send_Byte(SlaveAddress+1);
for(i=0;i<6;i++)
{
acc_databuf[i]=IIC_Recv_Byte();
if(i==5)
IIC_Send_NoAck();
else
IIC_Send_Ack();
}
IIC_Stop();
//delay_nms(5);
}
/*ADXL345初始化*/
void Init_ADX345(void)
{
unsigned char Devid=0;
SDA_out;
SCL_out;
//ADX345_Write_Byte(0x31,0x08);//
ADX345_Write_Byte(0x31,0x0b);
//ADX345_Write_Byte(0x2c,0x0A);//速率设定为12.5 参考pdf13页
ADX345_Write_Byte(0x2d,0x08);
ADX345_Write_Byte(0x2e,0x80);
//ADX345_Write_Byte(0x1e,0x00);
//ADX345_Write_Byte(0x1f,0x00);
//ADX345_Write_Byte(0x20,0x05);
Devid=ADX345_Read_Byte(0x00);//读出的数据为0xe5,表示正确
while(Devid!=0xe5);
}
/*X轴*/
void Display_X(void)
{
float Temp;
acc_x=(acc_databuf[1]<<8)+acc_databuf[0];
if(acc_x<0)
{
acc_x=-acc_x;
acc_x_flag=-1;
lcddisplaychar(1,'-');
}
else
{
acc_x_flag=1;
lcddisplaychar(1,'+');
}
//Temp=(float)Dis_data*3.9;
//Temp_x=Temp;
}
/*Y轴*/
void Display_Y(void)
{
//float Temp;
acc_y=(acc_databuf[3]<<8)+acc_databuf[2];
if(acc_y<0)
{
acc_y=-acc_y;
acc_y_flag=-1;
lcddisplaychar(6,'-');
}
else
{
acc_y_flag=1;
lcddisplaychar(6,'+');
}
//Temp=(float)Dis_data*3.9;
//Temp_y=Temp;
}
/*Z轴*/
void Display_Z(void)
{
acc_z=(acc_databuf[5]<<8)+acc_databuf[4];
if(acc_z<0)
{
acc_z=-acc_z;
acc_z_flag=-1;
lcddisplaychar(11,'-');
}
else
{
acc_z_flag=1;
lcddisplaychar(11,'+');
}
//Temp=(float)Dis_data*3.9;
//Temp_z=Temp;
}
/*显示X、Y、Z轴*/
/*
void Display(uchar C)
{
float a,b,Tem;
uchar Abai,Ashi,Age,AG;
switch(C)
{
case 0 : a=Temp_y*Temp_y+Temp_z*Temp_z; //X轴
Tem=Temp_x;
break;
case 1 : a=Temp_x*Temp_x+Temp_z*Temp_z; //Y轴
Tem=Temp_y;
break;
case 2 : a=Temp_x*Temp_x+Temp_y*Temp_y; //Z轴
Tem=Temp_z;
break;
default : break;
}
b=sqrt(a);
Angle=atan(b/Tem)*57.29;// 180/3.1416=57.29
AG=(unsigned char)Angle;
Abai=(unsigned char)AG/100+0x30;
Ashi=(unsigned char)AG%100/10+0x30;
Age=(unsigned char)AG%10+0x30;
switch(C)
{
case 0 : Send_COM(0x82); break;
case 1 : Send_COM(0x85); break;
case 2 : Send_COM(0x92); break;
default : break;
}
Send_DATA(Abai);
Send_DATA(Ashi);
Send_DATA(Age);
}
*/
/*主程序*/
void main(void)
{
lcdinit();
Init_ADX345();//初始化ADXL345
while(1)
{
Multiple_Read_ADX345();//连续读出数据,存储在BUF中
Display_X();
Display_Y();
Display_Z();
delay_nms(60);
lcddisplay(2,acc_x); //---------显示X轴
delay_nms(60);
lcddisplay(7,acc_y);
delay_nms(60);
lcddisplay(12,acc_z);
//Delay(60000);
//Display(1); //---------显示Y轴
//Delay(60000);
//Display(2); //---------显示Z轴
//Delay(60000);
}
}