STC 12C5A60S2 I/O口 模拟I2C 对 24LC32的读写问题 一直不能实现读写 下面的程序代码 请高手耐心解答

////////////////eeprom/////////////////////sbitsda=P3^6;sbitscl=P3^7;voiddelay()//12C... ////////////////eeprom/////////////////////
sbit sda=P3^6;
sbit scl =P3^7;

void delay() // 12C5A60S2 汇编指令nop速度是传统单片机12倍 所以这里用了10个NOP 不知道是否正确
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void eeprom_start()
{
sda=1;
delay();
scl=1;
delay();

sda=0;
delay();
scl=0;
delay();
}
void eeprom_stop()
{

sda=0;
delay();

scl=1;
delay();

sda=1;
delay();

}
void ack_eeprom()
{
sda=0;
delay();
scl=0;
delay();
scl=1;
delay();
scl=0;
delay();
sda=1;
delay();

}
void noack()
{
sda=1;
delay();
scl=1;
delay();
scl=0;
}

void eeprom_init()
{
sda=1;
delay();
scl=1;
delay();

}
void write_byte(uchar date)
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{

if((temp&0x80)==0x80)
{
sda=1;
}
else
{
sda=0;
}
scl=1;
delay();
temp=temp<<1;

}
delay();
scl=0;
delay();
sda=1;
delay();
scl=1;
delay();
if(sda==1)
ack=0;
else
ack=0;
scl=0;
delay();
}
uchar read_byte()
{
uchar i,k=0;

for(i=0;i<8;i++)
{
scl=1;
delay();
k=(k<<1);
if(sda==1)
k=k+1;
scl=0;

}
return k;

}
uchar write_add(uchar address,uchar address1,uchar date)
{

eeprom_start();
write_byte(0xa0);
if(ack==0)
return(0);

write_byte(address);
if(ack==0)
return(0);
write_byte(address1);
if(ack==0)
return(0);

write_byte(date);
if(ack==0)
return(0);

eeprom_stop();
return(1);

}

uchar read_add(uchar address,uchar address1)
{
uchar date;
eeprom_start();
write_byte(0xa0);
if(ack==0)
return(0);
write_byte(address);
if(ack==0)
return(0);
write_byte(address1);
if(ack==0)
return(0);
eeprom_start();
write_byte(0xa1);
if(ack==0)
return(0);
delay();

date=read_byte();
noack();
eeprom_stop();
return date;

}

24LC32 内部地址是2字节
展开
 我来答
cwenquan
2011-03-02
知道答主
回答量:22
采纳率:0%
帮助的人:23.2万
展开全部
10个NOP可能不够,多延时一会试试
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式