首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

大神帮忙分析下adxl345和sta89c52通过iic总线通信devid值读不出...

大神帮忙分析下adxl345和sta89c52通过iic总线通信devid值读不出...

你好,我现在用adxl345和sta89c52通过iic总线通信,采集adxl345的加速度,程序时按照网上很普遍的宏晶科技的程序,能在LCD上能显示处加速度的变化,但是调试的时候(利用KEIL2的软件调试)就是读不出来devid的值,进入调试界面后devid一开始为0x00,单步调试后devid是0xff,正确的读出值应该是0xe5啊?这是怎么回事啊?是不是我用的keil的软件调试,所以读不出devid的值,应该加一个硬件调试芯片?希望大神能帮忙解答一下,快毕业了,十万火急,毕业设计整不出来了!先谢谢啦!下边是程序:
//***************************************
// GY-29 ADXL345 IIC测试程序
// 使用单片机STC89C51

// 晶振:11.0592M
// 显示:LCD1602
// 编译环境 Keil uVision2
// 参考宏晶网站24c04通信程序
// 时间:2011年3月1日
// QQ:215557711
//****************************************
#include  <REG51.H>      

#include  <math.h>    //Keil library  
#include  <stdio.h>   //Keil library      

#include  <INTRINS.H>
#define   uchar unsigned char
#define   uint unsigned int      

#define   DataPort P0    //LCD1602数据端口
sbit          SCL=P1^0;      //IIC时钟引脚定义
sbit           SDA=P1^1;      //IIC数据引脚定义
sbit      LCM_RS=P2^0;   //LCD1602命令端口               

sbit      LCM_RW=P2^1;   //LCD1602命令端口               

sbit      LCM_EN=P2^2;   //LCD1602命令端口


#define        SlaveAddress   0xA6          //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改
                              //ALT  ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A
typedef unsigned char  BYTE;
typedef unsigned short WORD;

BYTE BUF[8];                         //接收数据缓存区            

uchar ge,shi,bai,qian,wan;           //显示变量
int  dis_data;                       //变量

void delay(unsigned int k);
void InitLcd();                      //初始化lcd1602
void Init_ADXL345(void);             //初始化ADXL345

void WriteDataLCM(uchar dataW);
void WriteCommandLCM(uchar CMD,uchar Attribc);
void DisplayOneChar(uchar X,uchar Y,uchar DData);
void conversion(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 Delay5us();
void Delay5ms();
void ADXL345_Start();
void ADXL345_Stop();
void ADXL345_SendACK(bit ack);
bit  ADXL345_RecvACK();
void ADXL345_SendByte(BYTE dat);
BYTE ADXL345_RecvByte();
void ADXL345_ReadPage();
void ADXL345_WritePage();
//-----------------------------------

//*********************************************************
void conversion(uint temp_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;        

}

/*******************************/
void delay(unsigned int k)      

{                                               

unsigned int i,j;                              

for(i=0;i<k;i++)
{                       

for(j=0;j<121;j++)                       

{;}}                                               

}
/*******************************/
void WaitForEnable(void)      

{                                       

DataPort=0xff;               

LCM_RS=0;LCM_RW=1;_nop_();
LCM_EN=1;_nop_();_nop_();
while(DataPort&0x80);      

LCM_EN=0;                              

}                                       

/*******************************/
void WriteCommandLCM(uchar CMD,uchar Attribc)
{                                       

if(Attribc)WaitForEnable();      

LCM_RS=0;LCM_RW=0;_nop_();
DataPort=CMD;_nop_();      

LCM_EN=1;_nop_();_nop_();LCM_EN=0;
}                                       

/*******************************/
void WriteDataLCM(uchar dataW)
{                                       

WaitForEnable();               

LCM_RS=1;LCM_RW=0;_nop_();
DataPort=dataW;_nop_();      

LCM_EN=1;_nop_();_nop_();LCM_EN=0;
}               

/***********************************/
void InitLcd()                              

{                       

WriteCommandLCM(0x38,1);      

WriteCommandLCM(0x08,1);      

WriteCommandLCM(0x01,1);      

WriteCommandLCM(0x06,1);      

WriteCommandLCM(0x0c,1);
}
返回列表