×
单片机 > 单片机程序设计 > 详情

[C51代码]I2C总线协议程序

发布时间:2020-05-23 发布时间:
|
/****************************************************************

       I2C总线协议程序

****************************************************************/

 

#define  NOP {_nop_();_nop_();_nop_();_nop_();} 

 

sbit SDA=P1^2;           /*模拟I2C数据传送位*/

sbit SCL=P1^3;           /*模拟I2C时钟控制位*/

bit ack;               /*应答标志位*/

  

void Start_I2c()

{

  SDA=1;  NOP;

  SCL=1;  NOP;  

  SDA=0;  NOP;       

  SCL=0;  NOP;

}

 

void Stop_I2c()

{

  SDA=0;  NOP; 

  SCL=1;  NOP;

  SDA=1;  NOP; 

}

 

void  Senduchar(uchar c)

{

  uchar i;

  for(i=0;i<8;i++)

  {

     c<<=1;

     SDA=CY; NOP;

     SCL=1;  NOP;         

     SCL=0;  NOP;

  }

   

  SDA=1;  NOP;    

  SCL=1;  NOP;  

  if(SDA==1) ack=0; 

  else ack=1;      

  SCL=0;  NOP;

}

 

uchar  Rcvuchar()

{

  uchar i,x=0;

  SDA=1;            

  for(i=0;i<8;i++)

  {

    SCL=0;  NOP;  

    SCL=1;  NOP;

    x=x<<1;

    if(SDA) x=x+1;

    NOP;

  }

  SCL=0;  NOP; 

  return(x);

}

 

void Ack_I2c(bit a)

{

 

  SDA=a; NOP;       

  SCL=1; NOP;  

  SCL=0; NOP;   

}

bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)

{

   uchar i;

 

   Start_I2c();               /*启动总线*/

   Senduchar(sla);            /*发送器件地址*/

   if(ack==0)return(0);

   Senduchar(suba);           /*发送器件子地址*/

   if(ack==0)return(0);

 

   for(i=0;i

   {  

     Senduchar(*s);           /*发送数据*/

     if(ack==0)return(0);

     s++;

   }

  Stop_I2c();                 /*结束总线*/

  return(1);

}

 

bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)

{

   uchar i;

 

   Start_I2c();               /*启动总线*/

   Senduchar(sla);            /*发送器件地址*/

   if(ack==0)return(0);

   Senduchar(suba);           /*发送器件子地址*/

   if(ack==0)return(0);

 

   Start_I2c();

   Senduchar(sla+1);

   if(ack==0)return(0);

 

   for(i=0;i

    {  

     *s=Rcvuchar();           /*发送数据*/

      Ack_I2c(0);             /*发送就答位*/ 

     s++;

    }

   *s=Rcvuchar();

   Ack_I2c(1);                /*发送非应位*/

   Stop_I2c();                /*结束总线*/

   return(1);

}

关键字:C51代码  I2C总线协议 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多