STC 51单片机 普通IO口模拟IIC(I2C)接口通讯的程序代码

(改自周立功软件包)

#include <reg51.h>
#include <intrins.h>

#define   uchar unsigned char   
#define   uint   unsigned int
extern void Delay1us(unsigned char );

sbit SDA=P1^6;              
sbit SCL=P1^7;              

bit ack;            



void Start_I2c()
{
   SDA=1;     
   Delay1us(1);
   SCL=1;
   Delay1us(5);      
   
   SDA=0;     
   Delay1us(5);      
        
   SCL=0;     
   Delay1us(2);
}


void Stop_I2c()
{
   SDA=0;   
   Delay1us(1);     
   SCL=1;   
   Delay1us(5);
  
   SDA=1;   
   Delay1us(4);
}


void   SendByte(uchar c)
{
uchar BitCnt;

for(BitCnt=0;BitCnt<8;BitCnt++)   
     {
      if((c<<BitCnt)&0x80)SDA=1;   
        else   SDA=0;               
      Delay1us(1);
      SCL=1;               
      
      Delay1us(5);              
            
      SCL=0;
     }
   
     Delay1us(2);
     SDA=1;                 
     Delay1us(2);   
     SCL=1;
     Delay1us(3);
     if(SDA==1)ack=0;     
        else ack=1;         
     SCL=0;
     Delay1us(2);
}


uchar   RcvByte()
{
   uchar retc;
   uchar BitCnt;
  
   retc=0;
   SDA=1;               
   for(BitCnt=0;BitCnt<8;BitCnt++)
       {
         Delay1us(1);   
         SCL=0;                  
        
         Delay1us(5);                  
      
         SCL=1;                  
         Delay1us(3);
         retc=retc<<1;
         if(SDA==1)retc=retc+1;   
         Delay1us(2);
       }
   SCL=0;   
   Delay1us(2);
   return(retc);
}


void Ack_I2c(bit a)
{
  
   if(a==0)SDA=0;            
         else SDA=1;
   Delay1us(3);      
   SCL=1;
  
   Delay1us(5);                     
   
   SCL=0;                     
   Delay1us(2);   
}



bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
{
    uchar i;

    Start_I2c();               
    SendByte(sla);              
    if(ack==0)return(0);
    SendByte(suba);            
    if(ack==0)return(0);
    for(i=0;i<no;i++)
    {   
      SendByte(*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();                  
    SendByte(sla);                 
    if(ack==0)return(0);
    SendByte(suba);               
    if(ack==0)return(0);
    Start_I2c();     
    SendByte(sla+1);
    if(ack==0)return(0);
    for(i=0;i<no-1;i++)
    {   
      *s=RcvByte();               
       Ack_I2c(0);                   
      s++;
    }
    *s=RcvByte();
    Ack_I2c(1);                    
    Stop_I2c();                    
    return(1);
}

说明:这个软件我删减了一部分,主要是改写了延时子程序部分,使之适合STC12C2052/5410系列的单片机时序!

改动后可以很好的应用在STC单片机上,应用时主要使用

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

bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
这两个函数,就可以实现对有子地址的器件的读写!

 

posted @ 2013-03-17 17:38  天涯海角路  阅读(3220)  评论(0)    收藏  举报