这是小弟写的AT24C02的测试程序,读出来 老是0xAA,请高手指点一下...
uchar dd,kkk,bm;
void T1_interrupt() interrupt 3 { kkk=1; TR1=0; }
//延时 void Delay(uchar time) { uchar i; for(i=0;i<time;i++) { _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); } }
void mack()//主机应答 { SDA=0; SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); SCL=0; // SCL=1;///////////// SDA=1; } void mnack()//主机非应答 { SDA=1; SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); SCL=0; // SCL=1;/////////// SDA=0; }
void cack() { SCL=0; _nop_(); _nop_(); SDA=1; SCL=1; _nop_();_nop_();_nop_(); //SCL=0;////////////// // delay(100); if(SDA==0) { F0=0; } else { F0=1; } SCL=0; }
void start() {
SCL=1; SDA=1; SDA=0; SCL=0; }
void stop() { SCL=0; SDA=0; SCL=1; _nop_(); SDA=1; SDA=0; }
void write1() { SDA=1; SCL=1; _nop_(); SCL=0; SDA=0; }
void write0() { SDA=0; SCL=1; _nop_(); SCL=0; // SDA=1; }
void write8(uchar k) { uchar i,kk; for(i=0;i<8;i++) { kk=k<<i; if((kk&0x80)>0) write1(); else write0(); } }
uchar read8() { uchar i,da=0; for(i=0;i<8;i++) { SDA=1; da=da<<1; SCL=1; if(SDA) da=da++; SCL=0; Delay(500); } return(da); }
void Write24(uchar address,uchar datas) { do { start(); write8(0xA0); cack(); }while(F0);
do { write8(address); cack(); }while(F0);
do { write8(datas); cack(); }while(F0); stop();
TR1=0; TMOD=0x16; // ;器1:定时、方式1(即16位方式)。器0:仍为计数方式,8位自再装计数方式 TH1=0xD5; TL1=0x9D; // ;D59DH=65536-10851。10000(微秒)=10851*11.0592/12 TR1=1; kkk=0; while(kkk==0); _nop_(); }
uchar Read24(uchar address) { uchar db; do { start(); write8(0xA0); cack(); }while(F0);
do { write8(address); cack(); }while(F0);
do { start(); write8(0xA1); cack(); }while(F0);
db=read8(); mnack(); //mnack();
stop(); return(db); }
void main() {
EA=1; ET1=1; Write24(0x04,0x55); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); dd=Read24(0x04);
if(dd==0x55) bm=0; else bm=1; while(1) { ; } } |