51单片机 IIC总线 写24C02 问题 看程序 高分悬赏 错误原因。。。。。

51单片机 IIC总线 写24C02 问题 看程序 高分悬赏 错误原因。。。。。,第1张

你的程序编译是通过的,看你的原理图,指出两点:

1你的地址端接的是高电平,读写时是不是和0xae,0xaf地址码对应,请请查看使用说明解决。

2SCL、SDA需要接上上电阻的,不然高电平上不去。

希望对你有帮助!

把Display();用大括号括住试一试

另外要确定从EEPROM读取的数值dat是否在0-16范围内,因表格内只有17个代码,超过此范围是显示不出来的

还有LSD=LEDDATA[DisplayData[i]];//发送段码

你获得的数据只有DisplayData[0],那么DisplayData[i]其它数据从何而来,是0吗?也许只是想先试一试能否点亮一个数码管

//ADXL345C

#include <REG51H>

#include <mathh> //Keil library

#include <INTRINSH>

#include<dingyih>

#include<1602h>

#include<Reluctanceh>

#include<xianshih>

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);

}

}

//xianshiH

//显示x轴

void display_x()

{ float temp;

dis_data=(BUF[1]<<8)+BUF[0]; //合成数据

X1=(float)dis_data39/10000;

if(dis_data<0){

dis_data=-dis_data;

DisplayOneChar(10,0,'-'); //显示正负符号位

}

else DisplayOneChar(10,0,' '); //显示空格

temp=(float)dis_data39; //计算数据和显示,查考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_data39/10000;

if(dis_data<0){

dis_data=-dis_data;

DisplayOneChar(2,1,'-'); //显示正负符号位

}

else DisplayOneChar(2,1,' '); //显示空格

temp=(float)dis_data39; //计算数据和显示,查考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_data39/10000;

if(dis_data<0){

dis_data=-dis_data;

DisplayOneChar(10,1,'-'); //显示负符号位

}

else DisplayOneChar(10,1,' '); //显示空格

temp=(float)dis_data39; //计算数据和显示,查考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);

} /

//Reluctanceh

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();

}

void Init_ADXL345()

{

Single_Write_SHEBEI(0xA6,0x31,0x0B); //测量范围,正负16g,13位模式

Single_Write_SHEBEI(0xA6,0x2C,0x08); //速率设定为125 参考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页

}

//dingyih

#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;

float Y1;

float Z1;

int x;

int y;

int z;

int Hx;

int Hy;

//

void delay(unsigned int k)

{

unsigned int i,j;

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

{

for(j=0;j<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_();

_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_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;

}

//1602h

void write_commend(uchar com)

{P0=com;

RS=0;

E=1;

delay(2);

E=0;

}

void write_data(uchar dat)

{P0=dat;

RS=1;

E=1;

delay(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)

{

Y&=1;

X&=15;

if(Y)X|=0x40;

X|=0x80;

write_commend(X);

write_data(DData);

}

void init_com()

{RW =0;

delay(10);

write_commend(0x02);

delay(10);

write_commend(0x38);

delay(10);

write_commend(0x38);

delay(10);

write_commend(0x38);

write_commend(0x0c);

write_commend(0x06);

write_commend(0x01);

write_commend(0x01);

}

以前玩过,手头没模块没测试。 帮你把你不需要的删了。 IIC 已写成模块 直接调用Multiple_read_SHEBEI() 可以设置设备地址 存储单元地址

一般情况下,要进行I2C通讯,你最起码其中有一个芯片要本身就带有I2C通讯接口,用这个带有I2C接口的芯片来作从器件,这样就相对好处理一点。你要是两个都不带这个接口,来模拟的话,很有难度。除非你对I2C协议很清楚,不过从楼主的提问来看,估计就不怎么熟悉这种协议。

所以建议还是用别的通讯方式吧,比如用SPI,相对会好处理一点,用其中一个芯片的INTx来模拟CS接口,作为从器件在中断中来处理,另外一个就模拟主器件来控制从器件,这样或许会好弄点。如果楼主确实需要通讯,还是赶快换个思路吧,要是卡在一个地方动不了,会耽误你的进程的,祝你好运!

retc=0; //变量 retc 归零

retc=retc<<1; // 变量向左移位

if(SDA==1)retc=retc+1; // 这句话,其实就是接收一个位,因为上一句向左移位了,所以这句话就要接收下一位了,向左移位,最低位为 0,如果接收管脚为 0,那么就是0,如果为1,那么rec变量应该最低位变为1,程序里 +1,其实就是变最低为 1,以完成数据位的正确接收

以上就是关于51单片机 IIC总线 写24C02 问题 看程序 高分悬赏 错误原因。。。。。全部的内容,包括:51单片机 IIC总线 写24C02 问题 看程序 高分悬赏 错误原因。。。。。、51单片机通过I2C总线 *** 作EEPROM、ADXL345 和51单片机接法我要具体的 I2C模式的 最好给个程序撒的 谢谢啦各位~等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9296595.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存