about EEPROM 24c64 communication with 89s52

Thread Starter

visva

Joined Sep 1, 2012
3
help me for the following doubts:

i have interfaced EEPROM(24c64) with 89s52). but i can't understand what is the process in it. i know something about it. its having sda pin(pin 5) for serial data communication and scl pin (pin 6) for control signal.
question:
1. how to do the read and write operation on it.
2. In the following program doing some serial communication which is taken from engineersgarage.com http://www.engineersgarage.com/micro...T89C51-circuit

3. In that program what is device address
4. what is calculation in extracting MSB.
5. tell me simple procedure for do a own program.



Rich (BB code):
//Program to interface Serial EEPROM AT24C02 with 8051 microcontroller (AT89C51) 
#include<reg51.h>
#include<intrins.h>   //For using [_nop_()]
sbit sda=P1^0;
sbit scl=P1^1;
sbit led=P0^3;
bit ack;
sbit led1=P0^1;
sfr lcd_data_pin=0xA0;//p2 port
sfr output=0x80;//p0 port
sbit rs=P3^0;
sbit rw=P3^1;
sbit en=P3^6;
unsigned char reead,write,write2,i,j;
unsigned int temp;
void delay(unsigned int count)
{
	int i,j;
	for(i=0;i<count;i++)
		for(j=0;j<1275;j++);
}
void lcd_command(unsigned char comm)
{
	lcd_data_pin=comm;
	en=1;
	rs=0;
	rw=0;
	delay(1);
	en=0;
}
void lcd_data(unsigned char disp)
{
	lcd_data_pin=disp;
	en=1;
	rs=1;
	rw=0;
	delay(1);
	en=0;
}
void lcd_dataa(unsigned char *disp)
{
	int x;
	for(x=0;disp[x]!=0;x++)
	{
		lcd_data(disp[x]);
	}
}
void lcd_ini()
{
	lcd_command(0x38);		  // for using 8-bit 2 row LCD 
	delay(5);
	lcd_command(0x0F);        // for display on, cursor blinking
	delay(5);
	lcd_command(0x80);
	delay(5);
}
void aknowledge()	  //acknowledge condition
{
	scl=1;
	_nop_();
	_nop_();
	scl=0;
} 
void start()		//start condition
{
	sda=1;
	scl=1;
	_nop_();         //No operation
	_nop_();
	sda=0;
	scl=0;
}
void stop()			//stop condition
{
	sda=0;
	scl=1;
	_nop_();
	_nop_(); 
	sda=1;
	scl=0;
}
void send_byte(unsigned char value)	//send byte serially
{ 
	unsigned int i;
	unsigned char send;
	send=value;
	for(i=0;i<8;i++)
	{
		sda=send/128;			//extracting MSB
		send=send<<1;			//shiftng left
		scl=1;
		_nop_();
		_nop_();
		scl=0;
	}
   ack=sda;					//reading acknowledge
   sda=0;
}
unsigned char read_byte()			//reading from EEPROM serially
{
	unsigned int i;
	sda=1;
	reead=0;
	for(i=0;i<8;i++)
	{
		reead=reead<<1;
		scl=1;
		_nop_();
		_nop_();
		if(sda==1)
			reead++;
		scl=0;
	}
	sda=0;
	return reead;				//Returns 8 bit data here
}		
void save()					//save in EEPROM
{
	start();
	send_byte(0xA0);						//device address
	aknowledge();
	send_byte(0x00);						//word address
	aknowledge();
	send_byte(5);							//send data
	aknowledge();
	send_byte(65);
	aknowledge();
	stop();							   
	if(ack==0)
	{
		led1=1;
		delay(100);
		led1=0;
		delay(100);
		lcd_command(0x86);
		lcd_data('5');
		lcd_command(0x87);
		lcd_data('A');
	}
	else
		led1=1;
	aknowledge();
}
void Read()
{
	start();
	send_byte(0xA0);
	aknowledge();
	send_byte(0x00);
	aknowledge();
	start();
	send_byte(0xA1);					 //device address
	aknowledge();
	i=read_byte();
	aknowledge();
	j=read_byte();
	aknowledge();
	stop();
	if(i==5)
	{
		led=0;
		delay(100);
		led=1;
		delay(100);
		write=i+48;
		lcd_command(0xC6);
		lcd_data(write);	
	}
	else
	 led=1;
	if(j==65)
	{
		lcd_command(0xC7);
		lcd_data(j);
	}
	aknowledge();
}

int main()
{
	lcd_ini();
	lcd_dataa("Sent :");
	lcd_command(0xC0);
	lcd_dataa("Read :");
	temp=0;
	while(1)
	{
		save();
		Read();
	}
	return 0;
}
 
Top