问ADXL345,16g量程,全分辨率,单轴输出最大值为多少
1个回答
展开全部
//********ADXL345.C
#include <REG51.H>
#include <math.h> //Keil library
#include <INTRINS.H>
#include<dingyi.h>
#include<1602.h>
#include<Reluctance.h>
#include<xianshi.h>
void main()
{
unsigned int i;
delay(500);
init_com();
Init_ADXL345();
while(1) //循环
{
delay(100);
Multiple_read_SHEBEI(0xA6,0x32);
display_x(); //---------显示X轴
display_y(); //---------显示Y轴
display_z(); //---------显示Z轴
delay(100);
}
}
//***********************xianshi.H
//显示x轴
void display_x()
{ float temp;
dis_data=(BUF[1]<<8)+BUF[0]; //合成数据
X1=(float)dis_data*3.9/10000;
if(dis_data<0){
dis_data=-dis_data;
DisplayOneChar(10,0,'-'); //显示正负符号位
}
else DisplayOneChar(10,0,' '); //显示空格
temp=(float)dis_data*3.9; //计算数据和显示,查考ADXL345快速入门第4页
conversion(temp); //转换出显示需要的数据
DisplayOneChar(8,0,'X'); //第0行,第0列 显示X
DisplayOneChar(9,0,':');
DisplayOneChar(11,0,qian);
DisplayOneChar(12,0,'.');
DisplayOneChar(13,0,bai);
DisplayOneChar(14,0,shi);
DisplayOneChar(15,0,'g');
}
//***********************************************************************
//显示y轴
void display_y()
{ float temp;
dis_data=(BUF[3]<<8)+BUF[2]; //合成数据
Y1=(float)dis_data*3.9/10000;
if(dis_data<0){
dis_data=-dis_data;
DisplayOneChar(2,1,'-'); //显示正负符号位
}
else DisplayOneChar(2,1,' '); //显示空格
temp=(float)dis_data*3.9; //计算数据和显示,查考ADXL345快速入门第4页
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,'g');
}
//***********************************************************************
//显示z轴
void display_z()
{ float temp;
dis_data=(BUF[5]<<8)+BUF[4]; //合成数据
Z1=(float)dis_data*3.9/10000;
if(dis_data<0){
dis_data=-dis_data;
DisplayOneChar(10,1,'-'); //显示负符号位
}
else DisplayOneChar(10,1,' '); //显示空格
temp=(float)dis_data*3.9; //计算数据和显示,查考ADXL345快速入门第4页
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,'g');
}
/*void display(int k,uchar i,uchar m)
{
if(k<0){
k=-k;
DisplayOneChar(i,m,'-'); //显示负符号位
}
else DisplayOneChar(i,m,' '); //显示空格
conversion(k); //转换出显示需要的数据
DisplayOneChar(i+1,m,qian);
DisplayOneChar(i+2,m,'.');
DisplayOneChar(i+3,m,bai);
DisplayOneChar(i+4,m,shi);
} */
//*********************************************Reluctance.h*****
void IIC_Start()
{
SDA = 1; //拉高数据线
SCL = 1; //拉高时钟线
Delay5us(); //延时
SDA = 0; //产生下降沿
Delay5us(); //延时
SCL = 0; //拉低时钟线
}
/**************************************
停止信号
**************************************/
void IIC_Stop()
{
SDA = 0; //拉低数据线
SCL = 1; //拉高时钟线
Delay5us(); //延时
SDA = 1; //产生上升沿
Delay5us(); //延时
}
/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
void SHEBEI_SendACK(bit ack)
{
SDA = ack; //写应答信号
SCL = 1; //拉高时钟线
Delay5us(); //延时
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
/**************************************
接收应答信号
**************************************/
bit SHEBEI_RecvACK()
{
SCL = 1; //拉高时钟线
Delay5us(); //延时
CY = SDA; //读应答信号
SCL = 0; //拉低时钟线
Delay5us(); //延时
return CY;
}
/**************************************
向IIC总线发送一个字节数据
**************************************/
void SHEBEI_SendByte(BYTE dat)
{
BYTE i;
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1; //移出数据的最高位
SDA = CY; //送数据口
SCL = 1; //拉高时钟线
Delay5us(); //延时
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
SHEBEI_RecvACK();
}
/**************************************
从IIC总线接收一个字节数据
**************************************/
BYTE SHEBEI_RecvByte()
{
BYTE i;
BYTE dat = 0;
SDA = 1; //使能内部上拉,准备读取数据,
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1;
SCL = 1; //拉高时钟线
Delay5us(); //延时
dat |= SDA; //读数据
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
return dat;
}
//***************************************************
void Single_Write_SHEBEI(uchar SlaveAddress,uchar REG_Address,uchar REG_data)
{
IIC_Start(); //起始信号
SHEBEI_SendByte(SlaveAddress); //发送设备地址+写信号
SHEBEI_SendByte(REG_Address); //内部寄存器地址,请参考中文pdf
SHEBEI_SendByte(REG_data); //内部寄存器数据,请参考中文pdf
IIC_Stop(); //发送停止信号
}
//
//******************************************************
void Multiple_read_SHEBEI(uchar SlaveAddress,uchar address)
{ uchar i;
IIC_Start(); //起始信号
SHEBEI_SendByte(SlaveAddress); //发送设备地址+写信号
SHEBEI_SendByte(address); //发送存储单元地址,从0x32开始
IIC_Start(); //起始信号
SHEBEI_SendByte(SlaveAddress+1); //发送设备地址+读信号
for (i=0; i<6; i++) //连续读取6个地址数据,存储中BUF
{
BUF[i] = SHEBEI_RecvByte(); //BUF[0]存储0x32地址中的数据
if (i == 5)
{
SHEBEI_SendACK(1); //最后一个数据需要回NOACK
}
else
{
SHEBEI_SendACK(0); //回应ACK
}
}
IIC_Stop(); //停止信号
Delay5ms();
}
#include <REG51.H>
#include <math.h> //Keil library
#include <INTRINS.H>
#include<dingyi.h>
#include<1602.h>
#include<Reluctance.h>
#include<xianshi.h>
void main()
{
unsigned int i;
delay(500);
init_com();
Init_ADXL345();
while(1) //循环
{
delay(100);
Multiple_read_SHEBEI(0xA6,0x32);
display_x(); //---------显示X轴
display_y(); //---------显示Y轴
display_z(); //---------显示Z轴
delay(100);
}
}
//***********************xianshi.H
//显示x轴
void display_x()
{ float temp;
dis_data=(BUF[1]<<8)+BUF[0]; //合成数据
X1=(float)dis_data*3.9/10000;
if(dis_data<0){
dis_data=-dis_data;
DisplayOneChar(10,0,'-'); //显示正负符号位
}
else DisplayOneChar(10,0,' '); //显示空格
temp=(float)dis_data*3.9; //计算数据和显示,查考ADXL345快速入门第4页
conversion(temp); //转换出显示需要的数据
DisplayOneChar(8,0,'X'); //第0行,第0列 显示X
DisplayOneChar(9,0,':');
DisplayOneChar(11,0,qian);
DisplayOneChar(12,0,'.');
DisplayOneChar(13,0,bai);
DisplayOneChar(14,0,shi);
DisplayOneChar(15,0,'g');
}
//***********************************************************************
//显示y轴
void display_y()
{ float temp;
dis_data=(BUF[3]<<8)+BUF[2]; //合成数据
Y1=(float)dis_data*3.9/10000;
if(dis_data<0){
dis_data=-dis_data;
DisplayOneChar(2,1,'-'); //显示正负符号位
}
else DisplayOneChar(2,1,' '); //显示空格
temp=(float)dis_data*3.9; //计算数据和显示,查考ADXL345快速入门第4页
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,'g');
}
//***********************************************************************
//显示z轴
void display_z()
{ float temp;
dis_data=(BUF[5]<<8)+BUF[4]; //合成数据
Z1=(float)dis_data*3.9/10000;
if(dis_data<0){
dis_data=-dis_data;
DisplayOneChar(10,1,'-'); //显示负符号位
}
else DisplayOneChar(10,1,' '); //显示空格
temp=(float)dis_data*3.9; //计算数据和显示,查考ADXL345快速入门第4页
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,'g');
}
/*void display(int k,uchar i,uchar m)
{
if(k<0){
k=-k;
DisplayOneChar(i,m,'-'); //显示负符号位
}
else DisplayOneChar(i,m,' '); //显示空格
conversion(k); //转换出显示需要的数据
DisplayOneChar(i+1,m,qian);
DisplayOneChar(i+2,m,'.');
DisplayOneChar(i+3,m,bai);
DisplayOneChar(i+4,m,shi);
} */
//*********************************************Reluctance.h*****
void IIC_Start()
{
SDA = 1; //拉高数据线
SCL = 1; //拉高时钟线
Delay5us(); //延时
SDA = 0; //产生下降沿
Delay5us(); //延时
SCL = 0; //拉低时钟线
}
/**************************************
停止信号
**************************************/
void IIC_Stop()
{
SDA = 0; //拉低数据线
SCL = 1; //拉高时钟线
Delay5us(); //延时
SDA = 1; //产生上升沿
Delay5us(); //延时
}
/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
void SHEBEI_SendACK(bit ack)
{
SDA = ack; //写应答信号
SCL = 1; //拉高时钟线
Delay5us(); //延时
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
/**************************************
接收应答信号
**************************************/
bit SHEBEI_RecvACK()
{
SCL = 1; //拉高时钟线
Delay5us(); //延时
CY = SDA; //读应答信号
SCL = 0; //拉低时钟线
Delay5us(); //延时
return CY;
}
/**************************************
向IIC总线发送一个字节数据
**************************************/
void SHEBEI_SendByte(BYTE dat)
{
BYTE i;
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1; //移出数据的最高位
SDA = CY; //送数据口
SCL = 1; //拉高时钟线
Delay5us(); //延时
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
SHEBEI_RecvACK();
}
/**************************************
从IIC总线接收一个字节数据
**************************************/
BYTE SHEBEI_RecvByte()
{
BYTE i;
BYTE dat = 0;
SDA = 1; //使能内部上拉,准备读取数据,
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1;
SCL = 1; //拉高时钟线
Delay5us(); //延时
dat |= SDA; //读数据
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
return dat;
}
//***************************************************
void Single_Write_SHEBEI(uchar SlaveAddress,uchar REG_Address,uchar REG_data)
{
IIC_Start(); //起始信号
SHEBEI_SendByte(SlaveAddress); //发送设备地址+写信号
SHEBEI_SendByte(REG_Address); //内部寄存器地址,请参考中文pdf
SHEBEI_SendByte(REG_data); //内部寄存器数据,请参考中文pdf
IIC_Stop(); //发送停止信号
}
//
//******************************************************
void Multiple_read_SHEBEI(uchar SlaveAddress,uchar address)
{ uchar i;
IIC_Start(); //起始信号
SHEBEI_SendByte(SlaveAddress); //发送设备地址+写信号
SHEBEI_SendByte(address); //发送存储单元地址,从0x32开始
IIC_Start(); //起始信号
SHEBEI_SendByte(SlaveAddress+1); //发送设备地址+读信号
for (i=0; i<6; i++) //连续读取6个地址数据,存储中BUF
{
BUF[i] = SHEBEI_RecvByte(); //BUF[0]存储0x32地址中的数据
if (i == 5)
{
SHEBEI_SendACK(1); //最后一个数据需要回NOACK
}
else
{
SHEBEI_SendACK(0); //回应ACK
}
}
IIC_Stop(); //停止信号
Delay5ms();
}
东莞市友贸实业有限公司_
2023-11-22 广告
2023-11-22 广告
第五代双倍数据速率DDR5双列直插式内存模块是一种高速、高性能的内存模块,适用于需要高带宽和低延迟的应用场景。与前几代内存模块相比,DDR5双列直插式内存模块具有更高的数据传输速率和更低的功耗,同时提供了更大的内存容量和更高的可靠性。在数据...
点击进入详情页
本回答由东莞市友贸实业有限公司_提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询