//********ADXL345.C
#include lt;REG51.Hgt;
#include lt;math.hgt; //Keil库
#include lt;INTRINS.Hgt;
#includelt;dingyi.hgt;
#includelt;1602.hgt;
#includelt;Reluctance.hgt;
#includelt;xianshi.hgt;
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轴
延迟(100);
}
}
//***** ******************xianshi.H
//显示x轴
void display_x()
{ float temp;
dis_data=(BUF[1]lt;lt;8) BUF[0]; // 合成数据
X1=(float)dis_data*3.9/ 10000;
if(dis_datalt;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');
p>
}
//**************************************** ****************************************
//显示轴 p>
void display_y()
{ float temp;
dis_data=(BUF[3]lt;lt;8) BUF[2]; // 合成数据
Y1=(float)dis_data*3.9/10000;
if(dis_datalt;0){
dis_data=-dis_data;
DisplayOneChar(2,1,'-'); // 显示正负符号位
}
else DisplayOneChar(2,1,' '); // 显示空格 p>
temp=(float)dis_data*3.9; // 计算数据和显示,查考ADXL345快速入门第4页
conversion(temp); // 转换出显示需要的数据 p>
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]lt;lt;8) BUF[4]; // 合成数据
Z1=(float)dis_data*3.9/10000; p>
if(dis_datalt;0){
dis_data=-dis_data;
DisplayOneChar(10,1,'-'); //显示负符号位 p>
}
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)
{ p>
if(klt;0){
k=-k;
DisplayOneChar(i,m,'-'); //显示负符号位 p>
}
else DisplayOneChar(i,m,' '); // 显示空格
conversion(k); // 转换出显示需要的数据 p>
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(位确认)
{
SDA = ack; //写应答信号
SCL = 1; //拉高时钟线
Delay5us(); //延迟
SCL = 0 ; //拉低时钟线
Delay5us(); //延迟
}
/************ **************************
接收应答信号
******** ******************************/
位SHEBEI_RecvACK()
{
SCL = 1; //拉高时钟线
Delay5us(); //延迟
CY = SDA; //读应答信号
SCL = 0; //拉低时钟线
Delay5us(); //延迟
return CY;
}
/********************************************
向IIC管道传输一个字节数据
************************************ *****/
void SHEBEI_SendByte(BYTE dat)
{
BYTE i;
for (i=0; ilt;8; i ) //8位粒子
{
dat lt;lt;= 1; //移出数据的最高位
SDA = CY; //发送数据口
SCL = 1; //拉高时钟线
Delay5us(); //延迟
SCL = 0; //拉低时钟线
Delay5us(); //延迟
}
SHEBEI_RecvACK();
} p>
/********************************************
从IIC接口接收一个字节数据
************************************ ****/
BYTE SHEBEI_RecvByte()
{<
/p>
BYTE i;
BYTE dat = 0;
SDA = 1; //使能内部上拉,准备读取数据,
for (i=0; ilt;8; i ) //8位计数器
{
dat lt;lt;= 1;
SCL = 1; //拉高时钟线
Delay5us(); //延迟
dat |= SDA; //读取数据
SCL = 0 ; //拉低时钟线
Delay5us(); //延迟
}
return dat;
} p>
//************************************************ ********
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地址)
{ uchar i;
IIC_Start(); //起始信号
SHEBEI_SendByte(SlaveAddress); // 发送设备地址写信号
SHEBEI_SendByte(address); // 发送存储单元地址,从0x32开始
IIC_Start(); //启动信号
SHEBEI_SendByte(SlaveAddress 1); //发送设备地址读信号
for (i=0;ilt;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();
}
void Init_ADXL345()
{
Single_Write_SHEBEI(0xA6,0x31,0x0B); //测量范围,正负16g,13位模式
Single_Write_SHEBEI(0xA6,0x2C,0x08); //速率设置为12.5 参考pdf13页
Single_Write_SHEBEI(0xA6,0x2D,0x08); //选择电源模式 pdf24页
Single_Write_SHEBEI(0xA6,0x2E,0x80); //使能 DATA_READY 中断
Single_Write_SHEBEI(0xA6,0x1E,0x00); //X偏移量根据测试传感器的状态写入pdf29页
Single_Write_SHEBEI(0xA6,0x1F,0x00); //Y偏移量根据测试传感器的状态写入pdf29页
Single_Write_SHEBEI(0xA6,0x20,0x05); //Z偏移量根据测试传感器的状态写入pdf29页
}
//********************************dingyi.h
# Define uchar unsigned char
#define uint unsigned int
#define DataPort P0 //LCD1602数据端口
sbit SCL=P1^0; //IIC时钟引脚定义
sbit SDA=P1^1; //IIC数据引脚定义
sbit RS=P2^0; //LCD1602命令端口
sbit RW=P2^1; //LCD1602命令端口
sbit E=P2^2; //LCD1602命令端口
//#define SlaveAddress 0x3C //定义在IIC入口中
的从地址
//uchar SlaveAddress;
typedef unsigned char BYTE;
typedef unsigned short WORD;
BYTE BUF[8 ]; //接收数据存储区
uchar ge,shi,bai,qian,wan; //显示变量
int dis_data;
float X1;
浮点Y1;
浮点Z1;
int x;
int y;
int z;
int Hx;
int Hy;
//********************* ****************************************************** ******************************
无效延迟(无符号整数k)
{
无符号整数 i,j;
for(i=0;ilt;k;i )
{
for (j=0;jlt;121;j )
{;}}
}
void Delay5us()
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_( );_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_( );_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_( );_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_( );
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
p>
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_() ;_nop_();_nop_();_nop_();
}
void Delay5ms()
{
WORD n = 560;
while (n--);
}
//************************************* ****** ********************************************** ************
void conversion(uint temp_data)
{
wan=temp_data/10000 0x30 ;
temp_data=temp_data10000; //取余装甲
qian=temp_data/1000 0x30 ;
temp_data=temp_data1000; //取余装甲
bai=temp_data/100 0x30 ;
temp_data=temp_data100; //取余攻击
shi=temp_data/10 0x30 ;
temp_data=temp_data10; //取余腐蚀
ge=temp_data 0x30;
}
//******************** *****1602.h
void write_commend(uchar com)
{P0=com;
RS=0;
E=1;
延迟(2);
E=0;
}
void write_data(uchar dat)
{P0=dat;
RS=1;
E=1;
延迟(2);
E=0;
}
void write_string(uchar x,uchar y,uchar *s)
{
if (y == 0)
{
write_commend(0x80 x); //表示第一行
}
else
{
write_commend(0xC0 x); //表示第二行
}
while (*s)
{
write_data( *s);
s ;
}
}
void DisplayOneChar(uchar X,uchar Y,uchar DData)
{
Yamp;=1;
Xamp;=15;
if(Y)X|=0x40;
X|=0x80;
write_commend(X);
<p>write_data(DData);
}
void init_com()
{RW =0;
delay(10);
write_commend(0x02);
延迟(10);
write_commend(0x38);
延迟(10);
延迟(10);
延迟(10) p>
write_commend(0x38);
延迟(10);
write_commend(0x38);
write_commend(0x0c);
write_commend(0x06);
write_commend(0x01);
write_commend(0x01);
}
以前玩过,手头没模块没测试。帮你把你不需要的删掉了。 IIC 已写成模块直接调用Multiple_read_SHEBEI()可以设置设备地址存储单元地址