⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 at24c0x.txt

📁 AT24系列EEPROM底层驱动程序
💻 TXT
字号:
我用at24c02 .我的程序运行后,可读写;但是读出后发现每个字节都左移一位,且最低位为1。我推测两种可能:1、读错  2、写错。
经试验不可能是读错,但为什么会写错呢?(写地址是对的),还有其他可能吗?
****************************************************************************
#include <at892051.h>
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int

#define AddWr 0xae /*?÷?tμ??·?????°D′±ê??*/
#define AddRd 0xaf /*?÷?tμ??·?????°?á±ê??*/
/*óD1?è???±?á?*/
uchar 	 bdata buffer;

sbit SDA	= P3^5; /*′?DDêy?Y*/
sbit SCL	= P3^4; /*′?DDê±?ó*/
sbit WP		= P3^3; /*ó2?tD′±£?¤*/

sbit      B7 = buffer^7;
sbit      B6 = buffer^6;
sbit      B5 = buffer^5;
sbit      B4 = buffer^4;
sbit      B3 = buffer^3;
sbit      B2 = buffer^2;
sbit      B1 = buffer^1;
sbit      B0 = buffer^0;
//----------------------------------------------------------------
//?óê±9.8uS,11.0592M?§??±ê×??óê±3ìDò
//----------------------------------------------------------------
/*void	delay_10uS(void)
{
          uchar    i;
          for(i=0;i<1;i++);
}*/

//----------------------------------------------------------------
//?óê±5.4uS,11.0592M?§??±ê×??óê±3ìDò
//----------------------------------------------------------------
void	delay_5uS(void)
{
       _nop_();
}
//----------------------------------------------------------------
//?óê±joá??3ìDò,11.0592M?§??·?±ê×??óê±3ìDò
//----------------------------------------------------------------

void 	mS_Delay(uchar j)
{
	uchar i;
	while(j>0)
	  {
                i = 0;
                j--;
	  	while(i<114) i++;
	  }

}
//----------------------------------------------------------------
/*·¢?í?eê?ì??t*/
//----------------------------------------------------------------
void Start_01(void) /*?eê?ì??t*/
{
	do{
		SDA=1;
		SCL=1;
	  }while(!(SDA&&SCL));							//?ì2a×ü??ê?·??éó?
	delay_5uS();
	SDA=0;
	delay_5uS();
	SCL=0;
		
}
//----------------------------------------------------------------
 /*í£?1ì??t*/
//----------------------------------------------------------------
void Stop_01(void)
{
	SDA=0;
	SCL=1;
	delay_5uS();
	SDA=1;
	_nop_();
	_nop_();
}
//----------------------------------------------------------------
//?ì2aó|′e??
//----------------------------------------------------------------
 void Ack(void)
{
	SCL=1;
	_nop_();
	_nop_();
	while(SDA);
	SCL=0;

}


//----------------------------------------------------------------
/*·′?òó|′e??*/
//----------------------------------------------------------------
void NoAck(void)
{
	SDA=1;
	delay_5uS();
	SCL=1;
	delay_5uS();
	SCL=0;
}
//----------------------------------------------------------------
 /*·¢?íêy?Y×ó3ìDò,Data?aòa?ó·¢?íμ?êy?Y*/
