?? ad1405.asm
字號:
; 文件名:AD1405.ASM
; 程序功能:數字溫度計 ,已調好
A_BIT EQU 20H ;存放個位數變量
B_BIT EQU 21H ;存放十位數變量
FLAG EQU 38H ;DS18B20是否存在標志
DQ EQU P2.5 ;DQ引腳由P2.5控制
MAIN: ;主程序標號
ACALL RE_TEMP ;對傳感器設置及讀取
ACALL TURN ;轉化溫度子程序
ACALL DISPLAY ;顯示子程序
JMP MAIN ;循環
RE_TEMP: ;對DS18B20初始化及讀取
SETB DQ
ACALL RESET_1820 ;調用復位子程序
JB FLAG, ST ;判斷DS1820是否存在?
RET
ST: ; DS18B20存在
MOV A,#0CCH ;跳過ROM匹配
ACALL WRITE_1820 ;寫入數據
MOV A,#44H ;發出溫度轉換命令
ACALL WRITE_1820 ;寫入數據
ACALL RESET_1820 ;準備讀溫度前先復位
MOV A,#0CCH ;跳過ROM匹配
ACALL WRITE_1820 ;寫入數據
MOV A,#0BEH ;發出讀溫度命令
ACALL WRITE_1820 ;寫入數據
ACALL READ_1820 ;讀出溫度數據
RET
RESET_1820: ;復位(有具體的時序要求)
SETB DQ
NOP
CLR DQ
;――――――――――――
;主機發出延時537微秒的復位低脈沖
MOV R1,#3
DLY: MOV R0,#107
DJNZ R0,$
DJNZ R1,DLY
;――――――――――――
;然后拉高數據線
SETB DQ
NOP
NOP
NOP
;――――――――――――
MOV R0,#25H
T2: JNB DQ ,T3 ;等待DS18B20回應
DJNZ R0, T2
JMP T4
;――――――――――――
T3: SETB FLAG ;置標志位,表示DS1820存在
JMP T5
;――――――――――――
T4: CLR FLAG ;清標志位,表示DS1820不存在
JMP T7
;――――――――――――
T5: MOV R0,#117
T6: DJNZ R0,T6 ;時序要求延時一段時間
;――――――――――――
T7: SETB DQ
RET
;――――――――――――
WRITE_1820: ;寫入DS18B20(有具體的時序要求)
MOV R2,#8 ;一共8位數據
CLR C
WR1:
CLR DQ ;總線低位,開始寫入
MOV R3,#7
DJNZ R3,$ ;保持16微秒以上
RRC A ;把字節DATA分成8個BIT環移給C
MOV DQ, C ;寫入一個BIT
MOV R3,#23
DJNZ R3,$ ;等待
SETB DQ ;重新釋放總線
NOP
DJNZ R2,WR1 ;寫入下一個BIT
SETB DQ
RET
READ_1820: ;將溫度高位和低位從DS18B20中讀出
MOV R4,#2 ; 讀出兩個字節的數據
MOV R1,#29H ;低位存入29H,高位存入28h
RE0:
MOV R2,#8 ;數據一共有8位
RE1:
CLR C
SETB DQ
NOP
NOP
CLR DQ ;讀前總線保持為低
NOP
NOP
NOP
SETB DQ ;開始讀總線釋放
MOV R3,#9
RE2:
DJNZ R3,RE2 ;延時18微妙
MOV C, DQ ;從總線讀到一個BIT
MOV R3,#23
RE3: ;
DJNZ R3,RE3 ;等待100秒
RRC A ;把讀得的位價值環移給A
DJNZ R2,RE1 ;讀下一個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: ;將29H中的十六進制數成10進制
MOV A,29H
MOV B,#10 ;10進制/10=10進制
DIV AB
MOV B_BIT, A ;十位在A
MOV A_BIT, B ;個位在B
MOV DPTR,#TABLE ;指定查表啟始地址
MOV R0,#4
DP1:
MOV R1, #250 ;顯示1000次
LOOP:
MOV A,A_BIT ;取個位數
MOVC A,@A+DPTR ;查個位數的7段代碼
MOV P0,A ;送出個位的7段代碼
CLR P2.1 ;開個位顯示
ACALL DELAY ;
SETB P2.1
MOV A,B_BIT ;取十位數
MOVC A,@A+DPTR ;查十位數的7段代碼
MOV P0,A ;送出個十位的7段代碼
CLR P2.0 ;開十位顯示
ACALL DELAY ;顯示1MS
SETB P2.0
DJNZ R1,LOOP ;250次沒完循環
DJNZ R0,DP1 ;4個250次沒完循環
RET
DELAY: ;10Ms延時
MOV R4,#5
MOV R6,#100
MOV R7, #250
DJNZ R7,$
DJNZ R6, $
DJNZ R4, $
RET
TABLE: ;數碼管共陽極0~9代碼
DB 0C0H,0F9H,0A4H,0B0H,99H
DB 92H,82H,0F8H,80H,90H
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -