摘 要:在分布式測(cè)溫系統(tǒng)中應(yīng)用了大量的新型傳感器DS18B20,DS18B20是單總線數(shù)字溫度傳感器其硬件接線簡(jiǎn)單,但時(shí)序非常復(fù)雜。正確使用單總線數(shù)字溫度傳感器,分析其時(shí)序關(guān)系,基于時(shí)序編制正確程序具有及其重要意義。文中結(jié)合時(shí)序圖對(duì)初始化時(shí)序、寫時(shí)序和讀時(shí)序進(jìn)行了詳細(xì)闡述,并給出了實(shí)現(xiàn)各種時(shí)序的軟件程序。應(yīng)用初始化時(shí)序和讀寫時(shí)序?qū)崿F(xiàn)了溫度采集,并以傳感器64位序列號(hào)讀取程序的設(shè)計(jì)說明了時(shí)序的綜合應(yīng)用。說明了溫度采集程序的設(shè)計(jì)思路。并給出了分布式測(cè)溫系統(tǒng)中的溫度顯示。文中基于時(shí)序進(jìn)行溫度的正確讀取與顯示已經(jīng)應(yīng)用于分布式測(cè)溫系統(tǒng)中。
關(guān)鍵詞:寫時(shí)序;讀時(shí)序;溫度傳感器;溫度采集
Abstract: A lot of new temperature sensors DS18B20 are used in distributed temperature measurement system. DS18B20 is a single bus digital temperature sensor. The hardware connection of temperature sensor is simple and time slots are very complex. Using the single bus temperature correctly, analyzing time slots and designing the program based on correct time slots have an important meaning. Initialization timing, writing time slots and reading slots are expounded in this paper in detail. Software program of realizing each time slots is provided. The temperature sampling is realized by use of initialization timing, writing time slots and reading slots. The design of 64-bit serial number reading program illustrates synthetical application of time slots. The design method of temperature sampling is illustrated. The temperature display is given out for distributed temperature measurement system. The accurate temperature reading and display based on time slots have been applied in distributed temperature measurement system.
Key words: Writing Time Slots; Reading Time Slots; Temperature Sensor; Temperature Sampling
1.引言
在分布式測(cè)溫系統(tǒng)中應(yīng)用了大量的新型傳感器DS18B20,DS18B20是單總線數(shù)字溫度傳感器其硬件接線簡(jiǎn)單,但時(shí)序非常復(fù)雜。要實(shí)現(xiàn)溫度的正確讀取,既要有對(duì)DS18B20的ROM操作命令,又有一些功能命令。這些命令的執(zhí)行,既有一定順序,又有特定含義。都需要基于數(shù)字溫度傳感器初始化時(shí)序、寫時(shí)序和讀時(shí)序,按照嚴(yán)格的時(shí)序配合才能完成溫度正確采集與讀取。因此要想正確使用單總線數(shù)字溫度傳感器,必須分析其時(shí)序關(guān)系,并且基于時(shí)序編制正確程序。單總線數(shù)字溫度傳感器時(shí)序分析與應(yīng)用研究具有及其重要意義。
2.數(shù)字溫度傳感器時(shí)序
DS18B20與單片機(jī)只通過一條數(shù)據(jù)線連接,所以其數(shù)據(jù)的傳輸方式為串行方式。為了正確讀取溫度值,必須嚴(yán)格按照時(shí)序配合關(guān)系,進(jìn)行程序編制。DS18B20有嚴(yán)格的通信協(xié)議來保證數(shù)據(jù)傳輸?shù)恼_性和完整性。通信協(xié)議規(guī)定了總線上的多種信號(hào)的時(shí)序。如:復(fù)位脈沖、響應(yīng)脈沖、寫0、寫1、讀0和讀1等信號(hào)的時(shí)序。DS18B20是在嚴(yán)格的時(shí)序控制下進(jìn)行正常操作的。換句話講,就是用較為復(fù)雜的軟件來?yè)Q取簡(jiǎn)單的硬件接口。因此要正確使用DS18B20,就必須了解其初始化時(shí)序、寫時(shí)序和讀時(shí)序。
2.1 數(shù)字溫度傳感器初始化時(shí)序
初始化時(shí)序有時(shí)也稱復(fù)位時(shí)序,它是數(shù)據(jù)線上所有傳輸過程的開始。整個(gè)初始化過程由主設(shè)備發(fā)出的復(fù)位脈沖和DS18B20的響應(yīng)脈沖組成。在主設(shè)備初始化的過程中,主設(shè)備通過拉低數(shù)據(jù)線至少480μS ,DS18B20即認(rèn)為是接收到一個(gè)初始化脈沖,接著主設(shè)備釋放數(shù)據(jù)線,在數(shù)據(jù)線上上拉電阻的作用下,數(shù)據(jù)線電平被拉高,并且主設(shè)備進(jìn)入接收模式。在DS18B20檢測(cè)到上升沿后,延時(shí)15~60μS ,接著通過拉低總線60~240μS以產(chǎn)生應(yīng)答脈沖。初始化時(shí)序如圖2所示。圖1是圖2、圖3和圖4的線型示意圖。
[align=center]
圖1 線型示意圖
圖2 初始化時(shí)序[/align]
在分布式測(cè)溫系統(tǒng)中CPU采用AT89S52,溫度讀取的初始化程序如下所示:
DAT BIT P1.0
INI10: SETB DAT
MOV R2, #185
INI11: CLR DAT
DJNZ R2, INI11 ; 復(fù)位脈沖時(shí)間600us
SETB DAT ; 釋放數(shù)據(jù)線
MOV R2, #28
INI12: DJNZ R2, INI12 ; 等待60us
CLR C
ORL C, DAT ; 有無應(yīng)答低電平
JC INI10 ; 若無應(yīng)答,初始化失敗
MOV R6, #40
INI13: ORL C, DAT
JC INI14 ; 數(shù)據(jù)線變高。初始化成功
DJNZ R6, INI13 ; 低電平最多240us
SJMP INI10 ; 低電平持續(xù)大于240us,失敗
INI14: MOV R2, #222
INI15: DJNZ R2, INI15 ; 應(yīng)答信號(hào)至少要持續(xù)480us
RET
2.2 數(shù)字溫度傳感器寫時(shí)序
寫時(shí)序包括寫“0”時(shí)序和寫“1”時(shí)序。寫“1”時(shí)序用于主設(shè)備向DS18B20寫入1,寫“0”時(shí)序用于主設(shè)備向DS18B20寫入0。無論是哪種寫時(shí)序都至少需要60μS ,且在兩次獨(dú)立的寫時(shí)序之間至少需要1μS的恢復(fù)時(shí)間。兩種寫時(shí)序均起始于主設(shè)備拉低數(shù)據(jù)線電平。對(duì)于寫“1”時(shí)序,主設(shè)備在拉低數(shù)據(jù)線之后,緊接著必須在15μS之內(nèi)釋放數(shù)據(jù)線,由上拉電阻將數(shù)據(jù)線拉至高電平;而對(duì)于寫“0”時(shí)序,在主設(shè)備拉低數(shù)據(jù)線后,只需在整個(gè)時(shí)序內(nèi)保持低電平即可至少60μS。在寫時(shí)序開始后的15~60μS期間內(nèi),DS18B20讀取數(shù)據(jù)線電平狀態(tài)。如果此期間數(shù)據(jù)線為高電平 ,則對(duì)器件寫入邏輯1,否則寫入邏輯0。寫時(shí)序如圖3所示。
[align=center]
圖3 數(shù)字溫度傳感器寫時(shí)序[/align]
寫一位程序如下所示。程序中DAT為I/O口P1.0。
WIR11: SETB DAT ; 拉高電平
MOV R4, #5
NOP
CLR DAT ; 高電平持續(xù)2us后拉低
WIR12: DJNZ R4, WIR12 ; 等待10微秒
MOV DAT, C ; 發(fā)送1位
MOV R4, #23
WIR13: DJNZ R4, WIR13 ; 保證寫時(shí)間大于60us
SETB DAT
RET
2.3 溫度傳感器讀時(shí)序
DS18B20只有在檢測(cè)到主設(shè)備啟動(dòng)讀時(shí)序后才向主設(shè)備傳輸數(shù)據(jù)。所以一般在主設(shè)備發(fā)送了讀數(shù)據(jù)命令后,必須馬上產(chǎn)生讀時(shí)序,以便DS18B20能夠傳輸數(shù)據(jù)。所有的讀時(shí)序都至少需要60μS,且在兩次獨(dú)立的讀時(shí)序之間至少需要1μS的恢復(fù)時(shí)間。每個(gè)讀時(shí)序都由主設(shè)備發(fā)起,先使數(shù)據(jù)線為高電平,然后拉低數(shù)據(jù)線至少1μS,再釋放數(shù)據(jù)線。在主設(shè)備發(fā)出讀時(shí)序之后,DS18B20開始在數(shù)據(jù)線上發(fā)送數(shù)據(jù)0或1。若其發(fā)送1,則保持?jǐn)?shù)據(jù)線為高電平。若發(fā)送0,則DS18B20拉低數(shù)據(jù)線,在該時(shí)序結(jié)束后釋放數(shù)據(jù)線。DS18B20發(fā)出的數(shù)據(jù)在起始時(shí)序之后15μS內(nèi)保證可靠有效。因而主設(shè)備在讀時(shí)序期間必須釋放數(shù)據(jù)線,并且要在時(shí)序開始后的15μS之內(nèi)讀取數(shù)據(jù)線狀態(tài)。寫時(shí)序如圖4所示。
[align=center]
圖4 數(shù)字溫度傳感器讀時(shí)序[/align]
讀一位程序如下所示:
RE11: SETB DAT ; 使數(shù)據(jù)線為高電平
NOP
NOP
CLR DAT ; 高電平持續(xù)2us后拉低數(shù)據(jù)線
MOV R4, #4
NOP ; 持續(xù)低電平2us
SETB DAT ; 釋放數(shù)據(jù)線
RE12: DJNZ R4, RE12 ; 等待8us
MOV C, DAT ; 讀入一位
MOV R5, #28
RE13: DJNZ R5, RE13 ; 保證一個(gè)讀周期持續(xù)60us
SETB DAT ; 使數(shù)據(jù)線為高電平
RET
3.初始化以及讀寫時(shí)序應(yīng)用
3.1 溫度采集程序設(shè)計(jì)
單總線數(shù)字溫度傳感器DS18B20要完成溫度的采集需要按順序完成如下幾個(gè)步驟:初始化、跳過ROM匹配、啟動(dòng)轉(zhuǎn)換、等待轉(zhuǎn)換完成、初始化、匹配ROM、讀便箋式存儲(chǔ)器、CRC校驗(yàn)、溫度格式轉(zhuǎn)換、保存溫度值以及顯示等其他處理。按照此步驟,程序設(shè)計(jì)時(shí)首先就要按照初始化時(shí)序執(zhí)行2.1所介紹的初始化程序INI10,其次要將跳過ROM匹配命令(代碼為CCH)寫入到DS18B20中,此時(shí)需根據(jù)2.2所介紹的數(shù)字溫度傳感器寫時(shí)序編寫對(duì)DS18B20一個(gè)寫入字節(jié)程序WRITE,將跳過ROM匹配命令寫入DS18B20。為了完成溫度啟動(dòng)轉(zhuǎn)換,需要將啟動(dòng)轉(zhuǎn)換命令寫入DS18B20中。用延時(shí)750ms等待轉(zhuǎn)換完成。隨后再按照初始化時(shí)序執(zhí)行本文中2.1所介紹的初始化程序INI10,用寫入一個(gè)字節(jié)程序?qū)⑵ヅ銻OM命令(代碼為55H)寫入到DS18B20中。為了完成讀便箋式存儲(chǔ)器操作,需要先結(jié)合數(shù)字溫度傳感器寫時(shí)序?qū)⒆x便箋式存儲(chǔ)器命令(代碼為BEH)寫入到DS18B20中,再用溫度傳感器讀時(shí)序編寫的讀一個(gè)字節(jié)程序READ,連續(xù)讀取DS18B20便箋式存儲(chǔ)器中9個(gè)字節(jié)的內(nèi)容。由此可見,要想實(shí)現(xiàn)溫度正確采集,需要結(jié)合上述所介紹的初始化時(shí)序、溫度傳感器寫時(shí)序和溫度傳感器讀時(shí)序,才可以將所需的命令寫入與讀出。完成溫度的正確讀取。
3.2 溫度傳感器序列號(hào)讀取程序設(shè)計(jì)
每個(gè)單總線數(shù)字溫度傳感器DS18B20出廠時(shí)都有唯一的一個(gè)64位序列號(hào),在使用溫度傳感器之前,需事先將每個(gè)溫度傳感器逐一掛接在I/O口如P1.0上,再讀取溫度傳感器的序列號(hào)。當(dāng)I/O口上掛接一個(gè)溫度傳感器DS18B20時(shí),可以用讀ROM命令完成64位序列號(hào)的讀取。程序設(shè)計(jì)思路是首先將讀ROM命令(代碼為33H)送入累加器A中,隨后調(diào)用寫入一個(gè)字節(jié)程序WRITE,然后調(diào)用讀64位序列號(hào)程序DXLH。在寫入一個(gè)字節(jié)程序WRITE中,置循環(huán)次數(shù)為8,再調(diào)用寫入一位子程序,嚴(yán)格按照時(shí)序關(guān)系,執(zhí)行傳感器寫時(shí)序,循環(huán)8次寫完一個(gè)字節(jié)。在讀64位序列號(hào)程序DXLH中,置內(nèi)部RAM首地址為30H,置循環(huán)次數(shù)為8,調(diào)用讀一個(gè)字節(jié)程序READ,將讀取數(shù)據(jù)存放在內(nèi)部RAM中。循環(huán)8次讀完8個(gè)字節(jié)即64位序列號(hào)。讀出的64位序列號(hào)將存放到內(nèi)部RAM 30H ~ 37H單元中。讀一個(gè)字節(jié)程序READ如下所示。
READ: MOV R6, #8 ; 循環(huán)次數(shù)為8
SETB DAT ; 讀出一位程序,執(zhí)行傳感器讀時(shí)序
NOP
NOP
RD11: CLR DAT
MOV R4, #4
NOP ; 持續(xù)低電平2us
SETB DAT ; 釋放數(shù)據(jù)線
RD12: DJNZ R4, RD12 ; 等待8us
MOV C, DAT ; 讀入一位
RRC A ; 將讀入數(shù)據(jù)移入累加器A
MOV R5, #28
RD13: DJNZ R5, RD13 ; 保證一個(gè)讀周期持續(xù)60us
DJNZ R6, RD11 ; 循環(huán)8次讀一個(gè)字節(jié)
SETB DAT
RET
上述程序執(zhí)行完畢,可將溫度傳感器的64位序列號(hào)存放在單片機(jī)內(nèi)部RAM 30H ~ 37H單元中。
4.分布式測(cè)溫系統(tǒng)中溫度顯示
分布式測(cè)溫系統(tǒng)中,采用液晶顯示可以實(shí)現(xiàn)房間號(hào)的顯示,實(shí)際溫度的顯示,報(bào)警上限值的顯示以及報(bào)警發(fā)生時(shí)的時(shí)間。還可以循環(huán)顯示多個(gè)房間的實(shí)際溫度和上限值。如圖5所示。
[align=center]
圖5 分布式測(cè)溫系統(tǒng)中對(duì)應(yīng)房間溫度以及報(bào)警上限顯示[/align]
5.結(jié)束語(yǔ)
正確讀取多個(gè)單總線數(shù)字溫度傳感器DS18B20的溫度在分布式測(cè)溫系統(tǒng)中是非常重要的。由于在程序設(shè)計(jì)時(shí)必須根據(jù)嚴(yán)格的時(shí)序關(guān)系,因此本文作者創(chuàng)新點(diǎn)是詳細(xì)闡述了初始化時(shí)序、讀寫時(shí)序等復(fù)雜邏輯關(guān)系,設(shè)計(jì)了正確的溫度序列號(hào)讀取程序和溫度讀寫程序并能夠進(jìn)行液晶顯示。由于單總線數(shù)字溫度傳感器DS18B20各個(gè)功能的實(shí)現(xiàn)是通過各種ROM命令與操作功能命令實(shí)現(xiàn)的,這些命令一環(huán)扣著一環(huán),每個(gè)環(huán)都是一個(gè)時(shí)序的集合。在進(jìn)行程序調(diào)試時(shí),不能像調(diào)試其它程序一樣用單步執(zhí)行來進(jìn)行跟蹤,因此對(duì)錯(cuò)誤查找和程序優(yōu)化帶來了很大的難度。在遇到程序運(yùn)行出錯(cuò)時(shí),只能夠根據(jù)錯(cuò)誤現(xiàn)象來分析、推測(cè)、修改和再運(yùn)行來解決,而不能直接定位。文中所介紹的單總線數(shù)字溫度傳感器DS18B20程序設(shè)計(jì)思路與方法,目前已較好地應(yīng)用于分布式測(cè)溫系統(tǒng)中,并且滿足一定精度要求。
參考文獻(xiàn)
[1] 沙占友,智能化集成溫度傳感器原理與應(yīng)用[M],機(jī)械工業(yè)出版社,2002
[2] 周月霞,孫傳友,DS18B20硬件連接及軟件編程 [J],傳感器世界,2001.12
[3] Dallas Semiconductor. DS18B20 1-Wire Digital Thermometer [Z]. Dallas Semiconductor Co, 2002
[4] 徐維濤,郝曉弘,OCXO恒溫槽溫度控制系統(tǒng)控制方法研究[J],微計(jì)算機(jī)信息,2006年第 3 期