您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > ADXL345角度传感器测二维角度Keil-C程序
程序说明:该程序中有两个C文件,均为同一Keil或TKstudio工程下的C源文件,分别为ADXL345_main和ADXL345_LCD,此程序在KeiluVision2或TKstudioversion4.5编译环境下均可正常运行,ADXL345-0Error(s),0Warning(s).项目说明:采用全集成的三轴加速度传感器ADXL345进行二维倾角的测量,用1602液晶(LCD省去了测忙函数)显示角度值,其值精确到小数点后两位。ADXL345_main.c文件:/**********************头文件*************************/#includereg51.h#includemath.h#includeintrins.h/***********************宏定义***********************/#defineucharunsignedchar#defineuintunsignedint/**********************位定义************************/sbitCS=P2^1;//片选信号端sbitSCLK=P3^1;//时钟sbitSDI=P3^0;//数据读/写/***********************函数声明**********************///voidwrite_comd(uchar);//voidwrite_data_LCD(uchar);voidLCD_init();//LCD初始化voiddisplay_LCD();//LCD显示voidcalculate();//ASCII码计算/***********************全局变量**********************/uintData_X_2[2];//读出的数据储存XYZuintData_Y_2[2];uintData_Z_2[2];intData_X,Data_Y,Data_Z;//数值转换后的值floatXX,YY,ZZ;//3轴的重力加速度分量ucharID;//机器ID值用于看读的是否对(调试时用)floatroll,pitch;/***********************************************************************函数名:Delayms()**功能描述:产生延迟**形参:ms延迟的时间,单位ms**返回值:无**局部变量:i**全局变量:无**函数调用:无***********************************************************************/voiddelay_ms(ucharms){uchari;while(ms--){for(i=0;i250;i++){_nop_();_nop_();//空执行消耗CPU时间达到等待的效果_nop_();_nop_();}}}/***********************************************************************函数名:Write_Data(ucharData_write)**功能描述:写指令到寄存器**形参:Data_write要写的数据8位**返回值:无**局部变量:i**全局变量:无**函数调用:_nop_();***********************************************************************//*************************写数据函数*******************/voidWrite_Data(ucharAdress_Reg,ucharData_write){uchari=0;Adress_Reg=(Adress_Reg&0x7f);//置最高位位0写状态Adress_Reg=(Adress_Reg&0xbf);//置第二高位0单字节读写CS=0;_nop_();SCLK=1;_nop_();for(i=0;i8;i++)//8位串行输出寄存器地址值{SCLK=0;_nop_();SDI=(bit)(Adress_Reg&0x80);_nop_();_nop_();_nop_();SCLK=1;_nop_();_nop_();Adress_Reg=1;}for(i=0;i8;i++)//8位串行输出指令值{SCLK=0;_nop_();SDI=(bit)(Data_write&0x80);_nop_();_nop_();_nop_();SCLK=1;_nop_();_nop_();Data_write=1;}_nop_();_nop_();SCLK=1;_nop_();_nop_();SDI=1;CS=1;}/***********************************************************************函数名:Read_Data_Reg(ucharAdress_Reg)**功能描述:往寄存器读数据**形参:Adress_Reg寄存器地址**返回值:Data_Read读取的数据**局部变量:iData_Read读取的数据**全局变量:无**函数调用:_nop_();***********************************************************************/ucharRead_Data_Reg(ucharAdress_Reg){uchari=0;ucharData_Read;Adress_Reg=(Adress_Reg|0x80);//置最高位为1,读状态Adress_Reg=(Adress_Reg&0xbf);//置第二高位位0,单字节读写CS=0;_nop_();_nop_();SCLK=1;_nop_();_nop_();for(i=0;i8;i++)//8位串行输出寄存器地址值{SCLK=0;_nop_();SDI=(bit)(Adress_Reg&0x80);_nop_();_nop_();_nop_();SCLK=1;_nop_();_nop_();Adress_Reg=1;}for(i=0;i8;i++)//8位串行读入数据(8位){SCLK=0;Data_Read=1;_nop_();Data_Read|=(uchar)SDI;_nop_();_nop_();SCLK=1;_nop_();_nop_();}for(i=0;i8;i++)//产生8个脉冲(手册要求,目的不知道){SCLK=0;_nop_();_nop_();SCLK=1;_nop_();_nop_();}_nop_();_nop_();SCLK=1;_nop_();CS=1;returnData_Read;}/***********************************************************************函数名:Read_Data()**功能描述:读出6字节XYZ轴各两字节的数据**形参:无**返回值:无**局部变量:无**全局变量:Data_X_2[2]Data_Y_2[2]Data_Z_2[2]存放读出值**函数调用:Read_Data_Reg(__);delay_ms(__);***********************************************************************/voidRead_Data(){/*DATAX0是X轴加速度的低字节寄存器,DATAX1是高字节寄存器*/Data_X_2[0]=Read_Data_Reg(0x32);//读出X轴低位Data_X_2[1]=Read_Data_Reg(0x33);//读出X轴高位delay_ms(10);Data_Y_2[0]=Read_Data_Reg(0x34);//读出Y轴低位Data_Y_2[1]=Read_Data_Reg(0x35);//读出Y轴高位delay_ms(10);Data_Z_2[0]=Read_Data_Reg(0x36);//读出Z轴低位Data_Z_2[1]=Read_Data_Reg(0x37);//读出Z轴高位}/***********************************************************************函数名:ADXL345_init()**功能描述:ADXL345初始化对寄存器写指令**形参:无**返回值:无**局部变量:无**全局变量:无**函数调用:Write_Data_Reg(__,__);***********************************************************************/voidADXL345_init(){Write_Data(0x31,0x4f);//测量范围为正负16g13位模式3线SPI中断低有效禁用自测力左对齐(MSB)模式delay_ms(10);Write_Data(0x2C,0x08);//速率设定为25HZ,带宽12.5HZdelay_ms(10);Write_Data(0x2D,0x08);//选择电源模式delay_ms(10);Write_Data(0x2E,0x80);//使能DATA_READY中断delay_ms(10);Write_Data(0x2f,0x00);//中断功能设定,不使用中断delay_ms(10);/*Write_Data(0x1E,0x00);//X偏移量根据测试传感器的delay_ms(10);Write_Data(0x1F,0x00);//Y偏移量根据测试传感器的delay_ms(10);Write_Data(0x20,0x00);//Z偏移量根据测试传感器的delay_ms(10);Write_Data(0x21,0x00);//敲击延时0:禁用;(1.25ms/LSB)delay_ms(10);Write_Data(0x22,0x00);//检测第一次敲击后的延时0:禁用;(1.25ms/LSB)delay_ms(10);Write_Data(0x23,0x00);//敲击窗口0:禁用;(1.25ms/LSB)delay_ms(10);Write_Data(0x24,0x00);//保存检测活动阀值;(62.5mg/LSB)delay_ms(10);Write_Data(0x25,0x00);//保存检测静止阀值;(62.5mg/LSB)delay_ms(10);Write_Data(0x26,0x2b);//检测活动时间阀值;(1s/LSB)delay_ms(10);Write_Data(0x27,0x00);//活动静止检测禁止delay_ms(10);Write_Data(0x28,0x09);//保存检测活动阀值;(62.5mg/LSB)delay_ms(10);Write_Data(0x29,0xff);//保存检测静止阀值;(62.5mg/LSB)delay_ms(10);Write_Data(0x2a,0x80);delay_ms(10);*/}/***********************************************************************函数名:transform(void)**功能描述:数值整合和转换,并转换为加速度放大1000倍**形参:无**返回值:无**局部变量:无**全局变量:Data_X=0,Data_Y=0,Data_Z整合后的XYZ轴值**函数调用:无****************************************************
本文标题:ADXL345角度传感器测二维角度Keil-C程序
链接地址:https://www.777doc.com/doc-5557513 .html