完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
ADXL345 I2C 通信 串口输出 结果只有Z轴看上去正常,X轴一直不变,Y轴只在两三个数之间变化,不接元件的时候,XY轴也会输出非零值 代码如下
//*************************************** // 使用单片机STC89C52 // 晶振:11.0592M // 输出:串口 // 编译环境 Keil uVision2 // 时间:2013年5月15日 //**************************************** #include #include #include #include #define uchar unsigned char #define uint unsigned int ***it SCL= P2^1; ***it SDA= P2^0; //IIC数据引脚定义 #define ADXLSlaveAddress 0xA6 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改 //ALT ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A unsigned char ADXLBUF[8]; //接收数据缓存区 uchar ADXLfu,ADXLge,ADXLshi,ADXLbai,ADXLqian,ADXLwan; //显示变量 int ADXLdis_data; //变量 void ADXLdelay(unsigned int k); void inits() { TMOD=0x20; TH1=0xfd;//bitlv TL1=0xfd; TR1=1; REN=1;//receieve enable SM0=0;//8 bit AUTO SM1=1; } void ADXLseriel() { SBUF=ADXLfu; ADXLdelay(10); SBUF=ADXLqian; ADXLdelay(10); SBUF='.'; ADXLdelay(10); SBUF=ADXLbai; ADXLdelay(10); SBUF=ADXLshi; ADXLdelay(10); } void ADXLconversion(uint temp_data); void Single_Write_ADXL345(uchar REG_Address,uchar REG_data); //单个写入数据 uchar Single_Read_ADXL345(uchar REG_Address); //单个读取内部寄存器数据 void Multiple_Read_ADXL345(); //连续的读取内部寄存器数据 //------------------------------------ void ADXLDelay5us(); void ADXLDelay5ms(); void ADXL345_Start(); void ADXL345_Stop(); void ADXL345_SendACK(bit ack); bit ADXL345_RecvACK(); void ADXL345_SendByte(unsigned char dat); unsigned char ADXL345_RecvByte(); void ADXL345_ReadPage(); void ADXL345_WritePage(); //----------------------------------- void ADXLall(); //********************************************************* void ADXLconversion(uint temp_data) { if(ADXLdis_data<0){ ADXLdis_data=-ADXLdis_data; ADXLfu='-'; } else { ADXLfu='+'; } ADXLwan=temp_data/10000+0x30; temp_data=temp_data%10000; //取余运算 ADXLqian=temp_data/1000+0x30; temp_data=temp_data%1000; //取余运算 ADXLbai=temp_data/100+0x30; temp_data=temp_data%100; //取余运算 ADXLshi=temp_data/10+0x30; temp_data=temp_data%10; //取余运算 ADXLge=temp_data+0x30; } /*******************************/ void ADXLdelay(unsigned int k) { unsigned int i,j; for(i=0;i for(j=0;j<121;j++) {;}} } /*******************************/ /************************************** 延时5微秒(STC90C52RC@12M) 不同的工作环境,需要调整此函数,注意时钟过快时需要修改 当改用1T的MCU时,请调整此延时函数 **************************************/ void ADXLDelay5us() { _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); } /************************************** 延时5毫秒(STC90C52RC@12M) 不同的工作环境,需要调整此函数 当改用1T的MCU时,请调整此延时函数 **************************************/ void ADXLDelay5ms() { unsigned short n = 560; while (n--); } /************************************** 起始信号 **************************************/ void ADXL345_Start() { SDA = 1; //拉高数据线 SCL = 1; //拉高时钟线 ADXLDelay5us(); //延时 SDA = 0; //产生下降沿 ADXLDelay5us(); //延时 SCL = 0; //拉低时钟线 } /************************************** 停止信号 **************************************/ void ADXL345_Stop() { SDA = 0; //拉低数据线 SCL = 1; //拉高时钟线 ADXLDelay5us(); //延时 SDA = 1; //产生上升沿 ADXLDelay5us(); //延时 } /************************************** 发送应答信号 入口参数:ack (0:ACK 1:NAK) **************************************/ void ADXL345_SendACK(bit ack) { SDA = ack; //写应答信号 SCL = 1; //拉高时钟线 ADXLDelay5us(); //延时 SCL = 0; //拉低时钟线 ADXLDelay5us(); //延时 } /************************************** 接收应答信号 **************************************/ bit ADXL345_RecvACK() { SCL = 1; //拉高时钟线 ADXLDelay5us(); //延时 CY = SDA; //读应答信号 SCL = 0; //拉低时钟线 ADXLDelay5us(); //延时 return CY; } /************************************** 向IIC总线发送一个字节数据 **************************************/ void ADXL345_SendByte(unsigned char dat) { unsigned char i; for (i=0; i<8; i++) //8位计数器 { dat <<= 1; //移出数据的最高位 SDA = CY; //送数据口 SCL = 1; //拉高时钟线 ADXLDelay5us(); //延时 SCL = 0; //拉低时钟线 ADXLDelay5us(); //延时 } ADXL345_RecvACK(); } /************************************** 从IIC总线接收一个字节数据 **************************************/ unsigned char ADXL345_RecvByte() { unsigned char i; unsigned char dat = 0; SDA = 1; //使能内部上拉,准备读取数据, for (i=0; i<8; i++) //8位计数器 { dat <<= 1; SCL = 1; //拉高时钟线 ADXLDelay5us(); //延时 dat |= SDA; //读数据 SCL = 0; //拉低时钟线 ADXLDelay5us(); //延时 } return dat; } //******单字节写入******************************************* void Single_Write_ADXL345(uchar REG_Address,uchar REG_data) { ADXL345_Start(); //起始信号 ADXL345_SendByte(ADXLSlaveAddress); //发送设备地址+写信号 ADXL345_SendByte(REG_Address); //内部寄存器地址,请参考中文pdf22页 ADXL345_SendByte(REG_data); //内部寄存器数据,请参考中文pdf22页 ADXL345_Stop(); //发送停止信号 } //********单字节读取***************************************** uchar Single_Read_ADXL345(uchar REG_Address) { uchar REG_data; ADXL345_Start(); //起始信号 ADXL345_SendByte(ADXLSlaveAddress); //发送设备地址+写信号 ADXL345_SendByte(REG_Address); //发送存储单元地址,从0开始 ADXL345_Start(); //起始信号 ADXL345_SendByte(ADXLSlaveAddress+1); //发送设备地址+读信号 REG_data=ADXL345_RecvByte(); //读出寄存器数据 ADXL345_SendACK(1); ADXL345_Stop(); //停止信号 return REG_data; } //********************************************************* // //连续读出ADXL345内部加速度数据,地址范围0x32~0x37 // //********************************************************* void Multiple_read_ADXL345(void) { uchar i; ADXL345_Start(); //起始信号 ADXL345_SendByte(ADXLSlaveAddress); //发送设备地址+写信号 ADXL345_SendByte(0x32); //发送存储单元地址,从0x32开始 ADXL345_Start(); //起始信号 ADXL345_SendByte(ADXLSlaveAddress+1); //发送设备地址+读信号 for (i=0; i<6; i++) //连续读取6个地址数据,存储中BUF { ADXLBUF = ADXL345_RecvByte(); //BUF[0]存储0x32地址中的数据 if (i == 5) { ADXL345_SendACK(1); //最后一个数据需要回NOACK } else { ADXL345_SendACK(0); //回应ACK } } ADXL345_Stop(); //停止信号 ADXLDelay5ms(); } //***************************************************************** //初始化ADXL345,根据需要请参考pdf进行修改************************ void Init_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,0x01); //X 偏移量 根据测试传感器的状态写入pdf29页 Single_Write_ADXL345(0x1F,0x01); //Y 偏移量 根据测试传感器的状态写入pdf29页 Single_Write_ADXL345(0x20,0x01); //Z 偏移量 根据测试传感器的状态写入pdf29页 } //*********************************************************************** //显示x轴 void output_adxlx() { float temp; ADXLdis_data=(ADXLBUF[1]<<8)+ADXLBUF[0]; //合成数据 temp=(float)ADXLdis_data*3.9; //计算数据和显示,查考ADXL345快速入门第4页 temp=(int)temp; ADXLconversion(temp); //转换出显示需要的数据 //坐标标识//坐标标识//坐标标识 SBUF='X'; ADXLdelay(10); ADXLseriel(); } //*********************************************************************** //显示y轴 void output_adxly() { float temp; ADXLdis_data=(ADXLBUF[3]<<8)+ADXLBUF[2]; //合成数据 temp=(float)ADXLdis_data*3.9; //计算数据和显示,查考ADXL345快速入门第4页 ADXLconversion(temp); //转换出显示需要的数据 //坐标标识//坐标标识//坐标标识 SBUF='Y'; ADXLdelay(10); ADXLseriel(); } //*********************************************************************** //显示z轴 void output_adxlz() { float temp; ADXLdis_data=(ADXLBUF[5]<<8)+ADXLBUF[4]; //合成数据 temp=(float)ADXLdis_data*3.9; //计算数据和显示,查考ADXL345快速入门第4页 ADXLconversion(temp); //转换出显示需要的数据 //坐标标识//坐标标识//坐标标识 SBUF='Z'; ADXLdelay(10); ADXLseriel(); } void ADXLall() { Multiple_Read_ADXL345(); //连续读出数据,存储在BUF中 output_adxlx(); output_adxly(); output_adxlz(); } //********************************************************* //******主程序******** //********************************************************* void main() { uchar devid; inits(); //串口初始化 ADXLdelay(500); //上电延时 Init_ADXL345(); //初始化ADXL345 1=Single_Read_ADXL345(0X00);//读出的数据为0XE5,表示正确 ADXLdelay(10); while(1) //循环 { ADXLall(); ADXLdelay(200); //延时 } } |
|
相关推荐
5个回答
|
|
有可能ADXL345挂了.
|
|
|
|
|
|
|
|
换了别的引角,貌似可以了。。。。,真是感谢啊
不过还有点问题----水平放置时X:00g;Y:00g;Z:0.75g 但是反过来放置时(按理说Z轴应该只是变一下符号),但是结果显示为-4.35g 其它数值基本正确,就是有时理论应该为”0g“左右时,实际显示为 “负五点几g”,数据就这样在 “负五点几g”和”零点几g“跳动,我想这两个问题应该是同一个原因造成的,请问怎么解决呢?? |
|
|
|
你这个数据有点奇怪哦,我好像没有遇到过这种情况、、
|
|
|
|
有校准的
|
|
|
|
只有小组成员才能发言,加入小组>>
3280 浏览 9 评论
2958 浏览 16 评论
3460 浏览 1 评论
9004 浏览 16 评论
4052 浏览 18 评论
1117浏览 3评论
573浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
571浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2303浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1860浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 04:09 , Processed in 1.228120 second(s), Total 88, Slave 68 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号