51单片机I2C标准函数程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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(); //释放总线