不讲原理(网上详细讲原理的有很多),只讲其代码实现。对于单片机使用者来说,IIC总线通讯实现具体分两种,一种是硬件实现,另一种是软件模拟,硬件实现相对简单,一般芯片数据手册会提供官方例程,只需要配置寄存器就可以,所以今天不讲IIC的硬件实现。至于软件模拟,大部分会用在相对低端的芯片上,比如89C51/52系列等,有时即便是带有硬件IIC的芯片也会使用软件模拟,因为有些硬件IIC做的并不完美。下面就以代码加注释的方式实现IIC通讯。(说明:测试单片机为STC12C5A60S2,晶振11.0592M,完全测试通过)
C文件
#include "IIC.h"
void Delayms(unsigned int ms) //毫秒级延时函数
{
unsigned char i, j;
unsigned int k;
for(k=0;k<ms;k++)
{
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
}
void Delay2us() //2us延时,用于稳定IO状态
{
unsigned char i;
_nop_();
_nop_();
i = 2;
while (--i);
}
void IIC_Delay() //IIC延时,需大于4.7us,这里取8us
{
unsigned char i;
i = 19;
while (--i);
}
void IIC_IO_Init() //IO口初始化,使总线处于空闲状态
{
IIC_SCL = 1;
IIC_SDA = 1;
}
void IIC_Start() //总线开始
{
IIC_SDA = 1;
IIC_SCL =