角度传感器ADXL345程序代码AVR.docx
- 文档编号:9713175
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:18
- 大小:16.25KB
角度传感器ADXL345程序代码AVR.docx
《角度传感器ADXL345程序代码AVR.docx》由会员分享,可在线阅读,更多相关《角度传感器ADXL345程序代码AVR.docx(18页珍藏版)》请在冰豆网上搜索。
角度传感器ADXL345程序代码AVR
/**************************************************
**********角度传感器ADXL345程序代码**************
**************************************************/
#include
#include
#include
#include
typedefunsignedcharuchar;
typedefunsignedintuint;
/*LCD引脚定义*/
#defineCS_setPORTD|=BIT(6)
#defineCS_clrPORTD&=~BIT(6)
#defineSID_setPORTD|=BIT(7)
#defineSID_clrPORTD&=~BIT(7)
#defineSCLK_setPORTB|=BIT(0)
#defineSCLK_clrPORTB&=~BIT(0)
/*ADXL345角度传感器端口定义*/
#defineSDA_setPORTC|=(1<<4)
#defineSDA_clrPORTC&=~(1<<4)
#defineSDA_inDDRC&=~(1<<4)
#defineSDA_outDDRC|=(1<<4)
#defineSDA_RPINC&(1<<4)
#defineSCL_setPORTC|=(1<<5)
#defineSCL_clrPORTC&=~(1<<5)
#defineSCL_outDDRC|=(1<<5)
#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_clr;
SCLK_set;
Order<<=1;
}
Order=COM;
Order&=0xf0;
for(i=0;i<8;i++)
{
if(Order&0x80)
SID_set;
else
SID_clr;
SCLK_clr;
SCLK_set;
Order<<=1;
}
Order=COM;
Order<<=4;
for(i=0;i<8;i++)
{
if(Order&0x80)
SID_set;
else
SID_clr;
SCLK_clr;
SCLK_clr;
SCLK_set;
Order<<=1;
}
CS_clr;
Delay(20);
}
/*LCD12232写数据*/
voidSend_DATA(ucharData)
{
uchari,Order;
CS_clr;
Order=0xfa;
SCLK_clr;
CS_set;
for(i=0;i<8;i++)
{
if(Order&0x80)
SID_set;
else
SID_clr;
SCLK_clr;
SCLK_set;
Order<<=1;
}
Order=Data;
Order&=0xf0;
for(i=0;i<8;i++)
{
if(Order&0x80)
SID_set;
else
SID_clr;
SCLK_clr;
SCLK_set;
Order<<=1;
}
Order=Data;
Order<<=4;
for(i=0;i<8;i++)
{
if(Order&0x80)
SID_set;
else
SID_clr;
SCLK_clr;
SCLK_set;
Order<<=1;
}
CS_clr;
Delay(20);
}
/*显示一字符串*/
voidDis_str(ucharAddr,uchar*str)
{
Send_COM(Addr);
Delay(100);
while(*str!
='\0')
{
Send_DATA(*str);
str++;
Delay(20);
}
}
/*LCD12232初始化*/
voidInit_LCD(void)
{
Delay(2000);
Send_COM(0x06);
Delay(200);
Send_COM(0x02);
Delay(200);
Send_COM(0x0c);
Delay(200);
Send_COM(0x80);
Delay(200);
Send_COM(0x30);
Delay(200);
Send_COM(0x01);
Delay(2000);
}
/*写引脚设置*/
voidPORT_Write_Init(void)
{
DDRC|=BIT(4);
PORTC|=BIT(4);
DDRC|=BIT(5);
PORTC|=BIT(5);
}
/*读引脚设置*/
voidPORT_Read_Init(void)
{
DDRC&=~BIT(4);
PORTC|=BIT(4);
DDRC&=~BIT(5);
PORTC|=BIT(5);
}
/***************************************************
****************************************************
**********ADXL345角度传感器函数部分***************
****************************************************
****************************************************/
/*起始信号*/
voidIIC_Start(void)
{
SDA_out;
SDA_set;
SCL_set;
Delay(30);
SDA_clr;
Delay(30);
SCL_clr;
}
/*停止信号*/
voidIIC_Stop(void)
{
SDA_out;
SDA_clr;
SCL_set;
Delay(30);
SDA_set;
Delay(30);
}
/*发送应答信号*/
voidIIC_Send_Ack(void)
{
SDA_out;
SDA_clr;
SCL_set;
Delay(30);
SCL_clr;
Delay(30);
}
/*发送非应答信号*/
voidIIC_Send_NoAck(void)
{
SDA_out;
SDA_set;
SCL_set;
Delay(30);
SCL_clr;
Delay(30);
}
/*接收应答信号*/
ucharIIC_Recv_Ack(void)
{
uchari;
SDA_in;
SCL_set;
Delay(30);
i=SDA_R;
SCL_clr;
Delay(30);
returni?
1:
0;
}
/*IIC总线发送一个字节数据*/
voidIIC_Send_Byte(uchardata)
{
uchari;
SDA_out;
for(i=0;i<8;i++)
{
if(data&0x80)
SDA_set;
else
SDA_clr;
SCL_set;
Delay(30);
SCL_clr;
Delay(30);
data<<=1;
}
IIC_Recv_Ack();
}
/*IIC总线接收一个字节数据*/
ucharIIC_Recv_Byte(void)
{
uchari;
ucharvalue=0;
SDA_in;
SDA_set;
for(i=0;i<8;i++)
{
value<<=1;
SCL_set;
Delay(30);
if(SDA_R)
value|=0x01;
SCL_clr;
Delay(30);
}
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_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();
returnResult;
}
/*连续读出ADXL345内部加速度数据,地址范围0x32~0x37*/
voidMultiple_Read_ADX345(void)
{
uchari;
IIC_Start();
IIC_Send_Byte(SlaveAddress);
IIC_Send_Byte(0x32);
IIC_Start();
IIC_Send_Byte(SlaveAddress+1);
for(i=0;i<6;i++)
{
Re_data[i]=IIC_Recv_Byte();
if(i==5)
IIC_Send_NoAck();
else
IIC_Send_Ack();
}
IIC_Stop();
Delay(100);
}
/*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('-');
}
else
{
Send_DATA('+');
}
Temp=(float)Dis_data*3.9;
Temp_x=Temp;
}
/*Y轴*/
voidDisplay_Y(void)
{
floatTemp;
Dis_data=(Re_data[3]<<8)+Re_data[2];
Send_COM(0x84);
if(Dis_data<0)
{
Dis_data=-Dis_data;
Send_DATA('-');
}
else
{
Send_DATA('+');
}
Temp=(float)Dis_data*3.9;
Temp_y=Temp;
}
/*Z轴*/
voidDisplay_Z(void)
{
floatTemp;
Dis_data=(Re_data[5]<<8)+Re_data[4];
Send_COM(0x91);
if(Dis_data<0)
{
Dis_data=-Dis_data;
Send_DATA('-');
}
else
{
Send_DATA('+');
}
Temp=(float)Dis_data*3.9;
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;
break;
case2:
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=(uchar)Angle;
Abai=(unsignedchar)AG/100+0x30;
Ashi=(unsignedchar)AG%100/10+0x30;
Age=(unsignedchar)AG%10+0x30;
switch(C)
{
case0:
Send_COM(0x82);break;
case1:
Send_COM(0x85);break;
case2:
Send_COM(0x92);break;
default:
break;
}
Send_DATA(Abai);
Send_DATA(Ashi);
Send_DATA(Age);
}
/*主程序*/
voidmain(void)
{
ucharDevid;
Delay(50000);
SDA_out;
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轴
Delay(60000);
Display
(1);//---------显示Y轴
Delay(60000);
Display
(2);//---------显示Z轴
Delay(60000);
}
while
(1);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 角度 传感器 ADXL345 程序代码 AVR
![提示](https://static.bdocx.com/images/bang_tan.gif)