这两天写的一个程序 3个点的18B20采集温度,采用 搜索ROM的方法 读取温度

2020-02-02 09:30发布

本人新手,把程序贴出来 希望大家给指出一些错误和不足,先谢谢大家
写完后总感觉程序代码有些繁琐,但自己又说不上来是哪里,大家给看看哈.....
-----------
里面的ROM算法借鉴采用的是-- 黑龙江大学 刘全义同学----的代码,在此声明

代码:
点击此处下载 ourdev_577281.rar(文件大小:65K) (原文件名:ROM搜索版.rar)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
34条回答
lcw_swust
1楼-- · 2020-02-06 20:55
从DS18B20的英文手册里可以看到关于search rom指令的例子,大概就是:复位->写SEARCH ROM指令->读两个位->写一个位->读下两位->写下一个位......->写第64位
其中,"读两个位"对于单个18B20来说是先返回ROM的第一个位,再返回该位的补码;如果有多个18B20,由于"线与"逻辑,如果有一个18B20返回0,那么数据线上得到的数据就为0;所以可能有四种情况:

读第一位  读第二位
0         0        :多个18B20的ROM第一位不一样
0         1        :ROM第一位为0
1         0        :ROM第一位为1
1         1        :未连接18B20

"写一个位"对于18B20来说,只有该位与自身的ROM位相等才会保持连接,否则对后面的读或写都忽略了.
所以,对于读出的两个位都为0的地方就要分别写0写1来区分不同的18B20了.
程序已经在楼主给的资料里了

//搜索ROM函数
bit Search_Rom()
{
        uchar r1=0,r2=0,m=0,n=0;
        uchar l=0;//栈长度
        uchar stack_node_pos[MAXNUM+1]={0};        //保存最后差异值位置 与栈顶值比较
        uchar node_pos=0; //产生差异值时的位置
        uchar rom[64]={0};//一次搜索中的位数
        uchar s=0;
       
        l=0;
        num_18b20=0;   //搜索前清0器件数目

        do
        {       
                Reset_18b20();         
                WriteByte(0xf0);

                for(m=0;m<8;m++)
                {        s=0;
                        for(n=0;n<8;n++)
                        {       
                                s>>=1;
                                r1=read_bit();//当前位
                                r2=read_bit();//补码
                                if(r1==0&&r2==1)
                                {       
                                         write_bits(0);
                                     rom[(m*8+n)]=0;
                                }
                                else
                                if(r1==1&&r2==0)
                                {       
                                        s=s|0x80;
                                        write_bits(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_bits(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_bits(rom[(m*8+n)]);
                                        }
                                        else if(node_pos==stack_node_pos[l]) //最后一次差异值的位置
                                        {                                                                    //最后一次分叉选择 发1 删除改栈
                                                s=s|0x80;
                                                write_bits(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<MAXNUM);         
   return 1;
}
dengxingling8
2楼-- · 2020-02-06 22:58
借鉴一下啊
wctmdgcd
3楼-- · 2020-02-07 01:18
这个必须有。
wpnx
4楼-- · 2020-02-07 05:31
mark                                    

一周热门 更多>