51单片机I2C标准函数程序
#include<REG52.h>
#include<intrins.h>
#include<stdio.h>
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<no;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<no;i++)
{
*rp=ReadByte(); //发送应答位
Ack();
rp++;
}
*rp=ReadByte();
NoAck(); //发送非应答位
Stop(); //释放总线
return(1); }
void main() {
}。