?? wendu.txt
字號:
DTH EQU 20H ;溫度值高八位
DTL EQU 21H ;溫度值低八位
NUM1 EQU 22H ;第一位顯示字,十位
NUM2 EQU 23H ;第二位顯示字,個位
NUM3 EQU 24H ;第三位顯示字,小數(shù)位
TEMP EQU 25H
DQ BIT P1.7 ;定義18B20數(shù)字輸入輸出
;============主函數(shù)==================
ORG 0000H
AJMP MAIN
ORG 0100H
MAIN: MOV DPTR,#07100H
MOV A,#3H
MOVX @DPTR,A
loop: ACALL RD_REG
ACALL COUNT
MOV R1,#10
LOOPDP: ACALL DISP
DJNZ R1,LOOPDP
ACALL CONVERT
SJMP loop
;初始化18B20
BE_18B20: CLR C
CLR C
CLR DQ ;發(fā)送復(fù)位脈沖
MOV R5,#60
MOV R7,#105 ;延時500us
ACALL DEL5us ;延時子程序,延時時長為(R7)*5us+5us
SETB DQ ;釋放總線,等到待大約70us
MOV R7,#11 ;等待
ACALL DEL5us
LOOPB: JNB DQ,NEXTB1
DJNZ R5,LOOPB
SJMP STOPB ;復(fù)位不成功,C=0,返回
NEXTB1: MOV R7,#73 ;復(fù)位成功后延時約1000us,C=1
ACALL DEL5us
SETB C
STOPB: NOP
RET
;---------讀字子程序-------------
;讀出的字存在RD_WORD中,會對ACC及R6的值產(chǎn)生影向
RD_Byte: CLR A
MOV R6,#08H
LOOPD: CLR DQ ;讀時序開始,至少保持1us
NOP
NOP
SETB DQ ;釋放數(shù)據(jù)線,此后的15us內(nèi)的數(shù)據(jù)就是我們要的數(shù)據(jù)
MOV R7,#1
ACALL DEL5us
MOV C,DQ
RRC A
MOV R7,#6 ;延時
ACALL DEL5us
DJNZ R6,LOOPD
RET
;---------寫字子程序--------------
;要寫的字在WR_WORD,會對ACC及R6產(chǎn)生影向
WR_Byte: CLR C ;消除C的影響
MOV R6,#08H
LOOPW:
SETB DQ
RRC A ;無論讀寫,都是低位在先
CLR DQ ;寫時序開始
MOV R7,#2
ACALL DEL5us ; DS18B20在15us到60us間進(jìn)行采樣
SETB DQ
MOV DQ,C
MOV R7,#6
ACALL DEL5us
DJNZ R6,LOOPW
RET
;============其他子函數(shù)===========
;---------讀中間寄存器------------
;會對R6產(chǎn)生影向,同時也會對相關(guān)寄存器產(chǎn)生影向
;只讀前兩個寄存器
RD_REG: ACALL BE_18B20 ;芯片復(fù)位
MOV A,#0CCH ;ROM配對
ACALL WR_Byte
MOV A,#0BEH ;讀取寄存器值
ACALL WR_Byte
ACALL RD_Byte ;讀取低字節(jié)數(shù)據(jù)
MOV DTL,A
ACALL RD_Byte ;讀取高字節(jié)數(shù)據(jù)
MOV DTH,A
ACALL BE_18B20
RET
;--------溫度轉(zhuǎn)換-----------------
;會對R0及相關(guān)寄存器產(chǎn)生影響
CONVERT: ACALL BE_18B20 ;芯片復(fù)位
JNC CONVERT
MOV A,#0CCH ;跳過芯片ROM配對
ACALL WR_Byte
MOV A,#44H ;溫度轉(zhuǎn)換指令
ACALL WR_Byte
LOOPC: ACALL RD_Byte ;讀BUSY,等待轉(zhuǎn)換結(jié)束
MOV R0,A
ACALL DISP
CJNE R0,#0FFH,LOOPC
RET
;=================================
COUNT: MOV A,DTL ;小數(shù)位的計算
MOV R0,#0FH ;取出低四位
ANL A,R0
MOV B,#10
MUL AB
MOV B,#16 ;1表示0.1度
DIV AB
MOV NUM3,A
MOV A,DTL ;個位數(shù)與十位數(shù)的計算
MOV R0,#0F0H
ANL A,R0
SWAP A
MOV DTL,A
MOV A,DTH
MOV R0,#0FH
ANL A,R0
SWAP A
ORL A,DTL ;計算出來的溫度值存在A中
MOV TEMP,A
MOV B,#10 ;將其轉(zhuǎn)換成顯示字
DIV AB
MOV NUM1,A
MOV NUM2,B
RET
;顯示子程序
DISP: MOV A,#40H
MOV DPTR,#7101H
MOVX @DPTR,A
MOV DPTR,#7102H
MOV A,num1 ;百位
LCALL SQL
MOVX @DPTR,A
LCALL DELAY
MOV A,#20H
MOV DPTR,#7101H
MOVX @DPTR,A
MOV DPTR,#7102H
MOV A,num2 ;十位
LCALL SQL1
MOVX @DPTR,A
LCALL DELAY
MOV A,#10H
MOV DPTR,#7101H
MOVX @DPTR,A
MOV DPTR,#7102H
MOV A,num3 ;個位
LCALL SQL
MOVX @DPTR,A
LCALL DELAY
;5us延時子程序
DEL5us: NOP
NOP
NOP
DJNZ R7,DEL5us
RET
;送數(shù)碼管各位數(shù)之間的延時
DELAY: MOV R5,#04H
LOOP6: MOV R4,#0F9H
LOOP7: DJNZ R4,LOOP7
NOP
NOP
DJNZ R5,LOOP6
RET
;查表程序(不帶小數(shù)點(diǎn))
SQL: INC A
MOVC A,@A+PC
RET
TAB: DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H
;查表程序(帶小數(shù)點(diǎn))
SQL1: INC A
MOVC A,@A+PC
RET
TAB1: DB 0FDH,61H,0DBH,0F3H,67H,0B7H,0BFH,0E1H,0FFH,0F7H
END
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -