请问AT24C02为什么没一点反应

2019-07-15 21:28发布

#include <reg52.h>
#include <intrins.h>


#define uchar unsigned char

sbit SCL=P3^4;        //定义串行时钟线
sbit SDA=P3^5;        //定义串行应答线

void delay(int ms)
{
while(ms--);
}

void init_24C02()     //初始化24C02
{
   SCL=1;
   _nop_();            //延时一个机器周期
   SDA=1;
   _nop_();
}
void start()
{
  SDA=1;
  _nop_();
  SCL=1;
  _nop_();
  SDA=0;       //当时钟线为高电平时数据线拉低,AT24C02开始工作
  _nop_();
  SCL=0;       //时钟线清零便于后续操作
  _nop_();
}

void stop()       //停止信号
{
  SDA=0;
  _nop_();
  SCL=1;     
  _nop_();
  SDA=1;       //当时钟线为高电平时,数据线拉高AT24C02停止
  _nop_();
}

void Write_Byte_24C02(uchar date)        //写一个字节的数据
{
   uchar i;

   for(i=0;i<8;i++)             //传送八位数据
   {
     date=date<<1;             //每次传送一位
     SCL=0;
         _nop_();
         SDA=CY;
     _nop_();           
         SCL=1;
         _nop_();
                          //左移一位,将发送的最高位舍弃
   }
SCL=0;
_nop_();
SDA=1;
_nop_();                   //等待AT24C02的应答信号
}

uchar Read_Byte_24C02()         //读取一个字节数据
{
   uchar i,j,result;
   SCL=0;
   _nop_();
   SDA=1;
   for(i=0;i<8;i++)             //每次读取一位
   {
      _nop_();     
          SCL=1;               
          _nop_();
          if(SDA==1)          //读出高电平
             j=1;
                 else                        //读出低电平
                 j=0;
         result=(result<<1)|j;       //将读出来的数值放在最低位
         SCL=0;
   }
        _nop_();
        return result;         //返回读出来的数值

}
void clock()     //等待AT24C02的应答
{
   uchar i=0;               
   SCL=1;
   _nop_();
   while((SDA==1)&&(i<255))           //等待拉低做出应答(如果不应答则在一定时间之后跳出,避免程序死在此处)
     i++;
   SCL=0;
   _nop_();
}
uchar Read_24C02(uchar address)
{
   uchar  ReadData;
   start();
   Write_Byte_24C02(0xa0);            //写入写数据的命令
   clock();
   Write_Byte_24C02(address);         //写入地址
   clock();
   start();                           //将数据线和时钟线拉低
   Write_Byte_24C02(0xa1);            //写入读数据命令
   clock();
   ReadData=Read_Byte_24C02();
   stop();
   delay(50);
   return ReadData;
}

void Write_24C02(uchar address,uchar date)       //在指定地址处写入数据
{
   start();                            //开始AT24C02
   Write_Byte_24C02(0xa0);            //写入写数据的命令
   clock();
   Write_Byte_24C02(address);         //写入地址
   clock();

   Write_Byte_24C02(date);            //写入读数据的命令
   clock();

   stop();                     //停止24C02
delay(50);

}
void main()
{
  uchar i;
  init_24C02();
  Write_24C02(0x00,0x00);                //将数据0写到AT24C02的0x00地址上面
  delay(500);
  i=Read_24C02(0);

  while(1);      
}
file:///C:UserssamsungAppDataRoamingTencentUsers549816749QQWinTempRichOle6`5G)`KGJ~SHV%%7UUF3SY0.jpg


file:///C:UserssamsungAppDataRoamingTencentUsers549816749QQWinTempRichOle6`5G)`KGJ~SHV%%7UUF3SY0.jpg


6`5G)`KGJ~SHV%%7UUF3SY0.jpg
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。