18b20程序及應(yīng)用
指令 說(shuō)明
本文引用地址:http://www.ex-cimer.com/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) 啟動(dòng)在線(xiàn)ds18B20做溫度AD轉(zhuǎn)換
讀數(shù)據(jù)(BEH) 從高速暫存器讀9位溫度值和CRC值
寫(xiě)數(shù)據(jù)(4EH) 將數(shù)據(jù)寫(xiě)入高速暫存的第3和第4字節(jié)中
復(fù)制(48H) 將高速暫存器中第3和第4字節(jié)復(fù)制到EERAM
讀EERAM(B8H) 將EERAM內(nèi)容寫(xiě)入高速暫存器中第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 ;讀溫度之前必須先復(fù)位
JB BIAOZHI,CUNZAI;查看標(biāo)志位看18B20是否存在,1為存在,0為不存在
RET ;不存在則返回
CUNZAI: ;存在則開(kāi)始讀溫度
MOV A,#0CCH ;跳過(guò)ROM匹配
ACALL XIE ;調(diào)寫(xiě)子程序
MOV A,#44H ;發(fā)出溫度轉(zhuǎn)換命令
ACALL XIE ;調(diào)寫(xiě)子程序
ACALL TIME1 ;調(diào)1秒延時(shí),等等AD轉(zhuǎn)換完成,現(xiàn)在分辨率為12位,溫度最大轉(zhuǎn)換時(shí)間為750MS
ACALL FUWEI ;讀溫前需要復(fù)位
MOV A,#0CCH ;跳過(guò)ROM匹配
ACALL XIE
MOV A,#0BEH ;發(fā)讀溫度命令
ACALL XIE
ACALL DUSHU ;將闈出數(shù)據(jù)讀回
CLR P1.2
RET
;------------------------------------------------------------------------------------------------------------------------------
;復(fù)位子程序
;18B20復(fù)位需要將數(shù)據(jù)位拉低500us
;18B20收到信號(hào)后要等待16-60us,然后發(fā)出60-240us的低脈沖
;-------------------------------------------------------------------------------------------------------------------------------
FUWEI:SETB P2.0
NOP
CLR P2.0
MOV R0,#3
INTE:MOV R1,#107 ;設(shè)一個(gè)537us延時(shí)
KK1: DJNZ R1,KK1
DJNZ R0,INTE
SETB P2.0 ;拉高數(shù)據(jù)線(xiàn),等待回應(yīng)
NOP
NOP
NOP
MOV R0,#25 ;
INTE1:JNB P2.0,INTE2 ;延時(shí)延時(shí)50us等待18B20回應(yīng),若返回低脈沖則說(shuō)明18B20存在
DJNZ R0 ,INTE1
AJMP INTE3 ;經(jīng)過(guò)反應(yīng)時(shí)間而沒(méi)檢測(cè)到18B20的存在,則跳轉(zhuǎn)去清零標(biāo)志位
INTE2:SETB BIAOZHI ;檢測(cè)到18B20存在,置1標(biāo)志位
CLR P1.0
AJMP INTE4
INTE3:CLR BIAOZHI ;沒(méi)檢測(cè)到18B20,清零標(biāo)志位
AJMP INTE5
INTE4:MOV R0,#120 ;延時(shí)240us,確定回應(yīng)信號(hào)已發(fā)完
KK: DJNZ R0,KK
INTE5:SETB P2.0
RET
;----------------------------------------------------------------------------------------------------------------------------------------
;寫(xiě)18B20子程序
;-----------------------------------------------------------------------------------------------------------------------------------------
XIE:MOV R2,#8 ;寫(xiě)計(jì)數(shù)寄存器,一共有8位數(shù)據(jù)
CLR C
LP:CLR P2.0
MOV R3,#6 ;設(shè)一個(gè)延時(shí)
LL1:DJNZ R3,LL1
RRC A ;右循環(huán),先輸出低位
MOV P2.0,C
MOV R3,#23 ;設(shè)延時(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è)讀回?cái)?shù)據(jù)個(gè)數(shù)指針
MOV R1,#WENDU_L ;把溫度數(shù)據(jù)低位存入29H
RE: MOV R2,#8 ;設(shè)數(shù)據(jù)長(zhǎng)度指針
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
評(píng)論