?? ok.asm
字號(hào):
ORG 0000H
LJMP START
ORG 0003H
LJMP JIA
ORG 0013H
LJMP JIAN
ORG 0030H
FLAG1 BIT F0 ;DS18B20存在標(biāo)志位
DQ BIT P2.2
TEMPER_L EQU 29H
TEMPER_H EQU 28H
A_BIT EQU 35H
B_BIT EQU 36H
START:
MOV IE,#85H
MOV 30H,#30
shezhi:MOV R1,#30H
acall display
MOV P2,#0FFH
mov a,p2
mov c,acc.0
jnc shezhi
ljmp main
DISPLAY:MOV A,@R1;將29H中的十六進(jìn)制數(shù)轉(zhuǎn)換成10進(jìn)制
MOV B,#10 ;10進(jìn)制/10=10進(jìn)制
DIV AB
MOV B_BIT,A ;十位在A
MOV A_BIT,B ;個(gè)位在B
MOV DPTR,#tab ;指定查表啟始地址
SETB P3.7 ;選中第一個(gè)數(shù)碼管
MOV A,A_BIT ;取個(gè)位數(shù)
MOVC A,@A+DPTR ;查個(gè)位數(shù)的7段代碼
MOV P1,A ;送出個(gè)位的7段代碼
LCALL DELAY ; 調(diào)用延時(shí)
CLR P3.7
SETB P3.6 ;選中第二個(gè)數(shù)碼管
MOV A,B_BIT ;取十位數(shù)
MOVC A,@A+DPTR ;查十位數(shù)的7段代碼
MOV P1,A ;送出十位的7段代碼
LCALL DELAY
CLR P3.6
RET
JIA:
MOV P2,#0FFH
mov a,p2
mov c,acc.0
jc out
INC @R1
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
out:
RETI
JIAN:
MOV P2,#0FFH
mov a,p2
mov c,acc.0
jc out1
DEC @R1
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
out1:
RETI
DELAY: ;延時(shí)子程序
MOV R5,#120
NOP
NOP
D1: MOV R6,#100
D2: DJNZ R6,D2
DJNZ R5,D1
RET
;**************主程序開(kāi)始************
MAIN:
LCALL INIT_18B20
;LCALL RE_CONFIG
LCALL GET_TEMPER
lJMP CHANGE
;**********DS18B20復(fù)位程序*****************
INIT_18B20: SETB DQ
NOP
CLR DQ
MOV R0,#0FBH
TSR1: DJNZ R0,TSR1 ;延時(shí)
SETB DQ
MOV R0,#25H
TSR2: JNB DQ ,TSR3
DJNZ R0,TSR2
TSR3: SETB FLAG1 ;置標(biāo)志位,表明DS18B20存在
CLR P0.5 ;二極管指示
AJMP TSR5
TSR4: CLR FLAG1
LJMP TSR7
TSR5: MOV R0,#06BH
TSR6: DJNZ R0,TSR6
TSR7:SETB DQ ;表明不存在
RET
;*****************讀轉(zhuǎn)換后的溫度值****************
GET_TEMPER:
SETB DQ
LCALL INIT_18B20
JB FLAG1,TSS2
RET ;若不存在則返回
TSS2: MOV A,#0CCH ;跳過(guò)ROM
LCALL WRITE_18B20
MOV A,#44H ;發(fā)出溫度轉(zhuǎn)換命令
LCALL WRITE_18B20
;LCALL DISPLAY ;延時(shí)
LCALL INIT_18B20
MOV A,#0CCH ;跳過(guò)ROM
LCALL WRITE_18B20
MOV A,#0BEH ;發(fā)出讀溫度換命令
LCALL WRITE_18B20
LCALL READ2_18B20 ;讀兩個(gè)字節(jié)的溫度
RET
;***************寫DS18B20程序************
WRITE_18B20:
MOV R2,#8
CLR C
WR1:
CLR DQ
MOV R3,#6
DJNZ R3,$
RRC A
MOV DQ,C
MOV R3,#23
DJNZ R3,$
SETB DQ
NOP
DJNZ R2,WR1
SETB DQ
RET
;***********讀18B20程序,讀出兩個(gè)字節(jié)的溫度*********
READ2_18B20:
MOV R4,#2 ;低位存在29 H,高位存在28H
MOV R1,#29H
RE00: MOV R2,#8
RE01: CLR C
SETB C
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#7
DJNZ R3,$
MOV C,DQ
MOV R3,#23
DJNZ R3,$
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;************讀出的溫度進(jìn)行數(shù)據(jù)轉(zhuǎn)換**************
CHANGE: MOV A,29H
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 29H,A
mov r1,#29h
LCALL DISPLAY ;調(diào)用數(shù)碼管顯示子程序
clr c
mov a,30h
subb a,29h
jc bj
LJMP MAIN
bj:cpl p0.0
cpl p0.1
LJMP MAIN
;***********************************
D1MS: MOV R7,#80 ;1MS延時(shí)(按12MHZ算)
DJNZ R7,$
RET
;*************************
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
end
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -