?? at89s51+ds1820.asm.txt
字號(hào):
我這里有我以前用AT89S51系列單片機(jī)寫(xiě)的程序,用PIC沒(méi)有時(shí)間寫(xiě),大家感興趣的可以看看!
TEMPER_H EQU 36H
TEMPER_L EQU 35H
TEMPER_NUM EQU 30H
FLAG1 BIT 00H
DQ BIT P1.1
ORG 0000H
AJMP START
ORG 0030H
START: MOV SP, #60H
MOV IE, #00H
MOV TCON,#00H
MOV TMOD,#10H
SETB DQ
MOV R0, #20H
MOV R1, #20H
MOV A, #00H
START_1:MOV @R0, A
INC R0
DJNZ R1,START_1
START_2:ACALL DISPLAY
ACALL INIT_1820 ;DS1820初始化程序
JNB FLAG1, START_2
NOP
ACALL RE_CONFIG ;重新寫(xiě)DS18B20暫存存儲(chǔ)器設(shè)定值
ACALL GET_TEMPER ;采集溫度值
ACALL TEMPER_COV ;溫度值轉(zhuǎn)換
ACALL DISPLAY
ACALL DISPLAY
SJMP START_2
;------DS18B20初始化程序
INIT_1820:
SETB DQ
NOP
NOP
CLR DQ ; 將數(shù)據(jù)線下拉500
ACALL YS500 ; 500延時(shí)子程序
SETB DQ ; 釋放數(shù)據(jù)線
ORL P1,#02H ; P1.1轉(zhuǎn)為輸入
ACALL DELAY1 ; 80延時(shí)子程序
JNB DQ,TSR3 ; 判斷DS18B20是否存在
AJMP TSR4 ; 不存在,轉(zhuǎn)TSR4
TSR3: SETB FLAG1 ; 置標(biāo)志位,表示DS1820存在
AJMP TSR5
TSR4: CLR FLAG1 ; 清標(biāo)志位,表示DS1820不存在
AJMP TSR7
TSR5: MOV R0, #6BH ; 200
TSR6: DJNZ R0, TSR6 ; 延時(shí)
TSR7: SETB DQ
RET
;----重新寫(xiě)DS18B20暫存存儲(chǔ)器設(shè)定值
RE_CONFIG:
MOV A, #0CCH ;發(fā)SKIP ROM命令
LCALL WRITE_1820
MOV A, #4EH ;發(fā)寫(xiě)暫存存儲(chǔ)器命令
LCALL WRITE_1820
MOV A, #1FH ;選擇9位溫度分辨率
LCALL WRITE_1820
RET
;----寫(xiě)DS18B20的程序
WRITE_1820:
MOV R2, #8
CLR C
WRITE1: CLR DQ
MOV R3, #7 ;延時(shí)14
DJNZ R3, $
RRC A
MOV DQ, C
MOV R3, #21 ;延時(shí)45
DJNZ R3, $
SETB DQ
NOP
DJNZ R2, WRITE1
SETB DQ
RET
;-----讀出轉(zhuǎn)換后的溫度值
GET_TEMPER:
SETB DQ ;定時(shí)入口
GET_TMP1:
LCALL INIT_1820 ;第一步,完成對(duì)18B20初始化
JB FLAG1, GET_TMP2
LJMP GET_TMP1 ;若DS18B20不存在,則繼續(xù)初始化
GET_TMP2:
LCALL DELAY1 ;延時(shí)80
MOV A, #0CCH ;第二步,ROM命令,跳過(guò)ROM匹配-0CC
LCALL WRITE_1820
MOV A, #44H ;
LCALL WRITE_1820
GET_TMP5:
CLR DQ
NOP
NOP
SETB DQ
MOV R3, #4
DJNZ R3, $
CLR C
MOV C, DQ
JNC GET_TMP5
GET_TMP3:
LCALL INIT_1820
JB FLAG1, GET_TMP4
LJMP GET_TMP3
GET_TMP4:
LCALL DELAY1
MOV A, #0CCH
LCALL WRITE_1820
MOV A, #0BEH
LCALL WRITE_1820
LCALL READ_1820
RET
;----讀DS18B20的程序,從DS18B20中讀出兩個(gè)字節(jié)的溫度數(shù)據(jù)
READ_1820:
MOV R4, #2
MOV R1, #35H
READ0: MOV R2, #8
MOV A, #00H
READ1: CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
SETB DQ
MOV R3, #3
DJNZ R3, $
MOV C, DQ
RRC A
MOV R3, #26
DJNZ R3, $
DJNZ R2, READ1
MOV @R1, A
INC R1
DJNZ R4, READ0
SETB DQ
NOP
NOP
CLR DQ
ACALL DELAY1
SETB DQ
RET
;------將從DS18B20中讀出的溫度數(shù)據(jù)進(jìn)行轉(zhuǎn)換
TEMPER_COV:
MOV A, TEMPER_H
CJNE A, #0F8H, TEMPER_COV1
CLR C
TEMPER_COV1:
JC TEMPER_COV2
CPL A
MOV TEMPER_H, A
MOV A, TEMPER_L
CPL A
ADD A, #01H
MOV TEMPER_L, A
TEMPER_COV2:
MOV A, TEMPER_L ;舍去溫度低位中小數(shù)點(diǎn)后的四位溫度數(shù)值
ANL A, #0F0H
SWAP A
MOV TEMPER_NUM, A
TEMPER_COV3:
MOV A, TEMPER_H
ANL A, #07H
SWAP A
ORL A, TEMPER_NUM
MOV TEMPER_NUM, A ;保存變換后的溫度數(shù)據(jù)
LCALL BIN_BCD
RET
;---------將十六進(jìn)制的溫度數(shù)據(jù)轉(zhuǎn)換成壓縮BCD碼
BIN_BCD:MOV DPTR, #TEMP_TAB
MOV A, TEMPER_NUM
MOVC A, @A+DPTR
MOV TEMPER_NUM, A
RET
TEMP_TAB:
DB 00H,01H,02H,03H,04H,05H,06H,07H
DB 08H,09H,10H,11H,12H,13H,14H,15H
DB 16H,17H,18H,19H,20H,21H,22H,23H
DB 24H,25H,26H,27H,28H,29H,30H,31H
DB 32H,33H,34H,35H,36H,37H,38H,39H
DB 40H,41H,42H,43H,44H,45H,46H,47H
DB 48H,49H,50H,51H,52H,53H,54H,55H
DB 56H,57H,58H,59H,60H,61H,62H,63H
DB 64H,65H,66H,67H,68H,69H,70H,71H
DB 72H,73H,74H,75H,76H,77H,78H,79H
DB 80H,81H,82H,83H,84H,85H,86H,87H
DB 88H,89H,90H,91H,92H,93H,94H,95H
DB 96H,97H,98H,99H
;-----顯示程序
DISPLAY:SETB P2.0
SETB P2.1
SETB P2.2
SETB P2.3
SETB P2.4
SETB P2.5
MOV DPTR, #TABB
MOV A, TEMPER_NUM
ANL A, #0FH
MOVC A, @A+DPTR
MOV P0, A
CLR P2.7
SETB P2.6
LCALL DELAY
MOV A, TEMPER_NUM
SWAP A
ANL A, #0FH
MOVC A, @A+DPTR
MOV P0, A
SETB P2.7
CLR P2.6
LCALL DELAY
RET
TABB: DB 28H,7EH,0A2H,62H,74H,61H,21H,7AH,20H,60H
DELAY: MOV R6, #014H
DEL1: MOV R7, #0FAH
DEL2: DJNZ R7, DEL2
DJNZ R6, DEL1
RET
DELAY1: MOV R7, #27H
DJNZ R7, $
RET
YS500: MOV R7, #0F9H
YS500_1:DJNZ R7, YS500_1
RET
END
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -