角度传感器ADXL345程序代码AVRWord下载.docx
《角度传感器ADXL345程序代码AVRWord下载.docx》由会员分享,可在线阅读,更多相关《角度传感器ADXL345程序代码AVRWord下载.docx(18页珍藏版)》请在冰点文库上搜索。
#defineSDA_inDDRC&
#defineSDA_outDDRC|=(1<
#defineSDA_RPINC&
(1<
#defineSCL_setPORTC|=(1<
5)
#defineSCL_clrPORTC&
#defineSCL_outDDRC|=(1<
#defineSlaveAddress0xA6//器件地址
ucharRe_data[6];
intDis_data;
floatTemp_x,Temp_y,Temp_z;
floatAngle;
/*延时*/
voidDelay(uintt)
{
while(t--)
{}
}
/*LCD12232端口初始化*/
voidPORT_Init(void)
DDRD|=BIT(6);
PORTD|=BIT(6);
DDRD|=BIT(7);
PORTD|=BIT(7);
DDRB|=BIT(0);
PORTB|=BIT(0);
/*LCD12232写指令*/
voidSend_COM(ucharCOM)
uchari,Order;
CS_clr;
Order=0xf8;
SCLK_clr;
CS_set;
for(i=0;
i<
8;
i++)
{
if(Order&
0x80)
SID_set;
else
SID_clr;
SCLK_set;
Order<
=1;
}
Order=COM;
Order&
=0xf0;
=4;
Delay(20);
/*LCD12232写数据*/
voidSend_DATA(ucharData)
Order=0xfa;
Order=Data;
/*显示一字符串*/
voidDis_str(ucharAddr,uchar*str)
Send_COM(Addr);
Delay(100);
while(*str!
='
\0'
)
Send_DATA(*str);
str++;
/*LCD12232初始化*/
voidInit_LCD(void)
Delay(2000);
Send_COM(0x06);
Delay(200);
Send_COM(0x02);
Send_COM(0x0c);
Send_COM(0x80);
Send_COM(0x30);
Send_COM(0x01);
/*写引脚设置*/
voidPORT_Write_Init(void)
DDRC|=BIT(4);
PORTC|=BIT(4);
DDRC|=BIT(5);
PORTC|=BIT(5);
/*读引脚设置*/
voidPORT_Read_Init(void)
DDRC&
=~BIT(4);
=~BIT(5);
/***************************************************
****************************************************
**********ADXL345角度传感器函数部分***************
****************************************************/
/*起始信号*/
voidIIC_Start(void)
SDA_out;
SDA_set;
SCL_set;
Delay(30);
SDA_clr;
SCL_clr;
/*停止信号*/
voidIIC_Stop(void)
/*发送应答信号*/
voidIIC_Send_Ack(void)
/*发送非应答信号*/
voidIIC_Send_NoAck(void)
/*接收应答信号*/
ucharIIC_Recv_Ack(void)
uchari;
SDA_in;
i=SDA_R;
returni?
1:
0;
/*IIC总线发送一个字节数据*/
voidIIC_Send_Byte(uchardata)
if(data&
data<
IIC_Recv_Ack();
/*IIC总线接收一个字节数据*/
ucharIIC_Recv_Byte(void)
ucharvalue=0;
value<
if(SDA_R)
value|=0x01;
returnvalue;
/*向ADXL345写入一个字节*/
voidADX345_Write_Byte(ucharAddr,ucharData)
IIC_Start();
IIC_Send_Byte(SlaveAddress);
IIC_Send_Byte(Addr);
IIC_Send_Byte(Data);
IIC_Stop();
/*向ADXL345读出一个字节*/
ucharADX345_Read_Byte(ucharAdd)
ucharResult;
IIC_Send_Byte(Add);
IIC_Send_Byte(SlaveAddress+1);
Result=IIC_Recv_Byte();
IIC_Send_NoAck();
returnResult;
/*连续读出ADXL345内部加速度数据,地址范围0x32~0x37*/
voidMultiple_Read_ADX345(void)
{
IIC_Send_Byte(0x32);
6;
Re_data[i]=IIC_Recv_Byte();
if(i==5)
IIC_Send_Ack();
/*ADXL345初始化*/
voidInit_ADX345(void)
ADX345_Write_Byte(0x31,0x0b);
ADX345_Write_Byte(0x2c,0x08);
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);
/*X轴*/
voidDisplay_X(void)
floatTemp;
Dis_data=(Re_data[1]<
8)+Re_data[0];
Send_COM(0x81);
if(Dis_data<
0)
Dis_data=-Dis_data;
Send_DATA('
-'
);
+'
Temp=(float)Dis_data*3.9;
Temp_x=Temp;
/*Y轴*/
voidDisplay_Y(void)
Dis_data=(Re_data[3]<
8)+Re_data[2];
Send_COM(0x84);
Temp_y=Temp;
/*Z轴*/
voidDisplay_Z(void)
Dis_data=(Re_data[5]<
8)+Re_data[4];
Send_COM(0x91);
Temp_z=Temp;
/*显示X、Y、Z轴*/
voidDisplay(ucharC)
floata,b,Tem;
ucharAbai,Ashi,Age,AG;
switch(C)
case0:
a=Temp_y*Temp_y+Temp_z*Temp_z;
//X轴
Tem=Temp_x;
break;
case1:
a=Temp_x*Temp_x+Temp_z*Temp_z;
//Y轴
Tem=Temp_y;
case2:
a=Temp_x*Temp_x+Temp_y*Temp_y;
//Z轴
Tem=Temp_z;
default:
break;
b=sqrt(a);
Angle=atan(b/Tem)*57.29;
//180/3.1416=57.29
AG=(uchar)Angle;
Abai=(unsignedchar)AG/100+0x30;
Ashi=(unsignedchar)AG%100/10+0x30;
Age=(unsignedchar)AG%10+0x30;
Send_COM(0x82);
Send_COM(0x85);
Send_COM(0x92);
Send_DATA(Abai);
Send_DATA(Ashi);
Send_DATA(Age);
/*主程序*/
voidmain(void)
ucharDevid;
Delay(50000);
SCL_out;
PORT_Init();
//LCD引脚初始化
Init_LCD();
//液晶初始化
//Dis_str(0x80,"
ADXL345:
"
Init_ADX345();
//初始化ADXL345
Devid=ADX345_Read_Byte(0x00);
//读出的数据为0xe5,表示正确
do
Multiple_Read_ADX345();
//连续读出数据,存储在BUF中
Display_X();
Display_Y();
Display_Z();
Delay(60000);
Display(0);
//---------显示X轴
Display
(1);
//---------显示Y轴
Display
(2);
//---------显示Z轴
while
(1);