S)H)R_H)POGER8ZD{M`6.png (15.01 KB, 下載次數(shù): 179)
下載附件
小弟最近才學(xué)習(xí)
2015-9-2 12:29 上傳
ORG 0000H
A_BIT EQU 20H ;存放個(gè)位數(shù)變量
B_BIT EQU 21H ;存放十位數(shù)變量
FLAG EQU 38H ;DS18B20是否存在標(biāo)志
DQ EQU P2.0
MAIN: ACALL RE_TEMP ;對(duì)傳感器設(shè)置及讀取
ACALL TURN ;轉(zhuǎn)化溫度子程序
ACALL DISPLAY ;顯示子程序
JMP MAIN ;循環(huán)
RE_TEMP: ;對(duì)DS18B20初始化及讀取
SETB DQ
ACALL RESET_1820 ; 調(diào)用復(fù)位子程序
JB FLAG,ST ;判斷DS1820是否存在?
RET
ST: ; DS18B20存在
MOV A,#0CCH ;跳過(guò)ROM匹配
ACALL WRITE_1820 ;寫(xiě)入數(shù)據(jù)
MOV A,#44H ;發(fā)出溫度轉(zhuǎn)換命令
ACALL WRITE_1820 ;寫(xiě)入數(shù)據(jù)
ACALL RESET_1820 ; 準(zhǔn)備讀溫度前先復(fù)位
MOV A,#0CCH ;跳過(guò)ROM匹配
ACALL WRITE_1820 ;寫(xiě)入數(shù)據(jù)
MOV A,#0BEH ;發(fā)出讀溫度命令
ACALL WRITE_1820 ;寫(xiě)入數(shù)據(jù)
ACALL READ_1820 ;讀出溫度數(shù)據(jù)
RET
RESET_1820: SETB DQ ;復(fù)位(有具體的時(shí)序要求)
NOP
CLR DQ ;――――――――――――;主機(jī)發(fā)出延時(shí)537微秒的復(fù)位低脈沖
MOV R1,#3
DLY: MOV R0,#107
DJNZ R0,$
DJNZ R1,DLY ;―――――――――――― ;然后拉高數(shù)據(jù)線 SETB DQ
NOP
NOP
NOP ;――――――――――――
MOV R0,#25H
T2: JNB DQ,T3 ; 等待DS18B20回應(yīng)
DJNZ R0,T2
JMP T4 ;――――――――――――
T3: SETB FLAG ;置標(biāo)志位,表示DS1820存在
JMP T5 ;――――――――――――
T4: CLR FLAG ;清標(biāo)志位,表示DS1820不存在
JMP T7 ;――――――――――――
T5: MOV R0,#117
T6: DJNZ R0,T6 ;時(shí)序要求延時(shí)一段時(shí)間
;――――――――――――
T7: SETB DQ
RET ;――――――――――――
WRITE_1820: MOV R2,#8 ;寫(xiě)入DS18B20(有具體的時(shí)序要求) 一共8位數(shù)據(jù)
CLR C
WR1: CLR DQ ;總線低位,開(kāi)始寫(xiě)入
MOV R3,#7
DJNZ R3,$ ;保持16微秒以上
RRC A ;把字節(jié)DATA分成8個(gè)BIT環(huán)移給C
MOV DQ, C ;寫(xiě)入一個(gè)BIT
MOV R3,#23
DJNZ R3,$ ;等待 SETB DQ ;重新釋放總線 NOP
DJNZ R2,WR1 ;寫(xiě)入下一個(gè)BIT
SETB DQ
RET
READ_1820: MOV R4,#2 ;將溫度高位和低位DS18B20中讀出 讀出兩個(gè)字節(jié)的據(jù)
MOV R1,#29H ;低位存入29H,高位存入28h
RE0: MOV R2,#8 ;數(shù)據(jù)一共有8位
RE1: CLR C
SETB DQ
NOP
NOP
CLR DQ ;讀前總線保持為低
NOP
NOP
NOP
SETB DQ ;開(kāi)始讀總線釋放
MOV R3,#9
RE2: DJNZ R3,RE2 ;延時(shí)18微妙
MOV C,DQ ;從總線讀到一個(gè)BIT
MOV R3,#23
RE3: DJNZ R3,RE3 ; 等待100秒
RRC A ; 把讀得的位價(jià)值環(huán)移給A
DJNZ R2,RE1 ;讀下一個(gè)BIT
MOV @R1,A
DEC R1
DJNZ R4,RE0
RET
TURN: MOV A,29H
MOV C,40H ;將28中的最低位移入C
RRC A
MOV C,41H
RRC A
MOV C,42H
RRC A
MOV C,43H
RRC A
MOV 29H,A
RET
DISPLAY: MOV A,29H ;將29H中的十六進(jìn)制數(shù)成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,#TABLE ;指定查表啟始地址
MOV R0,#4
DP1: MOV R1, #250 ;顯示1000次
LOOP: MOV A,A_BIT ;取個(gè)位數(shù)
MOVC A,@A+DPTR ;查個(gè)位數(shù)的7段代碼
ACALL SEND ;送出個(gè)位的7段代碼
CLR P0.6 ;開(kāi)個(gè)位顯示
ACALL DELAY ;
SETB P0.6
MOV A,B_BIT ;取十位數(shù)
MOVC A,@A+DPTR ;查十位數(shù)的7段代碼
ACALL SEND ;送出個(gè)十位的7段代碼
CLR P0.7 ;開(kāi)十位顯示
ACALL DELAY ;顯示1MS SETB P0.7
DJNZ R1,LOOP ;250次沒(méi)完循環(huán)
DJNZ R0,DP1 ; 4個(gè)250次沒(méi)完循環(huán)
RET
DELAY: MOV R7, #80 ;1ms延時(shí)
DJNZ R7,$
RET
DELAY10ms: MOV R5,#50
DLY1: MOV R6,#100
DLY2: MOV R7,#100
DJNZ R7,$
DJNZ R6,DLY2
DJNZ R5,DLY1
RET
SEND: MOV R2,#8
LOOPS: CLR P0.0
RLC A
MOV P0.1,C
SETB P0.0
DJNZ R2,LOOPS
RET
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H ;數(shù)碼管共陽(yáng)極0~9代碼
DB 92H,82H,0F8H,80H,90H
END
|