本人初學C,曾為這個問題大傷腦筋^_^,就是一個單片機系統(tǒng)有兩個以上的相同地址的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腳可以共用
unsignedchariic_delay_time = 8;
voidscl(device,value);
voidsda(device,value);
bit sdasense(chardevice);
// delay
voidiic_delay(unsignedcharm)
{
unsignedcharn;
for(n=0;n } // voidscl(device,value) { if(device==0) //設備1 scl1=value; if(device==1) //設備2 scl2=value; } voidsda(device,value) { if(device==0) //設備1 sda1=value; if(device==1) //設備2 sda2=value; } bit sdasense(chardevice) { switch(device) { case1:returnsda1; break; case2:returnsda2; break; } } //啟動I2C總線的函數,當scl為高電平時使sda產生一個負跳變 voidiic_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產生一個正跳變 voidiic_stop(device) { scl(device,0); sda(device,0); scl(device,1); iic_delay(iic_delay_time); sda(device,1); iic_delay(iic_delay_time); } //發(fā)送應答信號 voidiic_ack(device) { sda(device,0); scl(device,1); scl(device,0); sda(device,1); } //發(fā)送無應答信號 voidiic_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); } //發(fā)送一個字節(jié) voidiic_write8bit(device,unsignedcharinput) { unsignedchartemp; 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); } } //讀一個字節(jié) unsignedchariic_read8bit(device) { unsignedchartemp,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); }