DSl8820 ROM編碼的一種搜索算法
首先作如下幾個(gè)定義:對(duì)“兩讀”數(shù)據(jù)為00的ROM編碼位,之后“一寫”操作要寫的數(shù)據(jù)定義為“00寫位”;所有00寫位的集合定義為“00寫位組”。那么搜索算法所要解決的問題就是:確立一個(gè)00寫位組,確保搜索命令能夠搜索到一個(gè)唯一的ROM編碼,并在完成一次搜索后對(duì)00寫位組做出更新,以確保下次的搜索命令能夠搜索到一個(gè)唯一的ROM編碼并且不會(huì)搜索到已經(jīng)搜索到的ROM編碼,直到完成總線上所有器件的ROM編碼搜索。
在給出搜索算法規(guī)則前再作如下幾個(gè)定義:00寫位組中最高ROM編碼位對(duì)應(yīng)的00寫位定義為“最高00寫位”;00寫位組中鄰近最高00寫位的00寫位定義位“次高00寫位”;如果更新后的00寫位組不足以搜索到一個(gè)唯一的ROM編碼,則添加新的00寫位,這個(gè)新的00寫位定義為“新00寫位”。
DS18820 ROM編碼的搜索算法規(guī)則:
①第一次搜索確立一個(gè)00寫位組,其中所有00寫位全部為0。
②每次搜索后更新00寫位組并從最高00寫位開始更新。
③00寫位組更新規(guī)則:如果最高00寫位為0,則改最高00寫位為1,更新完成;如果最高00寫位為1,則棄去最高00寫位并把次高00寫位作為新的最高00寫位。
④如果出現(xiàn)新00寫位,新00寫位一律為0并作為新的最高00寫位。
⑤如果0寫位組全為1,則搜索所有器件的ROM編碼,搜索結(jié)束。本文引用地址:http://butianyuan.cn/article/163566.htm
3 算法的C51實(shí)現(xiàn)
對(duì)一條“單線總線”上多片DS18820的ROM編碼搜索與識(shí)別,具體由C51編寫的函數(shù)uchar SearchRomID(uchar RomID[n][8])來實(shí)現(xiàn)。函數(shù)的返回值是總線上查找到的器件個(gè)數(shù),總線上所有器件的ROM編碼存入二維數(shù)組RomID[n][8]。其中n為總線上允許掛器件的最大值,這里取16。
首先對(duì)程序中的幾個(gè)重要變量做一些說明:
_00wbit:一維數(shù)組,用來存儲(chǔ)00寫位組全部內(nèi)容。它的長度由總線上允許掛接器件的最大值決定。每寫一個(gè)00寫位都可以“排除”至少一個(gè)總線上的器件,當(dāng)總線上器件數(shù)為n時(shí),_00wbit數(shù)組的長度應(yīng)為n-1。當(dāng)然這是最壞情況下的取值,很多情況下_00wbit數(shù)組的長度小于這個(gè)值,這時(shí)不用的 _00wbit數(shù)組位用2來填充。
Rom:一維數(shù)組,臨時(shí)存儲(chǔ)64位ROM編碼。
b:搜索結(jié)束標(biāo)志位。
R1、R2:“兩讀”數(shù)據(jù)位。
編者注:程序略。
結(jié) 語
本文提出了一種對(duì)掛接在同一條“單線總線”上的多片DS18B20 ROM編碼的搜索算法,并給出了具體的C51實(shí)現(xiàn)方法,經(jīng)驗(yàn)證完全可行。由于該算法可自動(dòng)識(shí)別總線上的器件個(gè)數(shù),因此實(shí)際運(yùn)用中,在總線上添加和刪除器件都十分靈活,這為多點(diǎn)測(cè)溫帶來了很大的方便。該算法也適用于其他“單線總線”器件。
評(píng)論