找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3521|回复: 1
打印 上一主题 下一主题
收起左侧

18b20搜索rom

[复制链接]
跳转到指定楼层
楼主
ID:43404 发表于 2012-7-29 18:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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;
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:43404 发表于 2012-7-29 23:12 | 只看该作者
怎么没人讨论啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表