用proteus仿真51单片机读写at24c04
I2C程序一开始始终走不通,
后来发现在start()增加一行SCL=0;
仿真就正常了。
想不明白为什么加这一行,请高手们指点一下,谢谢
代码如下:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define NOP4() {_nop_();_nop_();_nop_();_nop_();}
sbit SCL=P1^0;
sbit SDA=P1^1;
sbit SPK=P3^0;
sbit P20=P2^0;
code a[]={0x40,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x00,0x10};
void Delayms(int ms)
{
int i;
while(ms--)
for(i=0;i<125;i++);
}
//-----------初始化
void Init()
{
SDA=1;
NOP4();
SCL=1;
NOP4();
}
//-------------开始
void Start()
{
SDA=1;
SCL=1;
NOP4();
SDA=0;
NOP4();
SCL=0; //==========不明白为什么这一行命令不加的话,仿真就不成功,I2C协议上没有规定,scl最后要拉低啊??
}
//==============停止
void Stop()
{
SDA=0;
NOP4();
SCL=1;
NOP4();
SDA=1;
}
//==============应答
void Ask()
{
uchar i;
SCL=1;
NOP4();
while((SDA==1)&&(i<250))
i++;
SCL=0;
NOP4();
}
//--------------无响应
void NO_ACK()
{
SDA=1;
SCL=1;
NOP4();
SCL=0;
SDA=0;
}
//--------------------写一个字节
void Writebyte(uchar b)
{
uchar i;
for(i=0;i<8;i++)
{
b<<=1;
SDA=CY;
_nop_();
SCL=1;
NOP4();
SCL=0;
}
//RACK();
Ask();
}
//----------------------向指定地址写数据
void Writedat(uchar add, uchar dat)
{
start();
Writebyte(0xa0);
Writebyte(add);
Writebyte(dat);
stop();
Delayms(10);
}
//----------------------读字节
uchar Read_B()
{
uchar i,b;
for(i=0;i<8;i++)
{
SCL=1;
b<<=1;
b|=SDA;
SCL=0;
}
return b;
}
//===========================指定地址读数据
uchar Read_add(uchar addr)
{ uchar dat;
Start();
Writebyte(0xa0);
Writebyte(addr);
Start();
Writebyte(0xa1);
dat=Read_B();
Stop();
return dat;
}
void main()
{
Init();
Writedat(2,4);
P2=a[Read_add(2)];
Delayms(10000);
}
|