//----------------------------------------------------------------
void Send_01(void)
{
	uchar i; /*??êy????*/
	for(i=0;i<8;i++)
	  {		
	  	SDA = B7;
	  	buffer = buffer<<1;
		delay_5uS();
	  	SCL=1;
	  	delay_5uS();
		SCL = 0;		
	  }	
	 SDA=1;
}
//-----------------------------------------------------------------------------
/*?áò???×??úμ?êy?Y,2¢·μ????×??ú?μ*/
//-----------------------------------------------------------------------------
void   Read_01(void)
{
	uchar i;
	SDA=1;
	for(i=0;i<8;i++)
	  {
	    buffer = buffer<<1;	
	  	SCL=1;
		delay_5uS();
		SCL=0;
		_nop_();
		_nop_();
		B0 = SDA;	
	  }
}
//----------------------------------------------------------------
//êy?Y?éD′è?£?′?μY2?êy£oêy?Y?éê×?·?¢D′è?μ??·?¢êy?Y?é3¤?è
//---------------------------------------------------------------
void WrToROM(uchar Data[],uchar Address,uchar Num)
{
	uchar data i;
	uchar data *PData;
	WP = 0;
	PData=Data;
	for(i=0;i<Num;i++)
	  {
		Start_01(); /*·¢?í???ˉD?o?*/
		buffer = AddWr; 
		Send_01(); /*?????÷?t*/
		Ack();
		buffer = Address+i;
		Send_01(); /*·¢?íμ??·*/
		Ack();
		buffer = *(PData+i);
		Send_01();
		Ack();
		Stop_01();
		mS_Delay(15);
	  }
	WP = 1;
}
//----------------------------------------------------------------
//êy?Y?é?á3?£?′?μY2?êy£oêy?Y?éê×?·?¢?á3?μ??·?¢êy?Y?é3¤?è
//---------------------------------------------------------------
void RdFromROM(uchar Data[],uchar Address,uchar Num)
{
	uchar i;
	uchar *PData;
	PData=Data;
	for(i=0;i<Num;i++)
	  {
		Start_01();
		buffer = AddWr; 
		Send_01();
		Ack();
		buffer = Address+i; 
		Send_01();
		Ack();
		Start_01();
		buffer = AddRd; 
		Send_01();
		Ack();
		Read_01();
		*(PData+i)= buffer;
		NoAck();
		Stop_01();
	  }
}
//-------------------------------------------
//′??ú·¢?í×ó3ìDò,ì??t£oTI=1,ES=0;
//---------------------------------------------
void  ser_send(uchar  a)
{
      while(TI==0);
      SBUF = a;
      TI=0;
}

/*=============================================================================
*Name        	:SysInit
*Descripton  	:sysem initialization
*Status		:Done
=============================================================================*/

void      SysInit(void)
{
	mS_Delay(1);
	SCON  = 0x50;		        /* SCON: mode 1, 8-bit UART, enable rcvr      */
	TMOD  = 0x21;               	/* T01¤×÷óú·?ê?1,ê?áù???¨ê±?÷£?T11¤×÷óú·?ê?2      */
	TH1   = 0xff;                	/* TH1:  reload value for 1200 baud @ 16MHz   */
	TL1   = 0xff;
	PCON  = PCON|0x80;
 	TL0   = 0x3f;
	TH0   = 0xfe;
	TR1   = 1;                  	/* TR1:  timer 1 run                          */
	//TR0   = 1;                  	/* TR0:  timer 0 run 			*/
 	IE    = 0x80;
	P1 = 0X00;
}

void main()
{
	uchar Number[50]={0};
	uchar i;
	SysInit();
	WP= 1;
	for(i=0;i<50;i++)
	  {
	  	Number[i]=i;	
	  }
	WrToROM(Number,0,50); /*??3?ê??ˉoóμ?êy?μD′è?EEPROM*/
	mS_Delay(20);
	for(i=0;i<50;i++)
	  {
	  	Number[i]=i+500;	
	  }
	WrToROM(Number,50,50); /*??3?ê??ˉoóμ?êy?μD′è?EEPROM*/
	mS_Delay(20);
	for(i=0;i<50;i++)
	  {
	  	Number[i]=i+100;	
	  }
	WrToROM(Number,100,50); /*??3?ê??ˉoóμ?êy?μD′è?EEPROM*/
	mS_Delay(20);
	for(i=0;i<50;i++)
	  {
	  	Number[i]=i+150;	
	  }
	WrToROM(Number,150,50); /*??3?ê??ˉoóμ?êy?μD′è?EEPROM*/
	mS_Delay(20);
	for(i=0;i<50;i++)
	  {
	  	Number[i]=i+200;	
	  }
	WrToROM(Number,200,50); /*??3?ê??ˉoóμ?êy?μD′è?EEPROM*/
	mS_Delay(20);
	Number[0]=0;
	Number[1]=0;
	Number[2]=0;
	Number[3]=0; /*??êy×é?Dμ??μ??μ?£?ò??é?¤?á3?μ?êyê?·??yè·*/
	RdFromROM(Number,4,4);
	for(i=0;i<255;i++)
	  {
	  	RdFromROM(Number,i,1);
		TI = 1;
		ser_send(Number[0]);
	  }
	WP= 1;				 		//??AT24C01AD′±£?¤
	while(1)
	 {
	 	Start_01(); /*·¢?í???ˉD?o?*/
		buffer = 0xaa; 
		Send_01(); /*?????÷?t*/
		Ack();
		Stop_01();	
	 }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -