電路原理圖
EEPROM為ATMEL公司的AT24C01A。單片機為ATMEL公司的AT89C51。
軟件說明
C語言為Franklin C V3.2。將源程序另存為testi2c.c,用命令
C51 testi2c.c
L51 TESTI2C.OBJ
OHS51 TESTI2C
編譯,連接,得到TESTI2C.HEX文件,即可由編程器讀入并進行寫片,實驗。
3.源程序
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineAddWr0xa0/*器件地址選擇及寫標志*/
#defineAddRd0xa1/*器件地址選擇及讀標志*/
#defineHidden0x0e/*顯示器的消隱碼*/
/*有關(guān)全局變量*/
sbitSda=P3^7;/*串行數(shù)據(jù)*/
sbitScl=P3^6;/*串行時鐘*/
sbitWP=P3^5;/*硬件寫保護*/
voidmDelay(ucharj)
{
uinti;
for(;j>0;j--)
{
for(i=0;i<125;i--)
{
;
}
}
}
/*發(fā)送起始條件*/
voidStart(void)/*起始條件*/
{
Sda=1;
Scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
Sda=0;
_nop_();
_nop_();
_nop_();
_nop_();
}
voidStop(void)/*停止條件*/
{
Sda=0;
Scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
Sda=1;
_nop_();
_nop_();
_nop_();
_nop_();
}
voidAck(void)/*應答位*/
{
Sda=0;
_nop_();
_nop_();
_nop_();
_nop_();
Scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
Scl=0;
}
voidNoAck(void)/*反向應答位*/
{
Sda=1;
_nop_();
_nop_();
_nop_();
_nop_();
Scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
Scl=0;
}
voidSend(ucharData)/*發(fā)送數(shù)據(jù)子程序,Data為要求發(fā)送的數(shù)據(jù)*/
{
ucharBitCounter=8;/*位數(shù)控制*/
uchartemp;/*中間變量控制*/
do
{
temp=Data;
Scl=0;
_nop_();
_nop_();
_nop_();
_nop_();
if((temp&0x80)==0x80)/*如果最高位是1*/
Sda=1;
else
Sda=0;
Scl=1;
temp=Data<<1;/*RLC*/
Data=temp;
BitCounter--;
}while(BitCounter);
Scl=0;
}
ucharRead(void)/*讀一個字節(jié)的數(shù)據(jù),并返回該字節(jié)值*/
{
uchartemp=0;
uchartemp1=0;
ucharBitCounter=8;
Sda=1;
do{
Scl=0;
_