您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 酒店餐饮 > ADXL345三轴角度测量+LCD12864显示程序
附:ADXL345角度测量和LCD12864液晶显示程序AT89S52单片机+11.0592M晶振STC12C5A60S2单片机+12M晶振两种型号单片机本人均亲自测试,绝对能用声明:驱动程序主要是借用别人的,因为网上很多类似的都不能用,本人只是把多个版本稍加整合ADXL345部分#includereg52.h#includeLCD12864.h#includemath.h#includestdio.h#defineSlaveAddress0xA6//定义器件在IIC总线中的从地址,根据ALTADDRESS地址引脚不同修改//ALTADDRESS引脚接地时地址为0xA6,接电源时地址为0x3AsbitSCL=P1^0;//IIC时钟引脚定义sbitSDA=P1^1;//IIC数据引脚定义unsignedcharBUF[8];//接收数据缓存区/******************************延时函数1***************************/voiddelay(unsignedintk){unsignedinti,j;for(i=0;ik;i++){for(j=0;j121;j++){;}}}/******************************延时函数2****************************/voidDelay5us(){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}/*******************************延时5毫秒**************************/voidDelay5ms(){unsignedshortn=560;while(n--);}/******************************起始信号***************************/voidADXL345_Start(){SDA=1;//拉高数据线SCL=1;//拉高时钟线Delay5us();//延时SDA=0;//产生下降沿Delay5us();//延时SCL=0;//拉低时钟线}/******************************停止信号***************************/voidADXL345_Stop(){SDA=0;//拉低数据线SCL=1;//拉高时钟线Delay5us();//延时SDA=1;//产生上升沿Delay5us();//延时}/******************************发送应答信号***********************/voidADXL345_SendACK(bitack){SDA=ack;//写应答信号SCL=1;//拉高时钟线Delay5us();//延时SCL=0;//拉低时钟线Delay5us();//延时}/*******************************接收应答信号**********************/bitADXL345_RecvACK(){SCL=1;//拉高时钟线Delay5us();//延时CY=SDA;//读应答信号SCL=0;//拉低时钟线Delay5us();//延时returnCY;}/************************向IIC总线发送一个字节数据*****************/voidADXL345_SendByte(unsignedchardat){unsignedchari;for(i=0;i8;i++)//8位计数器{dat=1;//移出数据的最高位SDA=CY;//送数据口SCL=1;//拉高时钟线Delay5us();//延时SCL=0;//拉低时钟线Delay5us();//延时}ADXL345_RecvACK();}/************************从IIC总线接收一个字节数据*****************/unsignedcharADXL345_RecvByte(){unsignedchari;unsignedchardat=0;SDA=1;//使能内部上拉,准备读取数据,for(i=0;i8;i++)//8位计数器{dat=1;SCL=1;//拉高时钟线Delay5us();//延时dat|=SDA;//读数据SCL=0;//拉低时钟线Delay5us();//延时}returndat;}/************************************单字节写入**********************/voidSingle_Write_ADXL345(unsignedcharREG_Address,unsignedcharREG_data){ADXL345_Start();//起始信号ADXL345_SendByte(SlaveAddress);//发送设备地址+写信号ADXL345_SendByte(REG_Address);//内部寄存器地址,请参考中文pdf22页ADXL345_SendByte(REG_data);//内部寄存器数据,请参考中文pdf22页ADXL345_Stop();//发送停止信号}/*************************************单字节读取************************/unsignedcharSingle_Read_ADXL345(unsignedcharREG_Address){unsignedcharREG_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();//停止信号returnREG_data;}/****************连续读出ADXL345内部加速度数据,地址范围0x32~0x37***********/voidMultiple_read_ADXL345(){unsignedchari;ADXL345_Start();//起始信号ADXL345_SendByte(SlaveAddress);//发送设备地址+写信号ADXL345_SendByte(0x32);//发送存储单元地址,从0x32开始ADXL345_Start();//起始信号ADXL345_SendByte(SlaveAddress+1);//发送设备地址+读信号for(i=0;i6;i++)//连续读取6个地址数据,存储中BUF{BUF[i]=ADXL345_RecvByte();//BUF[0]存储0x32地址中的数据if(i==5){ADXL345_SendACK(1);//最后一个数据需要回NOACK}else{ADXL345_SendACK(0);//回应ACK}}ADXL345_Stop();//停止信号Delay5ms();}/********************************初始化ADXL345*************************/voidInit_ADXL345(){Single_Write_ADXL345(0x31,0x0B);//测量范围,正负16g,13位模式Single_Write_ADXL345(0x2C,0x08);//速率设定为12.5参考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页}/***********************************显示模版****************************/voiddisplay(){unsignedcharcodestr0[]={X轴:};unsignedcharcodestr1[]={Y轴:};unsignedcharcodestr2[]={Z轴:};LcmInit();LCDwr_string(str0,1,0);LCDwr_string(str1,2,0);LCDwr_string(str2,3,0);}/************************************主函数*****************************/voidmain(){intdata_xyz[3];unsignedchardevid;floatRoll,Pitch,zz,Q,T,K;unsignedcharstr3[4];unsignedcharstr4[4];unsignedcharstr5[4];delay(500);//上电延时LcmInit();Init_ADXL345();display();devid=Single_Read_ADXL345(0X00);//读出的数据为0XE5,表示正确while(1){Init_ADXL345();//初始化ADXL345Multiple_read_ADXL345();//连续读出数据,存储在BUF中data_xyz[0]=(BUF[1]8)+BUF[0];//合成数据data_xyz[1]=(BUF[3]8)+BUF[2];data_xyz[2]=(BUF[5]8)+BUF[4];Q=(float)data_xyz[0]*3.9;//分别是加速度X,Y,Z的原始数据,10位的T=(float)data_xyz[1]*3.9;K=(float)data_xyz[2]*3.9;Roll=(float)(((atan2(K,Q)*180)/3.1416)-90);//X轴角度值Pitch=(float)(((atan2(K,T)*180)/3.1416)-90);//Y轴角度值zz=(float)((atan2(Q,K)*180)/3.1416);//Z轴角度值sprintf(str3,%5.2f,Roll);//转化成字符串类型LCDwr_string(str3,1,4);sprintf(str4,%5.2f,Pitch);LCDwr_string(str4,2,4);sprintf(str5,%5.2f,zz);LCDwr_string(str5,3,4);delay(400);//延时,如果单片机处理速度较快把延迟时间适当延长}}LCD12864部分#includereg52.h#includeintrins.h#includestdio.h#definelcd_dataP0//数据口sbitRS=P2^3;//选择寄存器(并行)0:指令寄存器1:数据寄存器;sbitRW=P2^4;//读写控制脚(并行)0:写入1:读出sbitE=P2^5;//读写数据启始脚(并行)sbitPSB=P2^6;//串并方式选择引脚,0为串行模式,1为8/4位数据口模式sbitRST=P2^7;/
本文标题:ADXL345三轴角度测量+LCD12864显示程序
链接地址:https://www.777doc.com/doc-3150541 .html