ADXL345加速度传感器参考程序1602显示.docx
- 文档编号:8004944
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:13
- 大小:17.23KB
ADXL345加速度传感器参考程序1602显示.docx
《ADXL345加速度传感器参考程序1602显示.docx》由会员分享,可在线阅读,更多相关《ADXL345加速度传感器参考程序1602显示.docx(13页珍藏版)》请在冰豆网上搜索。
ADXL345加速度传感器参考程序1602显示
#include
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineDataPortP0//LCD1602数据端口
#defineSlaveAddress0xA6//定义器件在IIC总线中的从地址,根据ALTADDRESS地址引脚不同修改
//ALTADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A
sbitSCL=P1^0;
sbitSDA=P1^1;
sbitLCM_RS=P2^4;
sbitLCM_RW=P2^5;
sbitLCM_EN=P2^6;
typedefunsignedcharBYTE;
typedefunsignedshortWORD;
BYTEBUF[8];//接收数据缓存区
ucharge,shi,bai,qian,wan;//显示变量
intdis_data;//变量
voiddelay(unsignedintk);
voidInitLcd();//初始化lcd1602
voidInit_ADXL345(void);//初始化ADXL345
voidWriteDataLCM(uchardataW);
voidWriteCommandLCM(ucharCMD,ucharAttribc);
voidDisplayOneChar(ucharX,ucharY,ucharDData);
voidconversion(uinttemp_data);
voidSingle_Write_ADXL345(ucharREG_Address,ucharREG_data);//单个写入数据
ucharSingle_Read_ADXL345(ucharREG_Address);//单个读取内部寄存器数据
voidMultiple_Read_ADXL345();//连续的读取内部寄存器数据
//------------------------------------
voidDelay5us();
voidDelay5ms();
voidADXL345_Start();
voidADXL345_Stop();
voidADXL345_SendACK(bitack);
bitADXL345_RecvACK();
voidADXL345_SendByte(BYTEdat);
BYTEADXL345_RecvByte();
voidADXL345_ReadPage();
voidADXL345_WritePage();
//-----------------------------------
//*********************************************************
voidconversion(uinttemp_data)
{
wan=temp_data/10000+0x30;
temp_data=temp_data%10000;//取余运算
qian=temp_data/1000+0x30;
temp_data=temp_data%1000;//取余运算
bai=temp_data/100+0x30;
temp_data=temp_data%100;//取余运算
shi=temp_data/10+0x30;
temp_data=temp_data%10;//取余运算
ge=temp_data+0x30;
}
voiddelay(unsignedintk)
{
unsignedinti,j;
for(i=0;i { for(j=0;j<121;j++) {;}} } voidWaitForEnable(void) { DataPort=0xff; LCM_RS=0;LCM_RW=1;_nop_(); LCM_EN=1;_nop_();_nop_(); while(DataPort&0x80); LCM_EN=0; } voidWriteCommandLCM(ucharCMD,ucharAttribc) { if(Attribc)WaitForEnable(); LCM_RS=0;LCM_RW=0;_nop_(); DataPort=CMD;_nop_(); LCM_EN=1;_nop_();_nop_();LCM_EN=0; } voidWriteDataLCM(uchardataW) { WaitForEnable(); LCM_RS=1;LCM_RW=0;_nop_(); DataPort=dataW;_nop_(); LCM_EN=1;_nop_();_nop_();LCM_EN=0; } voidInitLcd() { WriteCommandLCM(0x38,1); WriteCommandLCM(0x08,1); WriteCommandLCM(0x01,1); WriteCommandLCM(0x06,1); WriteCommandLCM(0x0c,1); } voidDisplayOneChar(ucharX,ucharY,ucharDData) { Y&=1; X&=15; if(Y)X|=0x40; X|=0x80; WriteCommandLCM(X,0); WriteDataLCM(DData); } /************************************** 延时5微秒(STC90C52RC@12M) 不同的工作环境,需要调整此函数,注意时钟过快时需要修改 当改用1T的MCU时,请调整此延时函数 **************************************/ voidDelay5us() { _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); } /************************************** 延时5毫秒(STC90C52RC@12M) 不同的工作环境,需要调整此函数 当改用1T的MCU时,请调整此延时函数 **************************************/ voidDelay5ms() { WORDn=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();//延时 } /************************************** 发送应答信号 入口参数: ack(0: ACK1: NAK) **************************************/ 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(BYTEdat) { BYTEi; for(i=0;i<8;i++)//8位计数器 { dat<<=1;//移出数据的最高位 SDA=CY;//送数据口 SCL=1;//拉高时钟线 Delay5us();//延时 SCL=0;//拉低时钟线 Delay5us();//延时 } ADXL345_RecvACK(); } /************************************** 从IIC总线接收一个字节数据 **************************************/ BYTEADXL345_RecvByte() { BYTEi; BYTEdat=0; SDA=1;//使能内部上拉,准备读取数据, for(i=0;i<8;i++)//8位计数器 { dat<<=1; SCL=1;//拉高时钟线 Delay5us();//延时 dat|=SDA;//读数据 SCL=0;//拉低时钟线 Delay5us();//延时 } returndat; } //******单字节写入******************************************* voidSingle_Write_ADXL345(ucharREG_Address,ucharREG_data) { ADXL345_Start();//起始信号 ADXL345_SendByte(SlaveAddress);//发送设备地址+写信号 ADXL345_SendByte(REG_Address);//内部寄存器地址,请参考中文pdf22页 ADXL345_SendByte(REG_data);//内部寄存器数据,请参考中文pdf22页 ADXL345_Stop();//发送停止信号 } //********单字节读取***************************************** ucharSingle_Read_ADXL345(ucharREG_Address) {ucharREG_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(void) {uchari; ADXL345_Start();//起始信号 ADXL345_SendByte(SlaveAddress);//发送设备地址+写信号 ADXL345_SendByte(0x32);//发送存储单元地址,从0x32开始 ADXL345_Start();//起始信号 ADXL345_SendByte(SlaveAddress+1);//发送设备地址+读信号 for(i=0;i<6;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 Single_Write_ADXL345(0x2D,0x08);//选择电源模式 Single_Write_ADXL345(0x2E,0x80);//使能DATA_READY中断 Single_Write_ADXL345(0x1E,0x00);//X偏移量根据测试传感器的状态写入 Single_Write_ADXL345(0x1F,0x00);//Y偏移量根据测试传感器的状态写入 Single_Write_ADXL345(0x20,0x05);//Z偏移量根据测试传感器的状态写入 } //*********************************************************************** //显示x轴 voiddisplay_x() {floattemp; dis_data=(BUF[1]<<8)+BUF[0];//合成数据 if(dis_data<0){ dis_data=-dis_data; DisplayOneChar(10,0,'-');//显示正负符号位 } elseDisplayOneChar(10,0,'');//显示空格 temp=(float)dis_data*3.9;//计算数据和显示, conversion(temp);//转换出显示需要的数据 DisplayOneChar(8,0,'X'); DisplayOneChar(9,0,': '); DisplayOneChar(11,0,qian); DisplayOneChar(12,0,'.'); DisplayOneChar(13,0,bai); DisplayOneChar(14,0,shi); DisplayOneChar(15,0,''); } //*********************************************************************** //显示y轴 voiddisplay_y() {floattemp; dis_data=(BUF[3]<<8)+BUF[2];//合成数据 if(dis_data<0){ dis_data=-dis_data; DisplayOneChar(2,1,'-');//显示正负符号位 } elseDisplayOneChar(2,1,'');//显示空格 temp=(float)dis_data*3.9;//计算数据和显示 conversion(temp);//转换出显示需要的数据 DisplayOneChar(0,1,'Y');//第1行,第0列显示y DisplayOneChar(1,1,': '); DisplayOneChar(3,1,qian); DisplayOneChar(4,1,'.'); DisplayOneChar(5,1,bai); DisplayOneChar(6,1,shi); DisplayOneChar(7,1,''); } //*********************************************************************** //显示z轴 voiddisplay_z() { floattemp; dis_data=(BUF[5]<<8)+BUF[4];//合成数据 if(dis_data<0){ dis_data=-dis_data; DisplayOneChar(10,1,'-');//显示负符号位 } elseDisplayOneChar(10,1,'');//显示空格 temp=(float)dis_data*3.9;//计算数据和显示 conversion(temp);//转换出显示需要的数据 DisplayOneChar(8,1,'Z');//第0行,第10列显示Z DisplayOneChar(9,1,': '); DisplayOneChar(11,1,qian); DisplayOneChar(12,1,'.'); DisplayOneChar(13,1,bai); DisplayOneChar(14,1,shi); DisplayOneChar(15,1,''); } //********************************************************* //******主程序******** //********************************************************* voidmain() { uchardevid; delay(500);//上电延时 InitLcd();//液晶初始化ADXL345 DisplayOneChar(0,0,'A'); DisplayOneChar(1,0,'D'); DisplayOneChar(2,0,'X'); DisplayOneChar(3,0,'L'); DisplayOneChar(4,0,'3'); DisplayOneChar(5,0,'4'); DisplayOneChar(6,0,'5'); Init_ADXL345();//初始化ADXL345 devid=Single_Read_ADXL345(0X00);//读出的数据为0XE5,表示正确 while (1)//循环 { Multiple_Read_ADXL345();//连续读出数据,存储在BUF中 display_x();//---------显示X轴 display_y();//---------显示Y轴 display_z();//---------显示Z轴 delay(200);//延时 } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ADXL345 加速度 传感器 参考 程序 1602 显示
![提示](https://static.bdocx.com/images/bang_tan.gif)