下面是用普通C51實現的I2C基本電平模擬函數和通用函數。 /*電平模擬函數和基本讀寫函數 voidIIC_Start(void); voidIIC_Stop(void); voidSEND_0(void); voidSEND_1(void); bitCheck_Acknowledge(void); voidWrite_Byte(ucharb)reentrant; bitWrite_N_Bytes(uchar*buffer,ucharn)reentrant; bitRead_N_Bytes(ucharSlaveAdr,ucharn,uchar*buffer); ucharRead_Byte(void)reentrant; */ #include #include #include #include"aiic_51.h" sbitSCL=P1^6; sbitSDA=P1^7; voidDELAY(uintt) { while(t!=0) t--; } voidIIC_Start(void) { //啟動I2C總線的函數,當SCL為高電平時使SDA產生一個負跳變 SDA=1; SCL=1; DE LAY(DELAY_TIME); SDA=0; DELAY(DELAY_TIME); SCL=0; DELAY(DELAY_TIME); } voidIIC_Stop(void) { //終止I2C總線,當SCL為高電平時使SDA產生一個正跳變 SDA=0; SCL=1; DELAY(DELAY_TIME); SDA=1; DELAY(DELAY_TIME); SCL=0; DELAY(DELAY_TIME); } voidSEND_0(void) { //發送0,在SCL為高電平時使SDA信號為低 SDA=0; SCL=1; DELAY(DELAY_TIME); SCL=0; DELAY(DELAY_TIME); } voidSEND_1(void) { //發送1 ,在SCL為高電平時使SDA信號為高 SDA=1; SCL=1; DELAY(DELAY_TIME); SCL=0; DELAY(DELAY_TIME); } bitCheck_Acknowledge(void) { //發送完一個字節后檢驗設備的應答信號 SDA=1; SCL=1; DELAY(DELAY_TIME/2); F0=SDA; DELAY(DELAY_TIME/2); SCL=0; DELAY(DELAY_TIME); if(F0==1) returnFALSE; returnTRUE; } voidWrite_Byte(ucharb)reentrant { //向IIC總線寫一個字節 uchari; for(i=0;i<8;i++) if((b< SEND_1(); else SEND_0(); } bitWrite_N_Bytes(uchar*buffer,ucharn)reentrantp; { //向I2C總線寫n個字節 uchari; IIC_Start(); for(i=0;i Write_Byte(buffer); if(!Check_Acknowledge()) { IIC_Stop(); return(i==n); } } IIC_Stop(); returnTRUE; } ; ucharRead_Byte(void)reentrant { //從I2C總線讀一個字節 ucharb=0,i; for(i=0;i<8;i++) { SDA=1;//釋放總線 SCL=1;//接受數據 DELAY(10); F0=SDA; DELAY(10); SCL=0; if(F0==1) { b=b<<1; b=b|0x01; } else b=b<<1; } returnb; } bitRead_N_Bytes(ucharSlaveAdr,ucharn,uchar*buffer) { //從I2C總線讀n個字節 uchari; IIC_Start(); Write_Byte(SlaveAdr);//向總線發送接收器地址 if(!Check_Acknowledge())//等待接收器應答信號 returnFALSE; for(i=0;i buffer=Read_Byte(); if(i!=n) SEND_0();//發送應答 else SEND_1();//發送非應答 } IIC_Stop(); ; returnTRUE; } 使用上述代碼,你可以在51上用P1口模擬I2C |