#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^7;
uchar xdata RomID[16][8];
uchar xdata Rom[64];
/////////////////////////////
void delay600us(void) //误差 0us
{
unsigned char a,b;
for(b=3;b>0;b--)
for(a=98;a>0;a--);
}
void delay30us(void) //误差 0us
{
unsigned char a,b;
for(b=3;b>0;b--)
for(a=3;a>0;a--);
}
void delay200us(void) //误差 0us
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=97;a>0;a--);
}
void delay15us(void) //误差 0us
{
unsigned char a;
for(a=6;a>0;a--);
}
void delay45us(void) //误差 0us
{
unsigned char a;
for(a=21;a>0;a--);
}
void delay60us(void) //误差 0us
{
unsigned char a,b;
for(b=3;b>0;b--)
for(a=8;a>0;a--);
}
//////////////////////
/*
void delayus(unsigned int a)
{
a=a/2;
while(--a) ;
}
*/
void delay(unsigned int i)
{
while(i--);
}
void init_1820() // 初始化
{ char n;
DQ=1;
delay(8);
DQ=0;
delay(80);
DQ=1;
delay(8);
n=DQ;
delay(4);
// P2=n; 检验是否有返回值(器件的好坏)
}
uchar Reset()
{
uchar dq;
DQ=0;
delay600us();
DQ=1;
delay30us();
dq=DQ;
delay200us();
delay30us();
return(dq);
}
void writebit(uchar _00wbit)
{
_nop_();
DQ=0;
_nop_();
if(_00wbit)
{
DQ=1;
delay15us();
delay45us();
}
else
{
delay60us();
}
DQ=1;
}
uchar readbit()
{
uchar dq;
_nop_();
DQ=0;
_nop_();
DQ=1;
_nop_();
dq=DQ;
delay15us();
delay45us();
return(dq);
DQ=1;
}
void writechar(uchar DQ_char)
{
uchar i,k;
for(i=0;i<8;i++)
{
k=DQ_char&0x01;
writebit(k);
DQ_char>>=1;
}
}
uchar readchar()
{
uchar i,DQ_Data=0;
for(i=0;i<8;i++)
{
if(readbit()==1)
{
DQ_Data|=0x80;
if(i!=7)
DQ_Data>>=1;
}
else
if(i!=7)
DQ_Data>>=1;
}
return(DQ_Data);
}
uchar SearchRomID(uchar RomID[16][8])
{
uchar i,j,R1,R2,a,b,c,d;
uchar _00wbit[16]={2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};
for(i=0;i<16;i++)
{
c=0;
//init_1820();
Reset();
writechar(0xf0);
for(j=0;j<64;j++)
{
R1=readbit();
_nop_();
R2=readbit();
_nop_();
if(R1==0&&R2==1)
{
Rom[j]=0;
writebit(0);
}
else if(R1==1&&R2==0)
{
Rom[j]=1;
writebit(1);
}
else
{
if(_00wbit[c]==2)
{
writebit(0);
Rom[j]=0;
_00wbit[c]=0;
c+=1;
}
else if(_00wbit[c]==1)
{
writebit(1);
Rom[j]=1;
c+=1;
}
else if(_00wbit[c]==0)
{
writebit(0);
Rom[j]=0;
c+=1;
}
}
}
for(j=0;j<64;j=j+8)
{
for(d=0;d<8;d++)
{
if(Rom[j+d]&0x01)
{
RomID[i][j/8]>>=1;
RomID[i][j/8]|=0x80;
}
else RomID[i][j/8]>>=1;
}
}
/////////////////////////////
/*
for(i=0;i<64;i++)
{
SBUF=Rom[i];
delay(2000); delay(2000); delay(2000);
delay(2000); delay(2000); delay(2000);
} */
//////////////////////////////////////////////////////
for(a=0,c=16;c>=0;c--)
{
if(_00wbit[c]==2)
continue;
if(_00wbit[c]==0&a==0)
{
_00wbit[c]=1;
break;
}
else if(_00wbit[c]==1)
{
if(c!=0)
{
a+=1;
continue;
}
else
{
b=1;
break;
}
}
else if(_00wbit[c]==0&a!=0)
{
_00wbit[c]=1;
for(;a>0;a--)
{
c+=1;
_00wbit[c]=2;
}
break;
}
}
if(b==1) break;
}
return(i+1);
}
//////////////////
void init()
{
SCON=0x50; //方式一,定时器定时;允许接受;不允许多机通信
PCON=0X00; //波特率不加倍
TMOD=0x20; //定时器一;模式二;定时模式
TH1=0xf3; //波特率2400
TL1=TH1;
EA=1;
ES=1;
TR1=1;
}
void xiangying() interrupt 4
{
if(RI)
{
RI=0;
}
else
{
TI=0;
}
}
void main()
{
uchar aa,i,j,k;
delay(2000); delay(2000); delay(2000);
delay(2000); delay(2000); delay(2000);
init();
if(Reset()==0)
{
P2=0xaa;
}
/*
delayus(1); //524557us
delayus(2); //21us
delay(1); //25us
delayus(4); //29us
delayus(6); //37us
delayus(10); //53us
delay(2); //34us
delay(4); //52us
delay(6); //70us
delay(10); //106us
*/
aa=SearchRomID(RomID);
SBUF=aa;
delay(2000); delay(2000);
while(1)
{
for(i=0;i<16;i++)
{
SBUF=i;
delay(2000); delay(2000); delay(2000);
delay(2000); delay(2000); delay(2000);
for(j=0;j<8;j++)
{
SBUF=RomID[i][j];
delay(2000); delay(2000); delay(2000);
delay(2000); delay(2000); delay(2000);
}
}
k++;
if(k==2)
while(1);
}
}