pic i2c硬件通信程序 c语言,PIC单片机的I2C 24LC02 C读写程序

来源:本站整理  作者:佚名  2009-12-29 11:59:18

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

起动总线函数

函数原型: void start_i2c();

Function: start on the I2C bus

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

void start_i2c()

{

SDA=1; //发送启始条件的数据信号

nop();

SCL=1;

nop();nop();nop();nop();nop(); //24LC02要求建立时间大于4,7S

SDA=0; //发送起始信号

nop();nop();nop();nop();nop();

SCL=0; //钳住I2C总线,准备发送数据或接收数据

nop();nop();

}

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

停止总线函数

函数原型: void stop_i2c();

Function: stop the I2C bus

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

void stop_i2c()

{

SDA=0; //发送结束条件的数据信号

nop();

SCL=1;

nop();nop();nop();nop();nop();

SDA=1;

nop();nop();nop();nop();

}

/*====================================================

字节数据传送函数

函数原型: void send_byte(uchar c);

Function: 将数据C发送出去,可以是地址,也可以是数据,发完后等待回应,并对此状态

位进行操作(不应答或非应答都使ack=0 ),发送数据正常,ack=1;ack=0

表示被控器无应答或损坏。

====================================================*/

void send_byte(uchar c)

{

uchar bit_count;

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

{

if ((c<

else {SDA=0;}

nop();

SCL=1;

nop();nop();nop();nop();nop();

SCL=0;

}

nop();nop();

SDA=1;

nop();nop();

SCL=1;

nop();nop();nop();

if (RC4==1) ack=0;

else ack=1; //用ASK=1为有应答信号

SCL=0;

nop();nop();

}

/*================================================

字节数据接收函数

函数原型:uchar receive_byte();

FUNCTION: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),

发完后请用应答函数。

====================================================*/

uchar receive_byte()

{

uchar retc,bit_count;

retc=0;

SDA=1;

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

{

nop();

SCL=0;

nop();nop();nop();nop();nop();

SCL=1;

nop();nop();

retc=retc<<1;

if (RC4==1) retc=retc+1;

nop();nop();

}

SCL=0;

nop();nop();

return (retc);

}

/*=================================================

向有子地址器件发送多字节数据函数

函数原型: bit I_send_str(uchar sla,uchar suba,uchar *s,uchar no);

Function: 从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla。如果

返回1表示操作成功,否则操作有误。

================================================*/

void I_send_str(uchar sla,uchar suba,uchar *s,uchar no)

{

uchar i;

start_i2c();

send_byte(sla);

if (ack==0) i2c_error();

send_byte(suba);

if (ack==0) i2c_error();

for (i=0;i

{

send_byte(*s);

if (ack==0) i2c_error();

s++;

}

stop_i2c();

// return(1);

}

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

延时函数

函数原型: void delay_250ms();

FUNCTION: 延明250ms

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

void delay_250ms()

{

unsigned int d=24999;

while (--d);

}

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

总线错误函数

函数原型: void i2c_error();

Function: 通过RD7闪动8次表示总线操作失败一次报警。

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

void i2c_error ()

{

uchar i;

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

{

RD7=0;

delay_250ms();

RD7=1;

delay_250ms();

}

}

/**********END**************/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值