18b20的搜索rom的 搜索算法 可是我的源碼和補碼都是1 這是怎么回事
uint m=0,n=0;
uint r1=0,r2=0;
uint l=0;//棧長度
uchar stack_node_pos[5]={0}; //保存最后差異值位置 與棧頂值比較
uint node_pos=0; //產生差異值時的位置
uchar rom[64]={0};//一次搜索中的位數
uint s=0;
uint num_18b20;
l=0;
num_18b20=0; //搜索前清0器件數目
// DS18B20_Rst();
// DS18B20_Check();
// DS18B20_Write_Byte(0x55);// 發送 rom 匹配
do
{
Reset();
//DS18B20_Check();
write_byte(0xf0);
for(m=0;m<8;m++)
{ s=0;
for(n=0;n<8;n++)
{
s>>=1;
r1=read_bit1();//當前位
f=1-r1;
r2=read_bit1();//補碼
g=1-r2;
// h[m][n]=r1;
if(r1==0&&r2==1)
{
write_bit(0);
rom[(m*8+n)]=0;
}
else
if(r1==1&&r2==0)
{
s=s|0x80;
write_bit(1);
rom[(m*8+n)]=1;
}
else
if(r1==0&&r2==0) //有多個從機產生了差異值
{
node_pos=m*8+n+1; //記錄產生差異值的位置
//差異值與最后一次差異值位置比較
if(node_pos>stack_node_pos[l]) //新路徑 新的差異值
{
write_bit(0); //選擇發送0
rom[(m*8+n)]=0; //記錄
stack_node_pos[++l]=node_pos; //記錄新的差異值位置
}
else if(node_pos<stack_node_pos[l]) //老路徑
{
s=s|((rom[(m*8+n)]&0x01)<<7); //發送保存上一次的位
write_bit(rom[(m*8+n)]);
}
else if(node_pos==stack_node_pos[l]) //最后一次差異值的位置
{ //最后一次分叉選擇 發1 刪除改棧
s=s|0x80;
write_bit(1);
rom[(m*8+n)]=1;
l=l-1; //從棧里刪除該值
}
}
else
{ //無從機連接 退出返回0
return 0;
}
}
ROM_ID[num_18b20][m]=s; //循環8次保存一字節
}
num_18b20=num_18b20+1;
}while(stack_node_pos[l]!=0&&num_18b20<4);
return 1;
}
|