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

📄 at24c02.txt

📁 单片机读写at24c02的程序。 其中i2c部分可以提取出来用于所有i2c总线芯片中。
💻 TXT
字号:
#include <reg51.h>
#include <intrins.h>


#define uchar unsigned char
#define WRITE 0xA0            //器件地址和写命令
#define READ  0xA1            //器件地址和读命令
uchar code dis_code[8] = {0x7e,0xbd,0xdb,0xe7,0xdb,0xbd,0x7e,0xff};
void delayms(int ms);
sbit SCL = P3^3 ;
sbit SDA = P3^4 ;
void I_Init(void);
void I_Start(void);
void I_Stop(void);
bit I_Clock(void);
bit I_Send(uchar I_Data);
uchar I_Receive(void);
void I_Ack(void);

//初始化函数
void I_Init(void)
{
	SCL=0;
	I_Stop();
}

//启动函数
void I_Start(void)
{
	SDA = 1;
  _nop_();
  _nop_();
  SCL = 1;
  _nop_();
  _nop_();
  SDA = 0;
  _nop_();
  _nop_();
  SCL = 0;
}

//停止函数
void I_Stop(void)
{
	SDA = 0;
	_nop_();
	_nop_();
	SCL = 1;
	_nop_();
	_nop_();
	SDA = 1;
	_nop_();
	_nop_();
	SCL = 0;
}

  	
//时钟函数,读取时钟为高电平时总线上的data
bit I_Clock(void)
{
  bit sample;
  SCL = 1;
  _nop_();
  _nop_();
  sample = SDA;
  _nop_();
  _nop_();
  SCL = 0;
  return (sample);
}	


//CPU发送数据函数
bit I_Send(uchar I_Data)
{
	uchar i;
	for(i=0;i<8;i++)
	  {
	  	SDA = (bit)(I_Data & 0x80);
	  	I_Data <<= 1;
	  	I_Clock();
	  }
	SDA = 1;
	return (~I_Clock());
}

//CPU接收数据函数
uchar I_Receive(void)
{
	uchar I_Data = 0;
	uchar i;
	for(i=0;i<8;i++)
	  {
	  	I_Data <<= 1;
	  	I_Data |= (uchar)I_Clock();
	  }
	return I_Data;
}


//应答函数
void I_Ack(void)
{
	SDA = 0;
	I_Clock();
	SDA = 1;
}
//延时子程序
void delayms(int ms)
{
	uchar j;
	while(ms--)
	  for(j=0;j<125;j++)
	    ;
}
main()
{
	uchar i,j;                   
	i=0;
	I_Init();                    //初始化                   
	
	for(j=0;j<8;j++)             //写数据到24c02的地址0--地址7中
	{
      I_Start();
	  if( I_Send(WRITE) )    //写器件地址
        {         
		 
         if( I_Send(j) )            //写片内指定地址
		    {
		    	I_Send(dis_code[i++]); //写数据
		      delayms(5);            //写完一字节数据后要延时5秒钟
		    } 
		  else
			  {
				  I_Stop();
			    P0=0x00;
			  }
       }
	    else
		  {
				 I_Stop();
			    P0=0x00;
			}
	
	I_Stop();}
	delayms(20);
  while(1)                     //循环读取24C02地址0--地址7中的数据,并讲数据传送至P0口
    {
    	
    	for(j=0;j<8;j++)
    	{I_Start();
    		if( I_Send(WRITE) )      //写器件地址
    		  if(I_Send(j))        //写存储地址
    		  	{
    		  		I_Start();       //重新启动
    		  		if( I_Send(READ) ) //写读命令
    		  			{
    		  			  P0 = I_Receive();  //读数据到P0口
    		  			  delayms(1000);
    		  		  
    		  			if(j!=7)
    		  				I_Ack();
    		  			else
    		  				{
    		  				  I_Clock();
    		  				  I_Stop();
    		  				}
                        }
                }
    		  else
    		  	  	{
    		  	  		 I_Stop();
			             P0=0x00;
			          }
			       
			 else
			    	{
			    		 I_Stop();
			         P0=0x00;
			      }
			 }
		}
}

⌨️ 快捷键说明

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