找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于DS18B20搜索ROM问题

[复制链接]
跳转到指定楼层
楼主
ID:417092 发表于 2021-9-4 05:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求助,DS18B20搜索ROM问题
因为不会画流程图。。。。。。
想一步,写一步。写到最后自己也不清楚哪里出了问题。。。。。

4个DS18B20搜索ROM分别为
28A0A0A0...........................
28B0B0B0...........................
28C0C0C0...........................
28D0D0D0...........................


搜索结果。。没找到28B0B0B0搜出2个2828A0A0A0



  1. bit search_rom(uchar (*prom)[8])
  2. {
  3.         bit ask=0, end=0;
  4.         uchar i=0,j=0, k=0, buff[8]={0};
  5.         uchar _ROM_x=0, _00bit=0, high=0xff, low=0xff;
  6.         loop:
  7.         ask=init_18b20();
  8.         while(ask)
  9.         {
  10.                 ask=init_18b20();
  11.         }
  12.         write_18b20_byte(0xf0);
  13.         for(i=0; i<8; i++)
  14.         {
  15.                 for(j=0; j<8; j++)
  16.                 {
  17.                         k=0;
  18.                   k|=read_bit();
  19.                         k<<=1;
  20.                         k|=read_bit();
  21.                   switch(k)
  22.                   {
  23.                                 case 0: if(8*i+j<low) low=8*i+j;
  24.                                                                 if(8*i+j==high)
  25.                                                                 {
  26.                                                                         high=_00bit;
  27.                                                                         buff[i]>>=1; buff[i]|=0x80; write_bit(1);
  28.                                                                 }
  29.                                                                 else
  30.                                                                 {
  31.                                                                         _00bit=8*i+j;
  32.                                                                         buff[i]>>=1; write_bit(0);
  33.                                                                 }
  34.                                                                 break;
  35.                                 case 1:        buff[i]>>=1; write_bit(0); break;
  36.                                 case 2: buff[i]>>=1; buff[i]|=0x80; write_bit(1); break;
  37.                                 case 3: if(i==0)  return 0;
  38.                   }
  39.                 }
  40.         }
  41.         for(i=0; i<8; i++)
  42.                 prom[_ROM_x][i]=buff[i];
  43.         _ROM_x++;
  44.         if(end && high==low)
  45.                 return 1;
  46.         if(high==0)
  47.                 end = 1;
  48.         high = _00bit;
  49.         goto loop;

  50. }
复制代码

ds18b20.rar (824 Bytes, 下载次数: 13)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2021-9-4 06:32 | 只看该作者
仿真单个ds18b20可以用默ROM,仿真多个ds18b20总线连接要编辑不同ROM



回复

使用道具 举报

板凳
ID:417092 发表于 2021-9-4 06:39 | 只看该作者
wulin 发表于 2021-9-4 06:32
仿真单个ds18b20可以用默ROM,仿真多个ds18b20总线连接要编辑不同ROM。

不是我要的答案
回复

使用道具 举报

地板
ID:417092 发表于 2021-9-4 19:39 | 只看该作者


苦逼 的自己,手动搜索了一遍。。。
虽然找到了。。。问题。但是如果修改,函数结构大变。。。
修改还不如,重写。。。。。
这就是不 画流程图的结果。。。。。。。

可是我东一 榔头,西一棒槌自学的编程。。。不会画流程图呀!!!!!!
如何学画流程图呀!!!
回复

使用道具 举报

5#
ID:417092 发表于 2021-9-5 02:32 | 只看该作者


感觉修改麻烦,想重写。。。
写了一会。。。发现思路更乱。。。。
还是修改原函数。。。。。
函数被修改的面目全非,惨不忍睹。。。。
但是功能终于实现了。。。。。
改天,把代码精简一下,写下注释再和大家分享。。。
回复

使用道具 举报

6#
ID:417092 发表于 2021-9-6 23:57 | 只看该作者
  1. bit search_rom(uchar (*prom)[8])
  2. {
  3.         bit ask=0, end=0;
  4.         uchar i=0,j=0, k=0, buff[8]={0};
  5.         uchar _ROM_x=0, _00bit=0, high=0xff, low=0xff;
  6.         loop:
  7.         ask=init_18b20();
  8.         while(ask)
  9.         {
  10.                 ask=init_18b20();
  11.         }
  12.         write_18b20_byte(0xf0);
  13.         for(i=0; i<8; i++)
  14.         {
  15.                 for(j=0; j<8; j++)
  16.                 {
  17.                         k=0;
  18.                   k|=read_bit();
  19.                         k<<=1;
  20.                         k|=read_bit();
  21.                         if(k==0 && high!=8*i+j)
  22.                                 _00bit = 8*i+j;
  23.                         buff[i]>>=1;
  24.                         if(8*i+j>high || _ROM_x==0)
  25.                         {
  26.                                 switch(k)
  27.                                 {
  28.                                         case 0: if(8*i+j<low) low=8*i+j;  write_bit(0); break;
  29.                                         case 1:        write_bit(0); break;
  30.                                         case 2: buff[i]|=0x80; write_bit(1); break;
  31.                                         case 3: return 0;
  32.                                 }
  33.                         }
  34.                         else if(8*i+j == high)
  35.                         {
  36.                                 buff[i]|=0x80; write_bit(1);
  37.                                 high=_00bit;
  38.                         }
  39.                         else
  40.                         {
  41.                                         if((prom[_ROM_x-1][i])>>j&0x01)
  42.                                         {
  43.                                                 buff[i]|=0x80;
  44.                                                 write_bit(1);
  45.                                         }
  46.                                         else
  47.                                                 write_bit(0);
  48.                         }
  49.                 }
  50.         }
  51.         for(i=0; i<8; i++)
  52.                 prom[_ROM_x][i]=buff[i];
  53.         _ROM_x++;
  54.         if(end && high==low)
  55.                 return 1;
  56.         if(high==0)
  57.                 end = 1;
  58.         high = _00bit;
  59.         goto loop;
  60. }
复制代码


苦逼的自学过程,
原函数被改得面目全非。。。。88行代码

又用俩天时间 第一次精简从88行变成60行。。。。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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