16.3 C51模拟I2C总线协议

在实际应用中,往往遇到所使用的单片机没有I2C总线接口,例如典型的51系列单片机。为了让此类单片机用于操作I2C总线器件的能力,往往需要在程序模拟I2C总线数据传输协议。

这里以典型的51系列单片机为例,假设其外接6MHz的晶振,采用P1.0作为时钟线SCL,P1.1作为数据线SDA。在C51语言的程序中,首先需要声明SCL和SDA所使用的引脚,其声明如下所示。


sbit SCL=P1^0;sbit SDA=P1^1;

16.3.1 延时子函数

此处给出一个典型的延时子函数。当单片机的工作频率比较高的时候,为了保证I2C总线的传输速率满足100kHz或者400kHz的限制,可以进行适当的延时处理,用户可以根据需要使用。延时子函数的程序示例如下。


void Delays(unsigned int number)//延时子程序

{

unsigned char temp;

for(;number!=0;number—)//循环

{

for(temp=0;temp<100;temp++)//空循环

{

}

}

}


该程序中,通过双重for循环语句来执行空循环,以达到延时的目的。该函数延时的大小取决于工作频率和number值。