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

📄 at24c02.c

📁 AT24系列EEPROM底层驱动程序
💻 C
字号:
//*****************************************************************
//MCU:AT892051
//EEPROM:AT24C02
//11.0592M晶振
//测试程序,绝对好用
//对PC波特率56000(呵呵,快了对程序影响小,但会出误码)
//******************************************************************
#include <at892051.h>
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int

#define AddWr 0xa0 /*器件地址选择及写标志*/
#define AddRd 0xa1 /*器件地址选择及读标志*/
/*有关全局变量*/
uchar 	 bdata buffer;

sbit SDA	= P3^5; /*串行数据*/
sbit SCL	= P3^4; /*串行时钟*/
sbit WP		= P3^3; /*硬件写保护*/

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;

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

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

}
//----------------------------------------------------------------
/*发送起始条件*/
//----------------------------------------------------------------
void Start_01(void) /*起始条件*/
{
	do{
		SDA=1;
		SCL=1;
	  }while(!(SDA&&SCL));							//检测总线是否可用
	delay_4uS();
	SDA=0;
	delay_4uS();
	SCL=0;
		
}
//----------------------------------------------------------------
 /*停止条件*/
//----------------------------------------------------------------
void Stop_01(void)
{
	SDA=0;
	SCL=1;
	delay_4uS();
	SDA=1;
	_nop_();
	_nop_();
}
//----------------------------------------------------------------
//检测应答位
//----------------------------------------------------------------
 void Ack(void)
{
	SDA = 1;
	SCL=1;
	_nop_();
	_nop_();
	while(SDA);
	SCL=0;

}


//----------------------------------------------------------------
/*反向应答位*/
//----------------------------------------------------------------
void NoAck(void)
{
	SDA=1;
	delay_4uS();
	SCL=1;
	delay_4uS();
	SCL=0;
}
//----------------------------------------------------------------
 /*发送数据子程序,Data为要求发送的数据*/
//----------------------------------------------------------------
void Send_01(void)
{
	uchar i; /*位数控制*/
	for(i=0;i<8;i++)
	  {		
	  	SDA = B7;
	  	buffer = buffer<<1;
		delay_4uS();
	  	SCL=1;
	  	delay_4uS();
		SCL = 0;		
	  }	
}

//-----------------------------------------------------------------------------
//读一个字节的数据,并返回该字节值,虽然资料说是负跳沿读出数据,
//可是在SCL高电平时读出才是正确的
//-----------------------------------------------------------------------------
void   Read_01(void)
{
	uchar i;
	SDA=1;
	for(i=0;i<8;i++)
	  {
	    buffer = buffer<<1;	
	  	SCL=1;
		_nop_();
		_nop_();
		B0 = SDA;	
		_nop_();
		SCL=0;
		_nop_();
		_nop_();
	  }
}

//----------------------------------------------------------------
//数据块写入,传递参数:数据块首址、写入地址、数据块长度
//---------------------------------------------------------------
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(); /*发送启动信号*/
		buffer = AddWr; 
		Send_01(); /*选择器件*/
		Ack();
		buffer = Address+i;
		Send_01(); /*发送地址*/
		Ack();
		buffer = *(PData+i);
		Send_01();
		Ack();
		Stop_01();
		mS_Delay(15);
	  }
	WP = 1;
}
//----------------------------------------------------------------
//数据块读出,传递参数:数据块首址、读出地址、数据块长度
//---------------------------------------------------------------
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();
	  }
}
//-------------------------------------------
//串口发送子程序,条件: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)
{
	mS_Delay(1);
	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    = 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); /*将初始化后的数值写入EEPROM*/
	mS_Delay(20);
	for(i=0;i<50;i++)
	  {
	  	Number[i]=i+50;	
	  }
	WrToROM(Number,50,50); /*将初始化后的数值写入EEPROM*/
	mS_Delay(20);
	for(i=0;i<50;i++)
	  {
	  	Number[i]=i+100;	
	  }
	WrToROM(Number,100,50); //将初始化后的数值写入EEPROM
	mS_Delay(20);
	for(i=0;i<50;i++)
	  {
	  	Number[i]=i+150;	
	  }
	WrToROM(Number,150,50); //将初始化后的数值写入EEPROM
	mS_Delay(20);
	for(i=0;i<50;i++)
	  {
	  	Number[i]=i+200;	
	  }
	WrToROM(Number,200,50); //将初始化后的数值写入EEPROM
	mS_Delay(20);
	for(i=0;i<255;i++)
	  {
	  	RdFromROM(Number,i,1);
		TI = 1;
		ser_send(Number[0]);
	  }
	WP= 1;				 		//将AT24C01A写保护
	while(1);
}

⌨️ 快捷键说明

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