您的位置 首页 开关

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

/****************************************************************I2C总线协议程序**************************

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

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);

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/dianyuan/kaiguan/275339.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部