当前位置: 代码迷 >> 单片机 >> 89C52 中,AT24C02不能延续读取数据,求解
  详细解决方案

89C52 中,AT24C02不能延续读取数据,求解

热度:181   发布时间:2016-04-28 15:42:14.0
89C52 中,AT24C02不能连续读取数据,求解
请高手指点一下 。。。
代码如下:

#include <stdio.h>
#include <Reg52.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int
#define Nop3(); _nop_();_nop_();_nop_();
#define ACK(); SDA=0;NOP_3();SCL=1;NOP_3();SCL=0;   //读24CXX时,MCU的应答信号
sbit SCL=P0^1;
sbit SDA=P0^0;
sbit lcdRS=P1^0;
sbit lcdRW=P1^1;
sbit lcdEN=P1^2;
uchar table[14];

uchar bdata EEP;
sbit EEP_7 = EEP^7;
sbit EEP_0 = EEP^0;

//延时函数
void delay(uchar ms)
{
uchar i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}

void lcd_Command(uchar cmd)
{
lcdRS=0;//高电平为数据,低电平为批令
lcdEN=0;//发送时,发出高脉冲
P0=cmd;
delay(5);
lcdEN=1;
delay(5);
lcdEN=0;
}
void lcd_init()//初始化函数
{
   lcdRW=0;//高电平为读,低电平为写
   lcd_Command(0x38);//0011 1000  设置16*2显示 5*7点阵 8位数据接口
   lcd_Command(0x0E);//0000 1110  0000 1DCB (D=1显示 0不显示 ;C=1显示光标 0不显示光标; B=1光标闪 0 不闪)
   lcd_Command(0x06);//0000 0110  0000 01NS (N=1地址自动加1,0地址减1;S=1整屏左移 0右移)
   lcd_Command(0x01);//清屏  0x08//关闭显示 0x0C 显示开及光标位置
   //lcd_Command(0x10);

}



void lcd_SendData(uchar sd)
{
lcdRS=1;//高电平为数据,低电平为批令
lcdEN=0;
P0=sd;
delay(5);
lcdEN=1;
delay(5);
lcdEN=0;
}




//I2C开始
void I2C_Start(void)
{
SDA=1;
delay(1);
SCL=1;
delay(1);
SDA=0;
delay(1);
SCL=0;

}
//I2C结束
void I2C_Stop(void)
{
SDA=0;
delay(1);
SCL=1;
delay(1);
SDA=1;
delay(1);
}

/*************************************************
* 函数功能:等待IIC的应答信号
* 函数说明:若有应答则返回1,无应答则返回0
* 入口参数:
* 出口参数:无
**************************************************/
uchar TAck(void)
{
uchar var=4;
if(SDA)
 {
  while(--var)
 {
  Nop_3();
if(!SDA)
return 1;
 }
return 0;
 }
SCL=0;
return 1;
}

//应答
  
/**********************************************************

发送应答位子函数

在 SDA 低电平期间 SCL 发生一个正脉冲

**********************************************************/
void I2C_Ack(void)
{
uchar i;
// SDA=0;
// delay(1);
SCL=1;
delay(1);
while((SDA==1)&&(i<255)) i++;
SCL=0;
delay(1);
SDA=1;
}
//NO应答
/**********************************************************

发送非应答位子函数

在 SDA 高电平期间 SCL 发生一个正脉冲

**********************************************************/
void I2C_NoAck(void)
{
SDA=1;
delay(1);
SCL=1;
delay(1);
SCL=0;
delay(1);
SDA=1;
}

//写一个字节
void Write_Byte(uchar wdata)
{
uchar i;
EEP=wdata;
for(i=0;i<8;i++)
{
SDA=EEP_7;
SCL=1;
delay(1);
EEP<<=1;
SCL=0;
delay(1);
}

SDA=1;
delay(1);
SCL=0;
}

uchar Read_Byte(void)
{
uchar i;