当前位置: 代码迷 >> 单片机 >> 18B20ROM搜索的一段代码能否帮忙看看,解释地清除点万分感谢,该怎么处理
  详细解决方案

18B20ROM搜索的一段代码能否帮忙看看,解释地清除点万分感谢,该怎么处理

热度:137   发布时间:2016-04-28 16:27:54.0
18B20ROM搜索的一段代码能否帮忙看看,解释地清除点万分感谢
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;
}
看懂一部分,主要是(一位数据位,一位补码位)那部分看不懂啊!谢谢

------解决方案--------------------
帮顶!努力!
  相关解决方案