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

📄 at24c01.bak

📁 AT24系列EEPROM底层驱动程序
💻 BAK
字号:
#include <at892051.h>
#define uchar unsigned char
#define uint unsigned int

#define AddWr 0xae /*器件地址选择及写标志*/
#define AddRd 0xaf /*器件地址选择及读标志*/
/*有关全局变量*/

sbit SDA	= P3^5; /*串行数据*/
sbit SCL	= P3^4; /*串行时钟*/
sbit WP		= P3^3; /*硬件写保护*/
sbit        A7 = ACC^7;
sbit        A6 = ACC^6;
sbit        A5 = ACC^5;
sbit        A4 = ACC^4;
sbit        A3 = ACC^3;
sbit        A2 = ACC^2;
sbit        A1 = ACC^1;
sbit        A0 = ACC^0;

//----------------------------------------------------------------
//延时9.8uS,11.0592M晶振标准延时程序
//----------------------------------------------------------------
/*void	delay_10uS(void)
{
          uchar    i;
          for(i=0;i<1;i++);
}*/

//----------------------------------------------------------------
//延时4.3uS,11.0592M晶振标准延时程序
//----------------------------------------------------------------
void	delay_4uS(void)
{
          ;
}


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

}
//----------------------------------------------------------------
/*发送起始条件*/
//----------------------------------------------------------------
void Start_01(void) /*起始条件*/
{
	SDA=1;
	SCL=1;
	delay_4uS();
	SDA=0;
	delay_4uS();
}
//----------------------------------------------------------------
 /*停止条件*/
//----------------------------------------------------------------
void Stop_01(void)
{
	SDA=0;
	SCL=1;
	delay_4uS();
	SDA=1;
	delay_4uS();
}
//----------------------------------------------------------------
 /*应答位*/
//----------------------------------------------------------------
void Ack(void)
{
	SDA=0;
	delay_4uS();
	SCL=1;
	delay_4uS();
	SCL=0;
}
//----------------------------------------------------------------
/*反向应答位*/
//----------------------------------------------------------------
void NoAck(void)
{
	SDA=1;
	delay_4uS();
	SCL=1;
	delay_4uS();
	SCL=0;
}
//----------------------------------------------------------------
 /*发送数据子程序,Data为要求发送的数据*/
//----------------------------------------------------------------
void Send_01(uchar Data)
{
	uchar i; /*位数控制*/
	ACC = Data;
	for(i=0;i<8;i++)
	  {
	  	SCL=0;
		delay_4uS();
	  	SDA = A7;
	  	ACC = ACC<<1;
	  	SCL=1;
	  	delay_4uS();
	  }
	SCL=0;
}
//-----------------------------------------------------------------------------
/*读一个字节的数据,并返回该字节值*/
//-----------------------------------------------------------------------------
uchar Read_01(void)
{
	uchar temp=0;
	uchar i;
	SDA=1;
	for(i=0;i<8;i++)
	  {
	  	SCL=0;
		delay_4uS();
		SCL=1;
		A1 = SDA;
	  	ACC = ACC<<1;
	  	delay_4uS();
	  }
	temp = ACC;
	return(temp);
}
//----------------------------------------------------------------
//数据块写入,传递参数:数据块首址、写入地址、数据块长度
//---------------------------------------------------------------
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(); /*发送启动信号*/
		Send_01(AddWr); /*发送SLA+W*/
		Ack();
		Send_01(Address+i); /*发送地址*/
		Ack();
		Send_01(*(PData+i));
		Ack();
		Stop_01();
		mDelay(20);
	  }
	WP = 1;
}
//----------------------------------------------------------------
//数据块读出,传递参数:数据块首址、读出地址、数据块长度
//---------------------------------------------------------------
void RdFromROM(uchar Data[],uchar Address,uchar Num)
{
	uchar i;
	uchar *PData;
	PData=Data;
	for(i=0;i<Num;i++)
	  {
		Start_01();
		Send_01(0xa0);
		Ack();
		Send_01(Address+i);
		Ack();
		Start_01();
		Send_01(0xa1);
		Ack();
		*(PData+i)=Read_01();
		SCL=0;
		NoAck();
		Stop_01();
	  }
}
//-------------------------------------------
//串口发送子程序,条件:TI=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)
{
	SCON  = 0x50;		        /* SCON: mode 1, 8-bit UART, enable rcvr      */
	TMOD  = 0x21;               	/* T0工作于方式1,十六位定时器,T1工作于方式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    = 0x82;
        mDelay(1);
        mDelay(5);
        mDelay(10);
        mDelay(50);
        mDelay(100);
        mDelay(200);
}

void main()
{
	uchar Number[4]={1,2,3,4};
	SysInit();
	mDelay(1);
	WP= 1;				 //将AT24C01A写保护
	WrToROM(Number,4,4); /*将初始化后的数值写入EEPROM*/
	mDelay(20);
	Number[0]=0;
	Number[1]=0;
	Number[2]=0;
	Number[3]=0; /*将数组中的值清掉,以验证读出的数是否正确*/
	RdFromROM(Number,4,4);
}

⌨️ 快捷键说明

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