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

📄 i2c.c

📁 湖北水文信息系统水位雨量采集器的C51源代码
💻 C
字号:
 #include  "i2c.h"
/*I2C总线初始化程序*/

/*延时函数*/


void delay(void) 
{
  ;
}

/*停止信号函数*/
void I_stop(void)
{
	SDA=0;    	delay( );
 	SCL=1;     	delay( );
 	SDA=1;   	delay( );
}


/*起始信号函数*/
void I_start(void)
{
   SCL=1;      delay( );
   SDA=0;      delay( );
	SCL=0;      delay( );
}


void I_init(void)
{
   SCL=0;
   I_stop();
 }



/*提供i2c总线的时钟信号并返回在时钟电平为高期间SDA信号线上的状态*/
bit I_clock(void)reentrant
{
  bit idata sample;
  SCL =1;  
       delay( );
  sample=SDA; 
  SCL =0;  
       delay( );
  return(sample);
}

/*应答信号函数*/
void I_ACK(void)
{
  SDA=0;    
  I_clock();
  SDA=1;
}

/*时钟信号函数*/



/*数据发送函数*/
/*向I2C总线发送8位数据,并请求一个应答信号ACK,如果收到ACK应答,表示发送成功,并返回1*/

bit I_send(uchar I_data)
{
   register uchar send_num;
 	for(send_num=0;send_num<8;send_num++)
  	{
   	SDA=(bit)(I_data&0x80);

      I_data=I_data<<1;
      I_clock( );
    }

    SDA=1;
    return (~I_clock());
}


/*数据接收函数*/
/*从I2C总线上接收8位数据,将接收到的数据作为1个字节返回值*/
uchar I_receive(void)
 {
	register uchar rec_num;
	uchar I_data=0;
 
	for(rec_num=0;rec_num<8;rec_num++)
	{
		I_data*=2;
		if(I_clock()) I_data++;
	}
	return(I_data);
 }


 

/* 器件从地址和片内地址写入函数发出起始信号后,若地址写入成功
 则返回1,否则返回0*/// 

bit W_address(uchar wpage, uchar WStAddress) 
{
  I_start( );
   if(I_send(wpage))
  {
   return(I_send(WStAddress));
  } 
	else
     return(0);
}



////////////////////////////////////////////////////////////////////
/*5ms延时函数*/


/*void wait_5ms(void)
{
   register int i;
   for(i=0;i<1000;i++)
   {; }
} */


void wait_1ms(void)
{
   register int i;
   for(i=0;i<100;i++)
   {; }
}
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
 bit Wblock(uchar wpage, uchar WSAdd , uchar *StartChar, uchar length)reentrant 
 {

 register uchar Wnum;
 ////////////////////////////////////////////////////////////////////
 /*将映象数组中前length个字节数据写入24C16A的StartAddress前length个单元*/
 

   I_init();
 
  
 if (W_address(wpage,WSAdd))
 {
    for(Wnum=0;Wnum<length;Wnum++)
    {
       if(I_send(StartChar[Wnum])) ;
       else
     {
        I_stop();
	    return  0 ;
	  }
    }
    I_stop();
    return 1;
  }

    I_stop();
	return  0 ;
 }
 ////////////////////////////////////////////////////////////////////
void  W_block(uchar wpage, uchar WSAdd, uchar *StartChar, uchar length)reentrant 
 {
	register uchar i;
	uchar addr=0,nextchar=0,len=0;
	if((length%16)==0)
	{ 
		len=length/16;
		for(i=0;i<len;i++)
    	{
	 		Wblock(wpage, WSAdd+addr ,&StartChar[nextchar],16);
     		nextchar+=16;
     		addr+=16;
	 		wait_1ms();
		}
	}
	else
	{             
		len=(length/16)+1;
		for(i=0;i<len;i++)
   		{
			if(i==(len-1))
			{
				Wblock(wpage, WSAdd+addr ,&StartChar[nextchar],length%16);
				wait_1ms();
			}
			else
			{
	 			Wblock(wpage, WSAdd+addr ,&StartChar[nextchar],16);
	   			nextchar+=16;
 	  			addr+=16;
	 			wait_1ms();
			}
		}
	}
    
    
 }
   
 //////////////////////////////////////////////////////////////////// 
  /*将映象数组中前length个字节数据写入24C16A的前length个单元*/
 bit R_block(uchar wpage,uchar rpage, uchar RStAddress,  uchar  StartChar[], uchar length)reentrant 
 {

 register  uchar Rnum;
  
 I_init();
  
  if (W_address(wpage,RStAddress))
 {
    I_start();
    if (I_send(rpage)) 
 	{
       for( Rnum=0;Rnum<length ;Rnum++)
        {
	    	StartChar[Rnum]=I_receive();
			if (Rnum < (length-1))  I_ACK(); 
         }
         I_stop();
          return 1;
    }

  }

    I_stop();
	return  0 ;

 }



  ////////////////////////////////////////////////////////////////////



⌨️ 快捷键说明

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