分布式測溫中傳感器時(shí)序與溫度讀取研究
寫(xiě)一位程序如下所示。程序中DAT為I/O口P1.0。
WIR11: SETB DAT ; 拉高電平
MOV R4, #5
NOP
CLR DAT ; 高電平持續2us后拉低
WIR12: DJNZ R4, WIR12 ; 等待10微秒
MOV DAT, C ; 發(fā)送1位
MOV R4, #23
WIR13: DJNZ R4, WIR13 ; 保證寫(xiě)時(shí)間大于60us
SETB DAT
RET
2.3 溫度傳感器讀時(shí)序
DS18B20只有在檢測到主設備啟動(dòng)讀時(shí)序后才向主設備傳輸數據。所以一般在主設備發(fā)送了讀數據命令后,必須馬上產(chǎn)生讀時(shí)序,以便DS18B20能夠傳輸數據。所有的讀時(shí)序都至少需要60μS,且在兩次獨立的讀時(shí)序之間至少需要1μS的恢復時(shí)間。每個(gè)讀時(shí)序都由主設備發(fā)起,先使數據線(xiàn)為高電平,然后拉低數據線(xiàn)至少1μS,再釋放數據線(xiàn)。在主設備發(fā)出讀時(shí)序之后,DS18B20開(kāi)始在數據線(xiàn)上發(fā)送數據0或1。若其發(fā)送1,則保持數據線(xiàn)為高電平。若發(fā)送0,則DS18B20拉低數據線(xiàn),在該時(shí)序結束后釋放數據線(xiàn)。DS18B20發(fā)出的數據在起始時(shí)序之后15μS內保證可靠有效。因而主設備在讀時(shí)序期間必須釋放數據線(xiàn),并且要在時(shí)序開(kāi)始后的15μS之內讀取數據線(xiàn)狀態(tài)。寫(xiě)時(shí)序如圖4所示。
讀一位程序如下所示:
RE11: SETB DAT ; 使數據線(xiàn)為高電平
NOP
NOP
CLR DAT ; 高電平持續2us后拉低數據線(xiàn)
MOV R4, #4
NOP ; 持續低電平2us
SETB DAT ; 釋放數據線(xiàn)
RE12: DJNZ R4, RE12 ; 等待8us
MOV C, DAT ; 讀入一位
MOV R5, #28
RE13: DJNZ R5, RE13 ; 保證一個(gè)讀周期持續60us
SETB DAT ; 使數據線(xiàn)為高電平
RET
3.初始化以及讀寫(xiě)時(shí)序應用
3.1 溫度采集程序設計
單總線(xiàn)數字溫度傳感器DS18B20要完成溫度的采集需要按順序完成如下幾個(gè)步驟:初始化、跳過(guò)ROM匹配、啟動(dòng)轉換、等待轉換完成、初始化、匹配ROM、讀便箋式存儲器、CRC校驗、溫度格式轉換、保存溫度值以及顯示等其他處理。按照此步驟,程序設計時(shí)首先就要按照初始化時(shí)序執行2.1所介紹的初始化程序INI10,其次要將跳過(guò)ROM匹配命令(代碼為CCH)寫(xiě)入到DS18B20中,此時(shí)需根據2.2所介紹的數字溫度傳感器寫(xiě)時(shí)序編寫(xiě)對DS18B20一個(gè)寫(xiě)入字節程序WRITE,將跳過(guò)ROM匹配命令寫(xiě)入DS18B20。為了完成溫度啟動(dòng)轉換,需要將啟動(dòng)轉換命令寫(xiě)入DS18B20中。用延時(shí)750ms等待轉換完成。隨后再按照初始化時(shí)序執行本文中2.1所介紹的初始化程序INI10,用寫(xiě)入一個(gè)字節程序將匹配ROM命令(代碼為55H)寫(xiě)入到DS18B20中。為了完成讀便箋式存儲器操作,需要先結合數字溫度傳感器寫(xiě)時(shí)序將讀便箋式存儲器命令(代碼為BEH)寫(xiě)入到DS18B20中,再用溫度傳感器讀時(shí)序編寫(xiě)的讀一個(gè)字節程序READ,連續讀取DS18B20便箋式存儲器中9個(gè)字節的內容。由此可見(jiàn),要想實(shí)現溫度正確采集,需要結合上述所介紹的初始化時(shí)序、溫度傳感器寫(xiě)時(shí)序和溫度傳感器讀時(shí)序,才可以將所需的命令寫(xiě)入與讀出。完成溫度的正確讀取。
3.2 溫度傳感器序列號讀取程序設計
每個(gè)單總線(xiàn)數字溫度傳感器DS18B20出廠(chǎng)時(shí)都有唯一的一個(gè)64位序列號,在使用溫度傳感器之前,需事先將每個(gè)溫度傳感器逐一掛接在I/O口如P1.0上,再讀取溫度傳感器的序列號。當I/O口上掛接一個(gè)溫度傳感器DS18B20時(shí),可以用讀ROM命令完成64位序列號的讀取。程序設計思路是首先將讀ROM命令(代碼為33H)送入累加器A中,隨后調用寫(xiě)入一個(gè)字節程序WRITE,然后調用讀64位序列號程序DXLH。在寫(xiě)入一個(gè)字節程序WRITE中,置循環(huán)次數為8,再調用寫(xiě)入一位子程序,嚴格按照時(shí)序關(guān)系,執行傳感器寫(xiě)時(shí)序,循環(huán)8次寫(xiě)完一個(gè)字節。在讀64位序列號程序DXLH中,置內部RAM首地址為30H,置循環(huán)次數為8,調用讀一個(gè)字節程序READ,將讀取數據存放在內部RAM中。循環(huán)8次讀完8個(gè)字節即64位序列號。讀出的64位序列號將存放到內部RAM 30H ~ 37H單元中。讀一個(gè)字節程序READ如下所示。
評論