历史上的今天
返回首页

历史上的今天

今天是:2025年06月10日(星期二)

正在发生

2021年06月10日 | 二叉树算法在单总线上的C51软件实现

2021-06-10 来源:eefocus

引 言


单总线技术是将地址线、数据线和控制线合成一根线,并允许在该线上挂接多个单总线器件。其搜索ROM命令可以在线识别挂接在总线上器件的注册码和器件的类型,并可在线确定总线上的器件数量;但是,对于多个在线器件,毫不遗漏搜索出每个器件的注册码比较困难,在本文中,作者把多个器件注册码的数据结构抽象为一种二叉树,从而通过二叉树算法实现对在线所有的单总线器件的注册码的自动搜索,并能根据注册码自动识别器件类型和总线上的器件数量。


1 单总线技术


单总线技术搜索ROM的过程是主设备获取单总线上从器件的注册码的过程,是一种简单的三步操作过程的重复,即先读一位,其次读该位的反码,然后再写一位,选中其中的一部分器件(详见参考文献[1])。重复执行这三步操作,可获得设备注册码其余各位。


根据每两次读的数据可作如下判断:


00:总线上有器件,且它们的注册码在该位既有“1”,也有“0”;


01:总线上器件的注册码在该位是“1”;


10:总线上器件的注册码在该位是“0”;


11:总线上没有器件。


2 二叉树搜索算法


二叉树(binary tree)是n(n≥0)个结点的有限集合,由一个根结点以及两棵互不相交的、分别称为左子树和右子树的二叉树组成,且左子树和右子树有严格的区分。


遍历一棵二叉树就是按某种次序系统地访问二叉树上的所有结点,并且每个结点只允许访问一次。遍历运算的关键在于访问结点的次序,应保证二叉树上每个结点均被访问且仅被访问一次(详见参考文献[2])。


3二叉树搜索算法的应用


根据多个单总线器件注册码所构成的数据结构和二叉树的特点,可认为单总线上所有器件注册码构成了一个深度为64的二叉树(相关资料见参考文献[2]),在遍历二叉树的过程中可根据读取的两次数据判断结点是左子结点、右子结点还是叶子结点,即:


00:表示既存在左子结点,也存在右子结点,该位有“0”,也有“1”;


01:表示只存在左子结点,该位为“0”;


10:表示只存在右子结点,该位为“1”。


11:表示不存在子结点,也就说明没有从器件挂接在总线上。


在遍历二叉树时,记录所走的路径和搜索到的叶子结点数,可以得到从器件的注册码和从器件数量。


第一次搜索从器件的注册码时,如果左子结点和右子结点都存在,需要记录该分叉结点的深度,并沿左子树的方向向下搜索,当搜索深度达到64时,获得一个从器件的注册码,并取出该搜索路径最后的分叉结点的深度,然后主器件执行第二次搜索过程。在该搜索过程中,如果结点的深度值小于最后一个分叉结点的深度,则发送上次搜索到的在最后一个分叉结点前的注册码的相应位;如果结点的深度值等于最后一个分叉结点的深度,则发送上次搜索到的在最后一个分叉结点处发送的数据的反码,并且删除该分叉结点的记录,如在后面的搜索中遇到分叉结点,同样需要记录分叉结点的深度。这样,每搜索到一个深度为64的叶子结点,就会得到一个从器件的注册码,一直搜索到记录中没有分叉结点为止。


图1 软件流程图


如表1所示,设有三个从器件1、2和3,主设备第一次读取的数据是“10”,可知从器件的注册码的第一位都为“0”,主设备写“0”;第二次读取的数据是“00”,可知在线从器件的注册码在该位既有“0”,也有“1”,记下该分叉结点的深度(记录的位1置“1”);主设备写“0”,搜索左子树结点,选中从器件1和从器件3(如主设备写“1”则选中从器件2),第三次读取的数据是“01”,可知选中的从器件的注册码在该位都是“1”,主设备写“1”,第四次读取的数据是“00”,从器件的注册码在该位既有“0”,也有“1”,记下该分叉结点的深度(记录的位3置“1”),主设备写“0”,选中从器件1,依次类推搜索从器件1的其余结点,当深度达到64时,即获得从器件1的注册码;从记录中找出最后一个分叉结点,即记录的位3,重新从根结点开始搜索,在分叉结点之前,每读两次数据后,发送前一个从器件(从器件1)注册码的相应位,在分叉结点2,发送前一个从器件的注册码相应位的反码“1”,选中从器件2和3,搜索右子树结点,并把记录分叉结点的相应位(记录的位3)清“0”,依次读取从器件2和3注册码的剩余位;并在记录中记录相应位,按照同样的方法,可获得从器件2的注册码,直到记录中的各位都为“0”时,搜索结束。由搜索得到数据可知,从器件1、从器件2和从器件3的注册码的前8位(家族码)分别是:28H、20H和2CH,所以它们分别是温度传感器DS18B20、模数转换芯片DS2450和单路数字电位器DS2890。


