51单片机写程序 24c02 iic总线 程序下载后不正确 求错误原因 。。。

#include<reg52.h>#include<INTRINS.H>typedefunsignedcharuint8;typedefunsignedintuint16... #include <reg52.h>
#include <INTRINS.H>
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long uint32;
sbit SCL = P1^1;
sbit SDA = P1^2;
sbit WP=P1^0;
uint8 a;
void Delay(void)
{
_nop_();
_nop_();
_nop_();
_nop_();

}
void InitI2C(void)
{
SDA = 1;
SCL = 1;
}
void I2CStart(void)
{
SDA = 1;
Delay(); // 延时子程序
SCL = 1;
Delay();
SDA = 0;
Delay();
SCL = 0;

}
void I2CStop(void)
{
SCL = 0;
Delay();
SDA = 0;
Delay();
SCL = 1;
Delay();
SDA = 1;
Delay();

}
void I2CSend(uint8 byte)
{
uint8 mask;
uint8 i;
uint8 j;

mask = 0x80;
for(i = 0; i < 8; i++)
{
SCL = 0;
Delay();
if((mask & byte) == 0)
{
SDA = 0;
}
else
{
SDA = 1;
}
mask >>= 1;
Delay();
SCL = 1;
Delay();
}

SCL = 0;
SDA = 1;
Delay();
SCL = 1;
j = SDA;
Delay();
SCL = 0;

}

uint8 I2CRead(void)
{
uint8 byte;
uint8 i;

byte = 0;
for(i = 0; i < 8; i++)
{
SCL = 0;
SDA = 1;
Delay();
SCL = 1;
Delay();
byte <<= 1;
if(SDA == 1)
{
byte |= 0x01;
}
Delay();
}
SCL = 0;
SDA = 1;
Delay();
SCL = 1;
Delay();
SCL = 0;

return byte;

}
uint8 I2CReadAck(void)
{
uint8 i;
uint8 byte;

byte = 0;
for(i=0;i<8;i++)
{
SCL = 0;
SDA = 1;
Delay();
SCL = 1;
Delay();
byte <<= 1;
if(SDA==1) {byte |= 0x01;}
Delay();
}
SCL = 0;
Delay();
SDA = 0;
Delay();
SCL = 1;
Delay();
SCL = 0;

return byte;

}
uint8 read_eeprom(uint8 addr)
{
uint8 databyte;

I2CStart();
I2CSend(0xae);
I2CSend(addr);
I2CStart();
I2CSend(0xaf);
databyte = I2CRead();
I2CStop();

return databyte;
//a=databyte;

}

/*****************************************************************************
** 函数名称:write_eeprom
** 功能描述:读取EEPROM数据函数(可多片共存)
** 输 入:E2中目的地址addr
** 输 出:读取的数据
** 全局变量:无
** 调用模块:I2CStart(),I2CSend(),I2CStop()
******************************************************************************/
void write_eeprom(uint8 addr, uint8 databyte)
{
I2CStart();
I2CSend(0xae);
I2CSend(addr);
I2CSend(databyte);
I2CStop();

}

/*****************************************************************************
** 函数名称:主函数main
** 功能描述:读写EEPROM
** 输 入:
** 输 出:
******************************************************************************/
main()
{

WP=0;
InitI2C();
Delay();
write_eeprom(0x10,0x06);
Delay();
Delay();

P2=read_eeprom(0x10);
P0=0xaa;
while(1);

}
展开
 我来答
mscyhll
2011-03-26 · TA获得超过643个赞
知道小有建树答主
回答量:494
采纳率:0%
帮助的人:507万
展开全部
时序控制的不好,经过调试将P2=read_eeprom(0x10);放到while循环里面可以实现,或者是连续读两次,第一次读取的数值是不正确的!
意法半导体(中国)投资有限公司
2023-06-12 广告
STM32F103是一款高性能的嵌入式芯片,由意法半导体(STMicroelectronics)公司生产。它是STM32系列芯片之一,具有紧凑、低功耗、高性能等特点,被广泛应用于嵌入式系统中。STM32F103的主要特点包括:1. 集成了A... 点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式