uchar search_rom(uchar *p)
{
uchar dat,i,j,k,n,value,number=1,number_temp=1,clash_number=0;
bit clash_flag=0;
for(n=0;n<number;n++) //单总线上挂两个DS18B20
{
flag=0;
while(!flag) Init18b20(); //复位ds18b20
write_byte(ds18B20_SEARCH_ROM); //搜索ROM命令
for(i=0;i<8;i++) //8个字节ROM
{
dat=0;
for(j=0;j<8;j++) //8位数据
{
value=0;
for(k=0;k<2;k++) //一位数据位,一位补码位
{
DQ=1;_nop_();_nop_();
value<<=1;
DQ = 0;_nop_();_nop_();_nop_();_nop_(); //4us
DQ = 1;_nop_();_nop_();_nop_();_nop_(); //4us
if(DQ) value|=0x01;
delay_us(60); //60us
}
switch(value) //根据回复第两位数据来发出相应操作
{
case 0x00: //总线冲突
if(n==0)
{
number++;
number_temp=number;
dat=dat>>1;
DQ=1;_nop_();_nop_();
DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us
DQ=0; //最低位移出
delay_us(60); //60us
}
else //第二次以上循环时
{
clash_number++;
if(clash_number>=(number_temp-1))
{
if(!clash_flag)
{
clash_flag=1;
dat=dat>>1;
dat=dat|0x80;
DQ=1;_nop_();_nop_();
DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us
DQ=1; //最低位移出
delay_us(60); //60us
}
else
{
clash_flag=0;
number_temp--;
dat=dat>>1;
DQ=1;_nop_();_nop_();
DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us
DQ=0; //最低位移出
delay_us(60); //60us
}
}
}
break;
case 0x01:
dat=dat>>1;
DQ=1;_nop_();_nop_();
DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us
DQ=0; //最低位移出
delay_us(60); //66us
break;
case 0x02:
dat=dat>>1;
dat=dat|0x80;
DQ=1;_nop_();_nop_();
DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us
DQ=1; //最低位移出
delay_us(60); //66us
break;
case 0x03:
i=8;
j=8;
break;
default:break;
}
}
*p++=dat;
}
}
return number;
}
看懂一部分,主要是(一位数据位,一位补码位)那部分看不懂啊!谢谢
------解决方案--------------------
帮顶!努力!