I2C总线驱动的C语言源程序详细说明

i2c 总线上单片机系统中常用到的总线技术这里给大家介绍一个i2c总线驱动的c51语言源程序。
//#pragma ot(6,size)
#i nclude 《at89x52.h》
#i nclude 《intrins.h》
#define errorcount 10
#define readi2c 0xa1
#define writei2c 0xa0
sbit sda=p1^6;
sbit scl=p1^5;
enum eepromtype {m2401,m2402,m2404,m2408,m2416,m2432,m2464,m24128,m24256};
enum eepromtype eepromtype;
//databuff为读写数据输入/输出缓冲区的首址
//bytequantity 为要读写数据的字节数量
//address 为eeprom的片内地址
//controlbyte 为eeprom的控制字节,具体形式为(1)(0)(1)(0)(a2)(a1)(a0)(r/w),其中r/w=1,
//表示读操作,r/w=0为写操作,a2,a1,a0为eeprom的页选或片选地址;
//eepromtype为枚举变量,需为m2401至m24256中的一种,分别对应24c01至24c256;
//函数返回值为一个位变量,若返回1表示此次操作失效,0表示操作成功;
//errorcount为允许最大次数,若出现errorcount次操作失效后,则函数中止操作,并返回1
//sda和scl由用户自定义,这里暂定义为p0^0和p0^1;
//其余的用户不用管,只要把只子程序放在你的程序中并调用它就可以了;
/*******************************i2c总线驱动(c51语言源程序)**********************************************/
bit rw24xx(unsigned char *databuff,unsigned char bytequantity,unsigned int address,
unsigned char controlbyte,enum eepromtype eepromtype)
{
void delay(unsigned char delaycount);
void i2cstart(void);
void i2cstop(void);
bit i2crecack(void);
void i2cnoack(void);
void i2cack(void);
unsigned char i2creceivebyte(void);
void i2csendbyte(unsigned char sendbyte);
unsigned char data j,i=errorcount;
bit errorflag=1;
while(i--)
{
i2cstart();
i2csendbyte(controlbyte&0xfe);
if(i2crecack())
continue;
if(eepromtype》m2416)
{
i2csendbyte((unsigned char)(address》》8));
if(i2crecack())
continue;
}
i2csendbyte((unsigned char)address);
if(i2crecack())
continue;
if(!(controlbyte&0x01))
{
j=bytequantity;
errorflag=0; //********clr errorflag
while(j--)
{
i2csendbyte(*databuff++);
if(!i2crecack())
continue;
errorflag=1;
break;
}
if(errorflag==1)
continue;
break;
}
else
{
i2cstart();
i2csendbyte(controlbyte);
if(i2crecack())
continue;
while(--bytequantity)
{
*databuff++=i2creceivebyte();
i2cack();
}
*databuff=i2creceivebyte(); //read last byte data
i2cnoack();
errorflag=0;
break;
}
}
i2cstop();
if(!(controlbyte&0x01))
{
delay(255);
delay(255);
delay(255);
delay(255);
}
return(errorflag);
}
/*****************以下是对i2c总线的操作子程序***/
/*****************启动总线**********************/
void i2cstart(void)
{
scl=0; //
sda=1;
scl=1;
_nop_();
_nop_();
_nop_();
sda=0;
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
sda=1; //
}
/*****************停止i2c总线****************/
void i2cstop(void)
{
scl=0;
sda=0;
scl=1;
_nop_();
_nop_();
_nop_();
sda=1;
_nop_();
_nop_();
_nop_();
scl=0;
}
/**************检查应答位*******************/
bit i2crecack(void)
{
scl=0;
sda=1;
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
cy=sda; //因为返回值总是放在cy中的
scl=0;
return(cy);
}
/***************对i2c总线产生应答*******************/
void i2cack(void)
{
sda=0;
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
_nop_();
sda=1;
}
/*****************不对i2c总线产生应答***************/
void i2cnoack(void)
{
sda=1;
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
}
/*******************向i2c总线写数据*********************/
void i2csendbyte(unsigned char sendbyte)
{
unsigned char data j=8;
for(;j》0;j--)
{
scl=0;
sendbyte《《=1; //无论c51怎样实现这个操作,始终会使cy=sendbyte^7;
sda=cy;
scl=1;
}
scl=0;
}
/**********************从i2c总线上读数据子程序**********/
unsigned char i2creceivebyte(void)
{
register receivebyte,i=8;
scl=0;
while(i--)
{
scl=1;
receivebyte=(receivebyte《《1)|sda;
scl=0;
}
return(receivebyte);
}
/***************一个简单延时程序************************/
void delay(unsigned char delaycount)
{
while(delaycount--);
}
void main()
{
// unsigned int i;
//unsigned char j[32];
unsigned char *pa,*pb,temp=0;
unsigned char a[8]={5,6,7,8,9,10,11,12};
unsigned char b[8]={0,0,0,0,0,0,0,0};
pa=&a[0];
pb=&b[0];
p2_7=0;
rw24xx(pa,8,0x0,writei2c,m2401);
rw24xx(pa,8,0x20,writei2c,m2401);
rw24xx(pb,8,0x20,readi2c,m2401);
rw24xx(pb,8,0x30,writei2c,m2401);
// rw24xx(unsigned char *databuff,unsigned char bytequantity,unsigned int address,
// unsigned char controlbyte,enum eepromtype eepromtype)
while(1)
{
p2_7=1;
}
}

TD-SCDMA测试11月15日放号
IFA 2018展场相当有看头,三星推出全新的8K QLED电视
线性可变差动变压器 (LVDT) 简介
随机硬件故障的分类和安全要求
200G IDC长距离互连方案—200G QSFP56 ER4光模块
I2C总线驱动的C语言源程序详细说明
赛思晶振来袭!一文带你了解电路板上的“心跳”
电池管理系统的低功耗、多路温度测量
CAN报文发送有优先级吗?
华为发布了50W超快速垂直无线充电器
足球上的物联网是怎样的
ChatGPT背后的开源AI框架Ray,现在值10亿美元
以C8051F340单片机为监测终端控制器的无线收发电路设计
石油化工定位系统助力化企落实风险管控
传闻中的小米Mi 10T Pro和Mi 10T规格
教你如何选择合适的大电流功率电感器
华为海外市场份额的大幅下滑,小米OV抢到了多少份额
成熟电池管理系统应具备的十大功能
图书馆AI机器人给我们带来了什么便利
全球第一批无钴电池长什么样