本人初学C,曾为这个问题大伤脑筋^_^,就是一个单片机系统有两个以上的相同地址的I2C设备,无法用两个同一对SDA/SCL引脚,
#include "stc89c51.h"
#include "iic.h"
sbit scl0=P3^5;
sbit sda0 = P3^4;
sbit scl1= P3^3;
sbit sda1 = P3^2;
//这里只写了两个I2C设备,如果需要可以再加上 sbit scl2=xx; sbit sda2=xx; 实际上多个设备的scl脚可以共用
unsigned char iic_delay_time = 8;
void scl(device,value);
void sda(device,value);
bit sdasense(char device);
// delay
void iic_delay(unsigned char m)
{
unsigned char n;
for(n=0;n<m;n++);
}
//
void scl(device,value)
{
if (device==0) //设备1
scl1=value;
if (device==1) //设备2
scl2=value;
}
void sda(device,value)
{
if (device==0) //设备1
sda1=value;
if (device==1) //设备2
sda2=value;
}
bit sdasense(char device)
{
switch(device)
{
case 1: return sda1;
break;
case 2: return sda2;
break;
}
}
//启动I2C总线的函数,当scl为高电平时使sda产生一个负跳变
void iic_start(device)
{
sda(device,1);
scl(device,1);
iic_delay(iic_delay_time);
sda(device,0);
iic_delay(iic_delay_time);
scl(device,0);
iic_delay(iic_delay_time/2);
}
//终止I2C总线,当scl为高电平时使sda产生一个正跳变
void iic_stop(device)
{
scl(device,0);
sda(device,0);
scl(device,1);
iic_delay(iic_delay_time);
sda(device,1);
iic_delay(iic_delay_time);
}
//发送应答信号
void iic_ack(device) {
sda(device,0);
scl(device,1);
scl(device,0);
sda(device,1);
}
//发送无应答信号
void iic_noack(device)
{
sda(device,1);
scl(device,1);
scl(device,0);
}
//检测应答信号
bit iic_testack(device)
{
bit errorbit; //真确应答,返回0
sda(device,1);
iic_delay(iic_delay_time);
scl(device,1);
iic_delay(iic_delay_time);
errorbit=sdasense(device);
scl(device,0);
iic_delay(iic_delay_time);
return(errorbit);
}
//发送一个字节
void iic_write8bit(device,unsigned char input)
{
unsigned char temp;
for(temp=0;temp<8;temp++)
{
if((input<<temp)&0x80)
sda(device,1);
else
sda(device,0);
scl(device,1);
iic_delay(iic_delay_time);
scl(device,0);
}
}
//读一个字节
unsigned char iic_read8bit(device)
{
unsigned char temp,rbyte=0;
for(temp=0;temp<8;temp++)
{
scl(device,1);
iic_delay(iic_delay_time);
if(sdasense(device))
rbyte=(rbyte<<1)+1;
else
rbyte=rbyte<<1;
scl(device,0);
}
return(rbyte);
}