51单片机I2C标准函数程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

51单片机I2C标准函数程序

#include

#include

#include

typedef unsigned char uchar;

typedef unsigned int uint;

sbit SDA=P1^1;

sbit SCL=P1^0;

//===================================================== =========================

void Start()//开始信号

{

SDA=1;

SCL=1;

_nop_();

_nop_();

SDA=0;

_nop_();

_nop_();

SCL=0;

}

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

void Stop() //停止信号

{

SDA=0;

SCL=1;

_nop_();

_nop_();

SDA=1;

_nop_();

_nop_();

SDA=0;

SCL=0;

}

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

void Ack()//应答信号

{

SDA=0;

SCL=1;

_nop_();

_nop_();

SCL=0;

SDA=1;

}

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

void NoAck() //非应答信号

{

SDA=1;

SCL=1;

_nop_();

_nop_();

SCL=0;

SDA=0;

}

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

bit TestACk()//检查应答信号

{

bit Cack=0;

SDA=1;

SCL=1;

Cack=SDA;

SCL=0;

return(Cack);

}

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

void WriteByte(uchar input)//向I2C从设备中写入1字节

{

uchar i;

for(i=8;i!=0;i--)

{

SDA=(bit)(inupt&0x80);

SCL=1;

_nop_();

_nop_();

input=input<<1;

}

}

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

/*向有内部地址的器件写入多字节,ads为器件地址,sads为器件内部地址,指针wp指向要

发送的字节,no为字节数。发送成功返回1,失败返回0。*/

bit Write_nB_sads(uchar ads,uchar sads,uchar *wp,uchar no)

{

uchar i;

BEGIN:

Start(); //启动总线

WriteByte(ads); //发送器件地址

if(TestAck()) goto BEGIN;

WriteByte(sads); //发送器件分地址

if(TestAck()) goto BEGIN;

for(i=0;i

{

WriteByte(*wp); //发送数据

if(TestAck()) goto BEGIN;

wp++;

}

Stop(); //释放总线

return(1);

}

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

uchar ReadByte()//从I2C从设备中读出1字节

{

uchar i;rbyte=0;

SDA=1;

for(i=8;i!=0;i--)

{

rbyte=rbyte<<1;

rbyte=rbyte|((uchar)(SDA));

SCL=0;

}

return(rbyte);

}

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

/*向有内部地址的器件写入多字节,ads为器件地址,sads为器件内部地址,读出的数据存在

指针rp指向的内存空间,no为字节数。读出成功返回1,失败返回0。*/

bit Read_nB_sads(uchar ads,uchar sads,uchar *rp,uchar no)

{

uchar i;

BEGIN:

Start(); //启动总线

WriteByte(ads); //发送器件地址

if(TestAck()) goto BEGIN;

WriteByte(sads); //发送器件分地址

if(TestAck()) goto BEGIN;

Start(); //启动

WriteByte(ads+1);

if(TestAck()) goto BEGIN;

for(i=0;i

{

*rp=ReadByte(); //发送应答位

Ack();

rp++;

}

*rp=ReadByte();

NoAck(); //发送非应答位

Stop(); //释放总线

相关文档
最新文档