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

📄 24c04.c

📁 提供给51单片机24C02存储驱动
💻 C
字号:
/*****************************************

说明:
用短路子短接 P0.1-P0.2 、P1.3-P1.5、PP5 的接线柱
下载完程序通电后,若 P00 的 LED 亮,则读写过程出现错误
若 P01 的 LED 亮,则读写过程正确
   
中国矿业大学    电子协会
    刘滨   2008年9月

*****************************************/
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define WRITE 0xA0                       /* 定义24C04的器件地址SLA和方向位W */
#define READ 0xA1                        /* 定义24C04的器件地址SLA和方向位R */
#define FALSE 0
#define TRUE ~FALSE
//////////////////////////////////////////////////////////////////////
#define HIGH 1
#define LOW 0
#define FALSE 0
#define TRUE ~FALSE
sbit SDA = P1^5;
sbit SCL = P1^4;
sbit WP = P1^3;
/*#define SDA  P2_7
#define SCL  P2_6*/
/****************************************************************************
*    函数原型: void delay(void);
*    功    能: 本函数实际上只有一条返回指令, 在具体应用中可视具体要求增加延时 
*              指令。
****************************************************************************/
void delay( void ) 
{
}
/****************************************************************************
*    函数原型: void I_start(void);
*    功    能: 提供I2C总线工作时序中的起始位。                             
****************************************************************************/
void I_start( void ) 
{
	SCL = HIGH ;
	delay() ;
	SDA = LOW ;
	delay() ;
	SCL = LOW ;
	delay() ;
 }
/****************************************************************************
*    函数原型: void I_stop(void);
*    功    能: 提供I2C总线工作时序中的停止位。
****************************************************************************/
void I_stop( void ) 
{
	SDA = LOW ;
	delay() ;
	SCL = HIGH ;
	delay() ;
	SDA = HIGH ;
	delay() ;
	SCL = LOW ;
	delay() ;
 }
/****************************************************************************
*    函数原型: void I_init(void);
*    功    能: I2C总线初始化。在main()函数中应首先调用本函数, 然后再调用
*              其它函数。
****************************************************************************/
void I_init( void ) 
{
	SCL = LOW ;
	I_stop() ;
}
/****************************************************************************
*    函数原型: bit I_clock(void);
*    功    能: 提供I2C总线的时钟信号, 并返回在时钟电平为高期间SDA 信号线上状
*              态。本函数可用于数据发送, 也可用于数据接收。
****************************************************************************/
bit I_clock( void ) 
{
	bit sample ;
	SCL = HIGH ;
	delay() ;
	sample = SDA ;
	SCL = LOW ;
	delay() ;
	return ( sample ) ;
 }
/****************************************************************************
*    函数原型: bit I_send(uchar I_data);
*    功    能: 向I2C总线发送8位数据, 并请求一个应答信号ACK。如果收到ACK应答
*              则返回1(TRUE), 否则返回0(FALSE)。
****************************************************************************/
bit I_send( uchar I_data ) 
{
	uchar i ;
	/* 发送8位数据 */
	for ( i=0 ; i<8 ; i++ ) 
	{
		SDA = (bit)( I_data & 0x80 ) ;
		I_data = I_data << 1 ;
		I_clock() ;
	}
	/* 请求应答信号ACK */
	SDA = HIGH ;
	return ( ~I_clock() );
  }
/****************************************************************************
*    函数原型: uchar I_receive(void);
*    功    能: 从I2C总线上接收8位数据信号, 并将接收到8位数据作为一个字节
*              返回, 不回送应答信号ACK。主函数在调用本函数之前应保证SDA信
*              号线处于浮置状态, 即使8051的P1.7脚置1。
****************************************************************************/
uchar I_receive( void ) 
{
	uchar I_data = 0;
	register uchar i ;
	for ( i=0 ; i<8 ; i++ ) 
	{
		I_data *= 2 ;
		if (I_clock()) I_data++;
	}
	return ( I_data ) ;
}
/****************************************************************************
*    函数原型: void I_Ack(void);
*    功    能: 向I2C总线发送一个应答信号ACK, 一般用于连续数据读取时。
*****************************************************************************/
void I_Ack( void ) 
{
	SDA = LOW ;
	I_clock() ;
	SDA = HIGH ;
}
/****************************************************************************
*    函数原型: bit E_address(uchar Address);
*    功    能: 向24C04写入器件地址和一个指定的字节地址。
*****************************************************************************/
bit E_address( uchar Address ) 
{
	I_start() ;
	if ( I_send( WRITE ) )
		return ( I_send( Address ) ) ;
	else
		return ( FALSE ) ;
}
/****************************************************************************
*    函数原型: bit E_read_block(void);
*    功    能: 从24C04中读取BLOCK_SIZE个字节的数据并转存于外部RAM存储映象
*              单元, 采用序列读操作方式从片内0地址开始连续读取数据。如果
*              24C04不接受指定的地址则返回0(FALSE)。
*****************************************************************************/
uchar E_read(uchar add ) 
{   uchar rec=0;
         E_address(add); 
		 I_start() ;
	     I_send( READ ); 
		 rec = ( I_receive() );	
    	 I_clock() ;
		 I_stop() ;
         return rec;
}
/****************************************************************************
*    函数原型: void wait_5ms(void);
*    功    能: 提供5ms延时(时钟频率为12MHz)。
*****************************************************************************/
void wait_5ms( void ) 
{
	int i ;
	for ( i=0 ; i<1000 ; i++ ); 
}
/****************************************************************************
*    函数原型: bit E_write_block(void);
*    功    能: 将外部RAM存储映象单元中的数据写入到24C04的头BLOCK_SIZE个字节。
*              采用字节写操作方式, 每次写入时都需要指定片内地址。如果24C04
*              不接受指定的地址或某个传送的字节未收到应答信号ACK, 则返回0
*              (FALSE)。
*****************************************************************************/
void  E_write( uchar s,uchar add ) 
{  
		if ( E_address(add) ) 
		   {  if(I_send(s))
			    {
				 I_stop() ;
				 wait_5ms();
			  	}
           }
}

/*********************** 主函数 ************************/
void main(void)
{
	static code CODE[16] = {									 
		0xb0,0xa0,0xb0,0xa0,0xd0,0xb4,0xd0,0xc2,0xce,0xc4,0xd5,0xc2,0xb0,0xa0,0xb0,0xa0,
		};
	uint n=0;
	uint i;
	P0 = 0;

	I_init();
	WP = 0;
	for(i = 0;i < 16;i ++)
	{
		E_write(CODE[i],i);
	}

	for(i = 0;i < 16;i ++)
	{
		if(CODE[i] != E_read(i)) 
		{
			P0 = 0x01;	 //如果读出来的值和写进的值不一样,则 P00 发光二极管点亮
			break;
		}
		P0 = 0x02;
	}
	
	while(1);
}  

⌨️ 快捷键说明

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