打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
I2C串行总线标准驱动程序(C51)

原文:http://pcwebmaster.blog.163.com/blog/static/28369470200801775255860/
         http://blog.sina.com.cn/s/blog_4dd213a101000bkf.html

I2C串行总线标准驱动程序(C51)-万能程序

/*------------------------------------------------------------------------------------------

[文件名] I2C.c

[版本] 1.1b

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

#i nclude "reg51.h"

#i nclude "intrins.h"

unsigned char SystemError;

sbit SCL= P1^6; //定义串行时钟线所在口 使用时根据自己的需要来定义

sbit SDA= P1^7; //定义串行数据线所在口 使用时根据自己的需要来定义

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

/*--------------------------------------------------------------------------------

调用方式:void AD7416_I2CStart(void) 2003/05/04

函数说明:私有函数,I2C专用

---------------------------------------------------------------------------------*/

void I2CStart(void)

{

EA=0;

SDA=1; SCL=1; SomeNOP();//数据线保持高,时钟线从高到低一次跳变,I2C通信开始

SDA=0; SomeNOP();

SCL=0;

}

/*--------------------------------------------------------------------------------

调用方式:void AD7416_I2CStop(void) 2003/05/04

函数说明:私有函数,I2C专用

---------------------------------------------------------------------------------*/

void I2CStop(void)

{

SCL=0; SDA=0; SomeNOP(); //数据线保持低,时钟线从低到高一次跳变,I2C通信停止

SCL=1; SomeNOP(); SDA=1;

EA=1;

}

/*--------------------------------------------------------------------------------

调用方式:I2CAck(void) 2003/05/13

函数说明:私有函数,I2C专用,等待从器件接收方的应答

ACK BY AD7416

---------------------------------------------------------------------------------*/

WaitAck(void)

{

unsigned char errtime=255;//因故障接收方无ACK,超时值为255。

SDA=1;

SCL=1;

SystemError=0x10;

while(SDA)

{ errtime--;

if(!errtime)

{ AD7416_I2CStop();

AD7416_SystemError=0x11; //出错后给全局变量赋值

return;

}

}

SCL=0;

}

/*--------------------------------------------------------------------------------

调用方式:void SendAck(void) ﹫2003/05/13

函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,应答信号。

---------------------------------------------------------------------------------*/

void SendAck(void)

{

SDA=0; SomeNOP(); //数据线保持低,时钟线发生一次从高低的跳变 发送一个应答信号

SCL=1; SomeNOP();

SCL=0;

}

/*--------------------------------------------------------------------------------

调用方式:void SendAck(void) ﹫2003/05/13

函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,非应答信号。

--------------------------------------------------------------------------------*/

void SendNotAck(void)

{

SDA=1; SomeNOP(); //数据线保持高,时钟线发生一次从高低的跳变 没有应答

SCL=1; SomeNOP();

SCL=0;

}

/*--------------------------------------------------------------------------------

调用方式:void I2CSend(uchar ch) 2003/05/13

函数说明:私有函数,I2C专用

---------------------------------------------------------------------------------*/

void I2CSendByte(Byte ch)

{

unsigned char i=8;

while (i--)

{

SCL=0;_nop_();

SDA=(bit)(ch&0x80); ch<<=1; SomeNOP(); //时钟保持低可以发送数据

SCL=1; SomeNOP();

}

SCL=0;

}

/*--------------------------------------------------------------------------------

调用方式:uchar I2CReceive(void) 2003/05/13

函数说明:私有函数,I2C专用

---------------------------------------------------------------------------------*/

Byte I2CReceiveByte(void)

{

unsigned char i=8,data=0;

SDA=1;

while (i--)

{

data<<=1;

SCL=0;SomeNOP();

SCL=1;SomeNOP(); //时钟做一次从低到高的跳变 可以接收数据

data|=SDA;

}

SCL=0;

return data;

}


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
I2c串行总线组成及其工作原理
I2C 串行总线的组成及工作原理
学51单片机-基于PCF8591的AD采样和DA输出【实际应用篇】
I2C 24LC02 C读写例程(PIC单片机)
EX85 将数据"0X0F"写入AT24C02再读出送P1口显示
基于51单片机的PCF8591电压测量
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服