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