表格 1 搜索注册码





4 软件设计


流程图如图1所示,number[64 ,0 ]表示number为64 位的变量,初始化为0,存储从器件的ROM 序列号,Record 用来记录存在分支的结点位置,list[n]表示记录中的第n位,初始化为“0”,n 表示搜索到的位数。


下面是部分软件:


/**自动识别多个在线芯片序列号***/


void find_serial()


{char n,j,m,k,record,end,ks,mm,nn;


m=0;end=0;


reset_num(); //复位单总线


command_num(0x0F0,0x08);//发搜索命令


while (1)


{for (n=1;n<65;n++)//读深度为64的二叉树


{k=(n-1)/8; //每8位放到数组中


j=Read_serial(0x02);//连续读两次数serial[k]=serial[k]>>1;


if(j==0x01) //第一次为1,第二次为0


{serial[k]=serial[k]|0x80;//存该位1


command_num(0x01,0x01);//发送1


read_bit[n]=0;


}


if (j==0x02) //第一次为0,第二次为1


{serial[k]=serial[k]&0x7f; //存该位0


command_num(0x00,0x01); //发送0


read_bit[n]=0;


}


if(j==0x00) //两次都为0,记录分叉点


{if (n

{ks=(serial1[k]>>((n-1)%8))&0x01;


/*发前一个已搜索器件注册码*/


command_num(ks,0x01);


serial[k]=serial[k]|0x80;//存该位


if (ks==0) {serial[k]=serial[k]&0x7f;}


}


else if (n>record)//深度是大于64


{command_num(0x00,0x01);


read_bit[n]=1;//记录


serial[k]=serial[k]&0x7f;


}


else


{ks=(n-1)/8;mm=(n-1)%8;


nn=serial1[ks]>>mm;


if ((nn&0x01)==1)


{serial[ks]=serial[ks]&0x7f;


command_num(0x00,0x01);


}


if ((nn&0x01)==0)


{serial[ks]=serial[ks]|0x80;


command_num(0x01,0x01);


}


read_bit[n]=0;//清记录


}


}


}


for(nn=0;nn<8;nn++)


{serial1[nn]=serial[nn];}


if (n>64)


{for (j=64;j>0;j--)//从末尾搜索记录


{if (read_bit[j]!=0)


{record=j;n=1;


read_bit[j]=0;


break;


}


else


{record=0;}//清记录


}


}


if (record!=0)//如有分叉点,重新搜索


{reset_num();


command_num(0x0F0,0x08);


}


else


{break;}


}


}


5 结论


在作者设计的温室控制系统的软件中,当系统每次上电时,微处理器首先应用二叉树算法搜索在线的所有单总线器件的注册码,并区分器件类型;对于撤离的或新增加的从器件,系统可以动态的获得它的注册码,实现了对从器件的动态管理。该算法适用于任何具有1-Wire 接口特性单总线器件。


推荐阅读

史海拾趣

胜利(VICTOR)公司的发展小趣事

进入21世纪,胜利公司加大了对技术研发的投入,不断推出具有创新性的产品。例如,公司研发的碳纤维羽毛球拍,不仅轻盈耐用,而且性能卓越,迅速成为市场上的热销产品。此外,公司还积极引入新材料、新工艺,不断提升产品的品质和性能。

C&H Technology公司的发展小趣事

随着智能手机市场的快速发展,C&H Technology意识到单纯的芯片制造已经不能满足市场需求。于是,公司开始加大研发投入,致力于在5G通信、人工智能等前沿技术领域取得突破。经过多次试验和失败,C&H Technology的研发团队终于成功开发出了一款集成5G通信功能的手机芯片,并获得了多项专利。这一技术突破不仅提升了公司在行业内的地位,也为公司的未来发展奠定了坚实的基础。

Exar [Exar Corporation]公司的发展小趣事

Exar始终注重通过收购和合并来增强自身的技术实力和市场竞争力。例如,2012年Exar收购了Integrated Memory Logic Limited(iML),这一举措加强了其在存储和数据管理领域的地位。通过收购iML,Exar获得了更多的技术资源和市场份额,为其后续的发展提供了有力支持。

Dymec公司的发展小趣事

随着业务的不断拓展,Dymec公司逐渐意识到品质对于品牌的重要性。公司决定加大对产品质量的投入,从原材料采购到生产流程,再到质量检测,每一个环节都严格把控。这种对品质的执着追求使得Dymec公司的产品在市场上获得了良好的口碑,公司也逐渐成为了电子连接器行业的知名品牌。

Austek Microsystems公司的发展小趣事

随着产品线的不断丰富和技术实力的不断提升,Austek Microsystems开始积极拓展市场。公司不仅在国内市场取得了良好的销售业绩,还积极开拓海外市场,与多个国家和地区的客户建立了稳定的合作关系。同时,Austek Microsystems还注重品牌建设,通过参加行业展会、举办技术研讨会等方式,提升品牌知名度和影响力。

Dean Technology公司的发展小趣事

Dean Technology公司起源于上世纪80年代,当时电子行业正经历着飞速的发展。创始人凭借其深厚的电子技术背景和敏锐的市场洞察力,决定进入高压二极管领域。他带领研发团队不断攻克技术难题,成功推出了一系列性能稳定、品质可靠的高压二极管产品,奠定了公司在行业中的技术领先地位。

问答坊 | AI 解惑

LPCXpresso1343-VB-USB

之前见到有人发帖“lpc1343之三:通过USB接口控制开发板LED闪烁速度并读取AD转换结果”,详见https://bbs.eeworld.com.cn/thread-106706-1-2.html,作者很牛很有实力,1343的C源码至今我还没有完全看懂,但鄙人用VB做软件,最近挤出点时间解决了VB ...…

查看全部问答>

电路板发热,电源芯片LT1085发热

我的电路板用一个1085-5V芯片转换成5V,用一个1085-3.3V转换成3.3V,5V给AD等外围芯片供电,3.3主要给核心板供电,我的程序运行一会,核心板,电源芯片就会很烫,电源芯片带的底板也很烫。功率也满足要求。请问各位高手该如何解决发热问题?…

查看全部问答>

求助一道很简单的题目

将内存单元1000-1030H中的内容复制到3000-3030H单元中去,原地址清0 我的代码在下面,下载地址1000H,自修改代码,他说改下载地址,自己内存放点东西,他要看到结果,不放东西全部是0,复制过去也没效果。老师很BT,要求十分严格。EMBESTIDE环境 ...…

查看全部问答>

请问:在嵌入式(wince)下如何通过GPRS模块利用手机卡提供的GPRS上网

各位前辈大家好。 请问:在嵌入式(wince)下如何通过GPRS模块利用手机卡提供的GPRS上网,我买了个嵌入式开发板utu-s3c2440-s和GSM/GPRS/CDMA-MODEM模块,现在连接上之后,可以实现给其他手机发送信息和拨打电话,但不知怎么实现通过它实现无线上 ...…

查看全部问答>

socket的建立

在vxworks下想实现socket的通讯,建立了一个虚拟机,里面跑的是vxworks,是服务端 在windows下,用VC实现的客户端。 问题是发现服务端的socket无法建立,不知是不是写错了,代码如下: netInit() {         struct sockad ...…

查看全部问答>

嵌入式技术交流群 24992320 欢迎加入啊

嵌入式技术交流群 24992320 欢迎加入啊 …

查看全部问答>

请问ST32复位时IO口处于什么状态?

                                 如题。我说的是复位过程中,而不是复位后。谢谢!!!…

查看全部问答>

为什么程序加while(1),运行起来程序还是会跳出while执行上面的初始化呢?

为什么程序加while(1),运行起来程序还是会跳出while执行它上面的初始化呢? 我是触摸屏加ADC采样,触摸屏是GPIO低电平产生中断,ADC是定时器触发中断。两个一起用,触摸液晶屏总是会死掉,没一点反应,还有就是会跳出while(1),执行上面的ADC初 ...…

查看全部问答>

EZ430-RF2500 CC2500无线开发套件,EZ430-TMS37157 PaLFI 无源低频评估套件,展示

拿到两套开发套件,开包展示ing。EZ430-RF2500 CC2500无线开发套件EZ430-TMS37157 PaLFI 无源低频评估套件…

查看全部问答>

TI群星系列的一点资料

 网上找到的一些关于TI的CM3和ST的CM3的一点区别和前几天参加TI的CM4研讨会了解到的TI的CM4和ST的CM4的一点区别:CM3系列:1. TI 的以太网接口是MAC+PHY,ST的需要扩展PHY2. TI只有3个串口,ST有5个,STM32F2达到了6个3. TI的ADC是10位的,而S ...…

查看全部问答>