18b20程序及應用
指令 說明
本文引用地址:http://butianyuan.cn/article/150417.htm
DJNZ R7,LOOP0
RET
TAB:DB 0C0H,0F9H,0A4H,0B0H
DB 99H, 92H, 82H, 0F8H
DB 80H, 90H, 88H, 83H
DB 0C6H,0A1H,86H, 8EH
DB 0FFH
END
溫度轉(zhuǎn)換(44H) 啟動在線ds18B20做溫度AD轉(zhuǎn)換
讀數(shù)據(jù)(BEH) 從高速暫存器讀9位溫度值和CRC值
寫數(shù)據(jù)(4EH) 將數(shù)據(jù)寫入高速暫存的第3和第4字節(jié)中
復制(48H) 將高速暫存器中第3和第4字節(jié)復制到EERAM
讀EERAM(B8H) 將EERAM內(nèi)容寫入高速暫存器中第3和第4字節(jié)
讀電源供電方式(B4H) 了解18B20的供電方式
WENDU_L EQU 29H;用于保存讀出溫度的低字節(jié)
WENDU_H EQU 28H;用于保存讀出溫度的高字節(jié)
XIAOSHU EQU 27H;用于保存溫度的小數(shù)部分
ZHENGSHU EQU 26H;用于保存整數(shù)部分
BIAOZHI BIT 50H;18B20檢查位1為存在,0為不存在
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:MOV SCON,#00H
ACALL DUWEN
ACALL ZHENGHE
ACALL BCD
ACALL DISP
ACALL TIME1
AJMP MAIN
;----------------------------------------------------------------------------------------------------------------------------------------
;讀溫度子程序
;----------------------------------------------------------------------------------------------------------------------------------------
DUWEN:SETB P2.0
ACALL FUWEI ;讀溫度之前必須先復位
JB BIAOZHI,CUNZAI;查看標志位看18B20是否存在,1為存在,0為不存在
RET ;不存在則返回
CUNZAI: ;存在則開始讀溫度
MOV A,#0CCH ;跳過ROM匹配
ACALL XIE ;調(diào)寫子程序
MOV A,#44H ;發(fā)出溫度轉(zhuǎn)換命令
ACALL XIE ;調(diào)寫子程序
ACALL TIME1 ;調(diào)1秒延時,等等AD轉(zhuǎn)換完成,現(xiàn)在分辨率為12位,溫度最大轉(zhuǎn)換時間為750MS
ACALL FUWEI ;讀溫前需要復位
MOV A,#0CCH ;跳過ROM匹配
ACALL XIE
MOV A,#0BEH ;發(fā)讀溫度命令
ACALL XIE
ACALL DUSHU ;將闈出數(shù)據(jù)讀回
CLR P1.2
RET
;------------------------------------------------------------------------------------------------------------------------------
;復位子程序
;18B20復位需要將數(shù)據(jù)位拉低500us
;18B20收到信號后要等待16-60us,然后發(fā)出60-240us的低脈沖
;-------------------------------------------------------------------------------------------------------------------------------
FUWEI:SETB P2.0
NOP
CLR P2.0
MOV R0,#3
INTE:MOV R1,#107 ;設(shè)一個537us延時
KK1: DJNZ R1,KK1
DJNZ R0,INTE
SETB P2.0 ;拉高數(shù)據(jù)線,等待回應
NOP
NOP
NOP
MOV R0,#25 ;
INTE1:JNB P2.0,INTE2 ;延時延時50us等待18B20回應,若返回低脈沖則說明18B20存在
DJNZ R0 ,INTE1
AJMP INTE3 ;經(jīng)過反應時間而沒檢測到18B20的存在,則跳轉(zhuǎn)去清零標志位
INTE2:SETB BIAOZHI ;檢測到18B20存在,置1標志位
CLR P1.0
AJMP INTE4
INTE3:CLR BIAOZHI ;沒檢測到18B20,清零標志位
AJMP INTE5
INTE4:MOV R0,#120 ;延時240us,確定回應信號已發(fā)完
KK: DJNZ R0,KK
INTE5:SETB P2.0
RET
;----------------------------------------------------------------------------------------------------------------------------------------
;寫18B20子程序
;-----------------------------------------------------------------------------------------------------------------------------------------
XIE:MOV R2,#8 ;寫計數(shù)寄存器,一共有8位數(shù)據(jù)
CLR C
LP:CLR P2.0
MOV R3,#6 ;設(shè)一個延時
LL1:DJNZ R3,LL1
RRC A ;右循環(huán),先輸出低位
MOV P2.0,C
MOV R3,#23 ;設(shè)延時
LL: DJNZ R3,LL ;
SETB P2.0
NOP
NOP
DJNZ R2,LP ;判斷是否完成數(shù)據(jù)傳送
SETB P2.0 ;完成傳送拉高數(shù)據(jù)位
RET
;-----------------------------------------------------------------------------------------------------------------------------------------
;從18B20中讀出溫度數(shù)據(jù)子程序
;-----------------------------------------------------------------------------------------------------------------------------------------
DUSHU:MOV R4,#2 ;設(shè)讀回數(shù)據(jù)個數(shù)指針
MOV R1,#WENDU_L ;把溫度數(shù)據(jù)低位存入29H
RE: MOV R2,#8 ;設(shè)數(shù)據(jù)長度指針
RE1: CLR C
SETB P2.0
NOP
NOP
CLR P2.0
NOP
NOP
NOP
SETB P2.0
MOV R3,#9
DJNZ R3,$
MOV C,P2.0
MOV R3,#23
NN: DJNZ R3,NN
RRC A
DJNZ R2,RE1
MOV @R1,A
DEC R1 ;高位存入28H
DJNZ R4,RE
RET
評論