本人初学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
}
//
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 <
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);
}