请教!关于I2C总线发收数据的程序的问题
以下程序是想通过I2C总线与24C08存储器通信。首先对24C08存储器写入数据,再向24C08存储器读出数据,以该数据来点亮LED灯。
程序如下:
#include<reg52.h>
#include <intrins.h>
sbit scl=P3^4;
sbit sda=P3^5;
void delay()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void start()
{
sda=1;
scl=1;
delay();
sda=0;
delay();
scl=0;
}
void stop()
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void ask()
{ unsigned char i;
sda=1;
delay();
scl=1;
delay();
while((sda==1)&&(i<250))i++;
scl=0;
delay();
}
void write(unsigned char y)
{ unsigned char i;
for(i=0;i<8;i++)
{
y=y<<1;
sda=CY;
delay();
scl=1;
delay();
scl=0;
delay();
}
}
unsigned char read()
{ unsigned char t=0;
unsigned char X;
unsigned char i;
for(i=0;i<8;i++)
{
scl=1;
delay();
X=sda;
delay();
t=t<<1;
t=X|t;
scl=0;
delay();
}
return t;
}
void main()
{
sda=1;
scl=1;
start();
write(0xa0);
ask();
write(3);
ask();
write(0x7f);
ask();
stop();
delay();
start();
write(0xa0);
ask();
write(3);
ask();
start();
write(0xa1);
ask();
P0=read();
delay();
stop();
while(1);
}
最终结果LED灯 P0.0、P0.1不亮,P0.2~0.7都亮,显然结果错误。我写入的数据是 0x7f 而读出来确不是。哪位高手帮忙解答一下?感激不尽!
我的单片机芯片是 AT89S52
你得仔细核对你的操作时序是否正确,判断是没写进去,还是读不出出来,网上源代码也较多,你可以弄个试试!
时序正确啊,写进去了,读不出来。
向24C08芯片写数据后,延时一段时间,才能读数据吧
正解啊!虽说我这个程序也有延时,但是延时不够长,现在改成更长的延时之后就成功了。谢谢!
那你怎么能保证你写进去了哦,至少得通过读验证啊!
这是我的 单片机stc89c52
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit scl=P2^1;
sbit sda=P2^0;
/***************************************************************************
延时函数
**************************************************************************/
void delay()
{ ;; }
void delay1(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/************************************************************************
初始化函数
*************************************************************************/
void init()
{
sda=1;
delay();
scl=1;
delay();
}
/*************************************************************************
启动函数
************************************************************************/
void start()
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
/***************************************************************************
停止函数
************************************************************************/
void stop()
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
/*********************************************************************
应答函数
********************************************************************/
void res()
{
uchar i=0;
scl=1;
delay();
while((sda==1)&&(i<250))
i++;
scl=0;
delay();
}
/**********************************************************************
写函数
*********************************************************************/
void write_byte(uchar date)
{
uchar temp,i;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delay();
sda=CY;
delay();
scl=1;
delay();
}
scl=0;
delay();
sda=1;
delay();
}
/*****************************************************************
读函数
*****************************************************************/
uchar read_byte()
{
uchar i,k;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
k=(k<<1)|sda;
scl=0;
delay();
}
return k;
}
/**************************************************************
指定定制写一个字符
***************************************************************/
void write_add(uchar add,uchar date)
{
start();
write_byte(0xa0);
res();
write_byte(add);
res();
write_byte(date);
res();
stop();
}
/*************************************************************
相应地址读字符
**************************************************************/
uchar read_add(uchar add)
{
uchar date;
start();
write_byte(0xa0);
res();
write_byte(add);
res();
start();
write_byte(0xa1);
res();
date=read_byte();
return date;
}
/*********************************************************
主函数
********************************************************/
void main()
{
init();
write_add(0,0xfe);
delay1(100);
P1=read_add(0);
while(1);
}
