只能從晶元的通訊方式不同來區分了。

DS18B20的時序:

DHT11的時序:

就應答時序而言,DS18B20的開始信號是一個480us-960us的低電平,而DHT11是一個至少18ms的低脈衝,所以可以根據發送不同的開始信號,然後去檢查是否有從機應答,來識別DS18B20和DHT11。

但是煙霧感測器和光敏感測器就沒辦法識別了,因為它們輸出的都是一個電壓的模擬量,除非這2個模塊出輸出的電壓不在同一範圍,這個我沒有具體瞭解,但是應該都是0-3V,這樣你採集到一個電壓,你甚至沒法區分有沒有感測器接入。

所以如果題主要實現這種自動設別的功能,只能選其他的帶協議的晶元,或者是每一個模塊加一個單片機做成一個新的帶通訊協議的模塊,然後自己定義一個單匯流排通訊格式。


最簡單的方法是空出3個IO,然後在每個模塊內設置3個插針,不同的模塊上對3個插針設置不同的電平,模塊插上MCU後對3個插針的高低電平進行判斷用以區分是什麼模塊連接了系統。


簡單,把那些模塊都做成串口模塊。主機那裡就寫一個串口數據處理函數就行了


弦子的回答已經比較全面,我補充兩點∶

1,用檢測信號的方法識別,可以用AD模式識別默認的數字信號的電平來區分模擬信號跟數字信號,需要設計好上電自檢的過程,甚至需要施加模擬負載來區分(感覺得不償失)。但是總的來說,不那麼靠譜。

2,簡單粗暴,加上一個撥碼開關就行,多2個IO口,軟體根據輸入的信號確定配置。

3,上位機直接用通信方式配置好具體那種方式,每次換感測器就重新用上位機配置一次(用通信搞定)

4,至於其他回答中用通信介面上傳數據到單片機,還是差了一步,就是沒有接感測器怎麼穩定識別?


可以實現,但是成本太高,如果IO足夠多建議還是多用別的IO口。

你提的這種要求,必須選用具有選通功能的IC晶元,但是這樣延遲會很大。

還不如多用幾個IO口呢!


SM Bus

1wire e2prom


做一個函數,用循環的方式驅動模塊,那個能得到正確的值,那個就是真的。不過正經來說,撥碼開關纔是正道。


推薦閱讀:
相關文章