溫度傳感器DS1820使用中注意事項
DS1820雖然具有測溫系統(tǒng)簡單、測溫精度高、連接方便、占用口線少等優(yōu)點,但在實際應用中也應注意以下幾方面的問題:(1)較小的硬件開銷需要相對復雜的軟件進行補償,由于DS1820與微處理器間采用串行數(shù)據(jù)傳送,因此,在對DS1820進行讀寫編程時,必須嚴格的保證讀寫時序,否則將無法讀取測溫結果。在使用PL/M、C等高級語言進行系統(tǒng)程序設計時,對DS1820操作部分最好采用匯編語言實現(xiàn)。由于本節(jié)技術復雜性,對一般讀者DS18B20內容只作閱讀。
(2)在DS1820的有關資料中均未提及單總線上所掛DS1820數(shù)量問題,容易使人誤認為可以掛任意多個DS1820,在實際應用中并非如此。當單總線上所掛DS1820超過8個時,就需要解決微處理器的總線驅動問題,這一點在進行多點測溫系統(tǒng)設計時要加以注意。
(3)連接DS1820的總線電纜是有長度限制的。試驗中,當采用普通信號電纜傳輸長度超過50m時,讀取的測溫數(shù)據(jù)將發(fā)生錯誤。當將總線電纜改為雙絞線帶屏蔽電纜時,正常通訊距離可達150m,當采用每米絞合次數(shù)更多的雙絞線帶屏蔽電纜時,正常通訊距離進一步加長。這種情況主要是由總線分布電容使信號波形產生畸變造成的。因此,在用DS1820進行長距離測溫系統(tǒng)設計時要充分考慮總線分布電容和阻抗匹配問題。
溫度傳感器DS18B20指令(命令)說明
命令功能 | 指令代碼 | 功能說明 |
讀ROM | 33H | 讀DS18B20中的64位光刻ROM序列號 |
啟動轉換 | 44H | 啟動溫度轉換,結果存入內部高速暫存器RAM中 |
寫溫限值 | 4EH | 向內部字節(jié)地址2和3 中寫入上下限溫度值 |
匹配ROM | 55H | 發(fā)出命令后,還發(fā)送64位ROM序列號尋找對應號碼的18B20 |
讀供電 | B4H | 讀電源供給方式: 18B20發(fā)0為寄生供電,1為外接供電 |
讀取溫度 | BEH | 讀取溫度寄存器等9字節(jié)的內容 |
跳過ROM | CCH | 單片18B20時,跳過讀序列號操作,直接發(fā)溫度轉換 |
報警搜索 | ECH | 執(zhí)行后,當溫度超過上下限值時18B20才作響應 |
搜索ROM | F0H | 搜索同一條線上掛接有幾個18B20,識別ROM |
(4)在DS18B20測溫程序設計中,向DS18B20發(fā)出溫度轉換命令后,程序總要等待DS18B20的返回信號,一旦某個DS18B20接觸不好或斷線,當程序讀該DS18B20時,將沒有返回信號,程序會進入死循環(huán)。這一點在進行DS18B20硬件連接和軟件設計時也要給予一定的重視。測溫電纜線建議采用屏蔽4芯雙絞線,其中一對線接地線與信號線,另一組接VCC和地線,屏蔽層在源端單點接地。
當用P1.0和DS18B20相連接時參考程序如下。
DQ EQU P1.0
ORG 0000H
AJMP MAIN
ORG 1000H
MAIN: LCALL INIT_18B20 ;調復位子程序
MOV A,#0CCH
LCALL WRITE_18B20 ; 跳過讀序列號操作
MOV A,#4EH ;寫限制溫度命令
LCALL WRITE_18B20
MOV A, #TH ;寫入上限溫度值
LCALL WRITE_18B20
MOV A,#TL
LCALL WRITE_18B20 。粚懭胂孪逌囟戎
MOV A, CONFIG12
LCALL WRITE_18B20 ;設為12位轉換精度
MAIN1: LCALL INIT_18B20;復位子程序
LCALL RD_TEMPER;讀溫度
LCALL LDVV ;調數(shù)據(jù)處理子程序,簡寫程序
LCALL DISPLAY ;調顯示子程序, 省略程序
LJMP MAIN1
;**********DS18B20復位程序*****************
INIT_18B20: MOV R7 #06H ;復位時查詢次數(shù)
LOP0: SETB DQ ;18B20輸入端
MOV R0,#0FBH
CLR DQ
TSR1: DJNZ R0,TSR1。痪S持DQ低電平480μs~960μs
SETB DQ
MOV R0,#25H
TSR2: DJNZ R0,TSR2
JNB DQ ,TSR3;查看18B20把DQ拉低否
DJNZ R7,LOP0 ;未拉低則延時再查,6次結束
SETB P2.0 。谎訒r期未能查到18B20
SJMP TSR4
TSR3: SETB FLAG1;置標志位FLAG1,表明DS18B20存在
CLR P2.0 ;二極管指示
TSR5: MOV R0,#06BH
TSR6: DJNZ R0,TSR6 ;延時后結束
CLR C
ORL C, DQ
LOP1;JC TSR4 ;確認一次
AJMP TSR7
TSR4: CLR FLAG1 ;未能查到
SETB P2.0 ;取消指示燈
SETB DQ ;表明不存在
TSR7: RET
;*****************讀轉換后的溫度值****************
RD_TEMPER:
SETB DQ
LCALL INIT_18B20
JB FLAG1,TSS2
RET ;若不存在則返回
TSS2: MOV A,#0CCH ;跳過ROM
LCALL WRITE_18B20
MOV A,#44H ;發(fā)出溫度轉換命令
LCALL WRITE_18B20
LCALL DELAY ;調延時子程序500ms
LCALL INIT_18B20;調復位子程序
MOV A,#0CCH;跳過ROM
LCALL WRITE_18B20
MOV A,#0BEH;發(fā)出讀溫度換命令
LCALL WRITE_18B20
LCALL READ2_18B20 ;讀兩個字節(jié)的溫度
RET
;***************寫DS18B20程序************
WRITE_18B20:
MOV R2,#8
SETB DQ
WR1: CLR DQ
MOV R3,#6
DJNZ R3,$ ;寫前保持15μs低電平
RRC A
MOV DQ,C ;寫入一位
MOV R3,#30
DJNZ R3,$ ;等待18B20讀入
SETB DQ
DJNZ R2,WR1;8位寫完否
SETB DQ ;寫完結束
RET
;***********讀18B20程序,讀出兩個字節(jié)的溫度*********
READ2_18B20:
MOV R4,#2 。坏臀淮嬖29H,高位存在28H
MOV R1,#29H
RE00: MOV R2,#8
RE01: CLR DQ。坏碗娖10μs
NOP
NOP
NOP
SETB DQ 。桓唠娖窖訒r
MOV R3,#7
DJNZ R3,$
MOV C,DQ 。蛔x入一位溫度到C中
MOV R3,#30
DJNZ R3,$
RRC A
DJNZ R2,RE01。还沧x8位
MOV @R1,A 。槐4
DEC R1;保存下一數(shù)據(jù)單元地址
DJNZ R4,RE00;讀第二字節(jié)
RET
;************讀出的溫度進行數(shù)據(jù)轉換**************
LDVV: MOV A,29H ; 看成溫度大于0
MOV C,28H.0。粚28H中的最低位移入C
RRC A
MOV C,28H.1
RRC A
MOV C,28H.2
RRC A
MOV C,28H.3
RRC A
MOV 30H,A。徽麛(shù)溫度結果存30H單元
JNC LOP2;小數(shù)點后面的數(shù)四舍五入
INC 30H
LOP2:RET
編輯:admin 最后修改時間:2018-05-08