单片机at24c02的问题

来源:百度知道 编辑:UC知道 时间:2024/07/04 02:19:55
/*往at24c02写一个数据然后在读出
然后赋值P1点亮相应的灯亮 */
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
sbit wp=P1^0;
sbit scl=P1^1;
sbit sda=P1^2;
void delayus() //5us
{
_nop_();

}
void intc() //初始化
{
wp=0;
scl=1;
sda=1;
}
void start() //开始信号
{
scl=1;
sda=1;
delayus();
scl=1;
sda=0;
delayus();
}
void stop() //停止信号
{
scl=1;
sda=0;
delayus();
sda=1;
delayus();
}
void answer() //应答信号
{
uchar i=0;
scl=1;
delayus();
while((sda==1)&&(i<255))
i++;
scl=0;
delayus();
}

writebyte(uchar date) //写数据
{
uchar i;
PSW=0x00;
f

C51中的移位运算数据是不进标志位的。把这个

writebyte(uchar date) //写数据
{
uchar i;
PSW=0x00;
for(i=0;i<8;i++)
{
scl=0;
delayus();
date=date<<1;
sda=CY;
delayus();
scl=1;
delayus();
}
sda=1;//养成良好的习惯 数据总线不用就释放
delayus();
}
改成:
writebyte(uchar date) //写数据
{
uchar i;

for(i=0;i<8;i++)
{
scl=0;
delayus();
sda=(bit)date=date&0x80;
delayus();
scl=1;
delayus();
data<<=1;

}
sda=1;//养成良好的习惯 数据总线不用就释放
delayus();
}

date=date<<1;sda=CY;错在这里了,改成其它的(方法不只一种)就行了.

我喜欢用汇编,读写24C02还不错