?? ds18b20-dsy.asm
字號:
MOV A,TEMP_TH
SUBB A,TEMP_ZH ;減數>被減數,則
JC CHULI1 ;借位標志位C=1,轉
MOV A,TEMP_ZH
SUBB A,TEMP_TL ;減數>被減數,則
JC CHULI2 ;借位標志位C=1,轉
JNB FLAG2,T_COMP1 ;FLAG2=0,顯示標記字符
MOV 74H,#0AH ;熄滅符
LCALL DISP1
JMP T_COMP2
T_COMP1: MOV 74H,#00H
LCALL DISP1 ;顯示"O"
T_COMP2: CLR RELAY ;繼電器吸合
CLR TR0 ;關閉中斷
RET
;---------------------------------------------
;超溫處理
;---------------------------------------------
CHULI1:
SETB RELAY ;繼電器關閉
JNB FLAG2,CHULI10
MOV 74H,#0AH ;熄滅符
LCALL DISP1
JMP CHULI11
CHULI10: MOV 74H,#0DH
LCALL DISP1 ;顯示"H"
;CALL BEEP_BL ;蜂鳴器響
CHULI11:
CLR TR0 ;關閉中斷
RET
;---------------------------------------------
;欠溫處理
;---------------------------------------------
CHULI2: ;欠溫處理
JNB FLAG2,CHULI20
MOV 74H,#0AH ;熄滅符
LCALL DISP1
JMP CHULI21
CHULI20: MOV 74H,#0CH
LCALL DISP1 ;顯示"L"
;CALL BEEP_BL ;蜂鳴器響
CHULI21: CLR TR0 ;關閉中斷
RET
;------------------------------------------------------------
;把 DS18B20 暫存器里的溫度報警值拷貝到EEROM
;------------------------------------------------------------
WRITE_E2:
CALL RESET
MOV A,#0CCH ;跳過ROM匹配
LCALL WRITE
MOV A,#48H ;溫度報警值拷貝到EEROM
LCALL WRITE
RET
;--------------------------------------------------------------
;把 DS18B20 EEROM 里的溫度報警值拷貝回暫存器
;-------------------------------------------------------------
READ_E2:
CALL RESET
MOV A,#0CCH ;跳過ROM匹配
LCALL WRITE
MOV A,#0B8H ;溫度報警值拷貝回暫存器
CALL WRITE
RET
;*****************************************************
; 處理溫度 BCD 碼子程序
;****************************************************
CONVTEMP: MOV A,TEMPH ;判溫度是否零下
ANL A,#80H
JZ TEMPC1 ;溫度零上轉
CLR C
MOV A,TEMPL ;二進制數求補(雙字節)
CPL A ;取反加1
ADD A,#01H
MOV TEMPL,A
MOV A,TEMPH ;-
CPL A
ADDC A,#00H
MOV TEMPH,A ;TEMPHC HI =符號位
MOV TEMPHC,#0BH
SJMP TEMPC11
TEMPC1: MOV TEMPHC,#0AH ;
TEMPC11: MOV A,TEMPHC
SWAP A
MOV TEMPHC,A
MOV A,TEMPL
ANL A,#0FH ;乘0.0625
MOV DPTR,#TEMPDOTTAB
MOVC A,@A+DPTR
MOV TEMPLC,A ;TEMPLC LOW=小數部分 BCD
MOV A,TEMPL ;整數部分
ANL A,#0F0H
SWAP A
MOV TEMPL,A
MOV A,TEMPH
ANL A,#0FH
SWAP A
ORL A,TEMPL
MOV TEMP_ZH,A ;組合后的值存入TEMP_ZH
LCALL HEX2BCD1
MOV TEMPL,A
ANL A,#0F0H
SWAP A
ORL A,TEMPHC ;TEMPHC LOW = 十位數 BCD
MOV TEMPHC,A
MOV A,TEMPL
ANL A,#0FH
SWAP A ;TEMPLC HI = 個位數 BCD
ORL A,TEMPLC
MOV TEMPLC,A
MOV A,R7
JZ TEMPC12
ANL A,#0FH
SWAP A
MOV R7,A
MOV A,TEMPHC ;TEMPHC HI = 百位數 BCD
ANL A,#0FH
ORL A,R7
MOV TEMPHC,A
TEMPC12: RET
;-----------------------------------------------------------
; 小數部分碼表
;-----------------------------------------------------------
TEMPDOTTAB: DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06H
DB 06H,07H,08H,08H,09H,09H
;===========================================================
;顯示區 BCD 碼溫度值刷新子程序
;===========================================================
DISPBCD: MOV A,TEMPLC
ANL A,#0FH
MOV 70H,A ;小數位
MOV A,TEMPLC
SWAP A
ANL A,#0FH
MOV 71H,A ;個位
MOV A,TEMPHC
ANL A,#0FH
MOV 72H,A ;十位
MOV A,TEMPHC
SWAP A
ANL A,#0FH
MOV 73H,A ;百位
MOV A,TEMPHC
ANL A,#0F0H
CJNE A,#010H,DISPBCD0
SJMP DISPBCD2
DISPBCD0: MOV A,TEMPHC
ANL A,#0FH
JNZ DISPBCD2 ;十位數是0
MOV A,TEMPHC
SWAP A
ANL A,#0FH
MOV 73H,#0AH ;符號位不顯示
MOV 72H,A ;十位數顯示符號
DISPBCD2: RET
;***************************************************************
; 溫度顯示子程序
;***************************************************************
;顯示數據在70H - 73H 單元內,用4位共陽數碼管顯示,P0口輸出段碼數據,
;P2 口作掃描控制,每個 LED 數碼管亮 2MS 時間再逐位循環。
DISP1: MOV R1,#70H ;指向顯示數據首址
MOV R5,#7FH ;掃描控制字初值
PLAY: MOV P0,#0FFH
MOV A,R5 ;掃描字放入A
MOV P2,A
MOV A,@R1 ;取顯示數據到A
MOV DPTR,#TAB ;取段碼表地址
MOVC A,@A+DPTR ;查顯示數據對應段碼
MOV P0,A ;段碼放入P0口
MOV A,R5
JB ACC.6,LOOP5 ;小數點處理
CLR P0.7
LOOP5: LCALL DL_MS ;顯示2MS
INC R1 ;指向下一個地址
MOV A,R5 ;放回 R5 內
JNB ACC.3,ENDOUT ;ACC.3=0時一次顯示結束
RR A ;A 中數據循環左移
MOV R5,A ;放入 R5 中
AJMP PLAY ;跳回 PLAY 循環
ENDOUT: MOV P0,#0FFH ;一次顯示結束,P0口復位
MOV P2,#0FFH ;P2口復位
RET
TAB:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH,0C7H,89H
; “0" “1" “2" “3" “4"“5"“6"“7"“8"“9"“滅" “-" “L”“H"
DL_MS: MOV R6,#0AH ;2MS延時程序,LED 顯示程序用
DL1: MOV R7,#64H
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET
;******************************************************
;單字節十六進制轉 BCD
;******************************************************
HEX2BCD1: MOV B,#064H
DIV AB
MOV R7,A
MOV A,#0AH
XCH A,B
DIV AB
SWAP A
ORL A,B
RET
;===============================================
;報警值 TH、TL 數據轉換
;===============================================
ALERT_TL:
MOV 79H,#0CH
MOV 78H,#0BH
MOV A,TEMP_TL
MOV R0,#77H
MOV B,#064H
DIV AB
CJNE A,#01H,ALERT_TL1
MOV @R0,A
JMP ALERT_TL2
ALERT_TL1: MOV A,#0BH ;顯示“-”
MOV @R0,A
ALERT_TL2: MOV A,#0AH
XCH A,B
DIV AB
DEC R0
MOV @R0,A
MOV 7DH,A
DEC R0
MOV @R0,B
MOV 7EH,B
RET
;-----------------------------------------------
ALERT_TH:
MOV 79H,#0DH
MOV 78H,#0BH
MOV A,TEMP_TH
MOV R0,#77H
MOV B,#064H
DIV AB
CJNE A,#01H,ALERT_TH1
MOV @R0,A
JMP ALERT_TH2
ALERT_TH1: MOV A,#0BH ;顯示“-”
MOV @R0,A
ALERT_TH2: MOV A,#0AH
XCH A,B
DIV AB
DEC R0
MOV @R0,A
MOV 7DH,A
DEC R0
MOV @R0,B
MOV 7EH,B
RET
;===============================================
;報警值顯示子程序
;===============================================
ALERT_PLAY:
MOV R1,#75H ;指向顯示數據首址
MOV R5,#7FH ;掃描控制字初值
A_PLAY: MOV P0,#0FFH
MOV A,R5 ;掃描字放入A
MOV P2,A
MOV A,@R1 ;取顯示數據到A
MOV DPTR,#ALERT_TAB ;取段碼表地址
MOVC A,@A+DPTR ;查顯示數據對應段碼
MOV P0,A ;段碼放入P0口
LCALL DL_MS1 ;顯示2MS
INC R1 ;指向下一個地址
MOV A,R5
JNB ACC.3,ENDOUT1
RR A ;A 中數據循環左移
MOV R5,A ;放入 R5 中
AJMP A_PLAY ;跳回 PLAY 循環
ENDOUT1: MOV P0,#0FFH ;一次顯示結束,P0口復位
MOV P2,#0FFH ;P2口復位
RET
ALERT_TAB:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH,0C7H,89H
;共陽段碼表 “0" “1" “2" “3" “4"“5"“6"“7"“8"“9"“滅" “-"
DL_MS1: MOV R6,#0AH ;2MS延時程序,LED 顯示程序用
ADL1: MOV R7,#64H
ADL2: DJNZ R7,ADL2
DJNZ R6,ADL1
RET
;===============================================
;蜂鳴器響一聲子程序
;P3.7=0,蜂鳴器響
;===============================================
BEEP_BL:
MOV R6,#100
BL2: CALL DEX1
CPL BEEP ;對 P3.7 取反
DJNZ R6,BL2
MOV R5,#10
CALL DELAY
RET
DEX1: MOV R7,#180
DE2: NOP
DJNZ R7,DE2
RET
DELAY: ;(R5)*延時10MS
MOV R6,#50
DEL1: MOV R7,#100
DJNZ R7,$
DJNZ R6,DEL1
DJNZ R5,DELAY
RET
;==================================================
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -