?? ds18b20-dsy.asm
字號(hào):
;********************************************************************************
;* 描述: *
;* DS18B20溫度控制數(shù)碼管顯示 *
;* 1、K3 → 進(jìn)入設(shè)定溫度報(bào)警值 TL 狀態(tài): *
;* L--20 *
;* 2、K3 → 進(jìn)入設(shè)定溫度報(bào)警值 TH 狀態(tài): *
;* H--28 *
;* 3、K3 → 返回 *
;* 4、設(shè)定過(guò)程: K1 →加鍵 (UP), K2 →減鍵 (DOWN),可快速調(diào)。 *
;********************************************************************************
TIMER_L DATA 23H
TIMER_H DATA 24H
TIMER_COUN DATA 25H
TEMPL DATA 26H
TEMPH DATA 27H
TEMP_TH DATA 28H
TEMP_TL DATA 29H
TEMPHC DATA 2AH
TEMPLC DATA 2BH
TEMP_ZH DATA 2CH
BEEP EQU P3.7
DATA_LINE EQU P3.3
RELAY EQU P1.3
FLAG1 EQU 20H.0
FLAG2 EQU 20H.1
;-------------------------------------------------
K1 EQU P1.4
K2 EQU P1.5
K3 EQU P1.6
K4 EQU P1.7
;=================================================
ORG 0000H
JMP MAIN
ORG 000BH
AJMP INT_T0
;--------------------------------------------------
MAIN: MOV SP,#30H
MOV TMOD,#01H ;T0,方式1
MOV TIMER_L,#00H ;50ms定時(shí)值
MOV TIMER_H,#4CH
MOV TIMER_COUN,#00H ;中斷計(jì)數(shù)
MOV IE,#82H ;EA=1,ET0=1
LCALL READ_E2
;LCALL RE_18B20
MOV 20H,#00H
SETB BEEP
SETB RELAY
MOV 7FH,#0AH ;熄滅符
CALL RESET ;復(fù)位與檢測(cè)DS18B20
JNB FLAG1,MAIN1 ;FLAG1=0,DS18B20不存在
JMP START
MAIN1: CALL RESET
JB FLAG1,START
LCALL BEEP_BL ;DS18B20錯(cuò)誤,報(bào)警
JMP MAIN1
START:
MOV A,#0CCH ; 跳過(guò)ROM匹配
CALL WRITE
MOV A,#044H ; 發(fā)出溫度轉(zhuǎn)換命令
CALL WRITE
CALL RESET
MOV A,#0CCH ; 跳過(guò)ROM匹配
CALL WRITE
MOV A,#0BEH ; 發(fā)出讀溫度命令
CALL WRITE
CALL READ ;讀溫度數(shù)據(jù)
CALL CONVTEMP
CALL DISPBCD
CALL DISP1
CALL SCANKEY
LCALL TEMP_COMP
JMP MAIN1
;=====================================================
;DS18B20 復(fù)位與檢測(cè)子程序
;FLAG1=1 OK, FLAG1=0 ERROR
;======================================================
RESET:
SETB DATA_LINE
NOP
CLR DATA_LINE
MOV R0,#64H ;主機(jī)發(fā)出延時(shí)600微秒的復(fù)位低脈沖
MOV R1,#03H
RESET1: DJNZ R0,$
MOV R0,#64H
DJNZ R1,RESET1
SETB DATA_LINE ;然后拉高數(shù)據(jù)線
NOP
MOV R0,#25H
RESET2: JNB DATA_LINE,RESET3 ;等待DS18B20回應(yīng)
DJNZ R0,RESET2
JMP RESET4 ; 延時(shí)
RESET3: SETB FLAG1 ; 置標(biāo)志位,表示DS1820存在
JMP RESET5
RESET4: CLR FLAG1 ; 清標(biāo)志位,表示DS1820不存在
JMP RESET6
RESET5: MOV R0,#064H
DJNZ R0,$ ; 時(shí)序要求延時(shí)一段時(shí)間
RESET6: SETB DATA_LINE
RET
;===========================================================
;
;===========================================================
WRITE: MOV R2,#8 ;一共8位數(shù)據(jù)
CLR CY
WR1:
CLR DATA_LINE ;開(kāi)始寫(xiě)入DS18B20總線要處于復(fù)位(低)狀態(tài)
MOV R3,#09
DJNZ R3,$ ;總線復(fù)位保持18微妙以上
RRC A ;把一個(gè)字節(jié)DATA 分成8個(gè)BIT環(huán)移給C
MOV DATA_LINE,C ;寫(xiě)入一個(gè)BIT
MOV R3,#23
DJNZ R3,$ ;等待46微妙
SETB DATA_LINE ;重新釋放總線
NOP
DJNZ R2,WR1 ;寫(xiě)入下一個(gè)BIT
SETB DATA_LINE
RET
;============================================================
;從DS18B20中讀出溫度低位、高位和報(bào)警值TH、TL
;存入26H、27H、28H、29H
;============================================================
READ: MOV R4,#4 ; 將溫度高位和低位從DS18B20中讀出
MOV R1,#26H ; 存入26H、27H、28H、29H
RE00: MOV R2,#8
RE01: CLR C
SETB DATA_LINE
NOP
NOP
CLR DATA_LINE ;讀前總線保持為低
NOP
NOP
NOP
SETB DATA_LINE ;開(kāi)始讀總線釋放
MOV R3,#09 ;延時(shí)18微妙
DJNZ R3,$
MOV C,DATA_LINE ;從DS18B20總線讀得一個(gè)BIT
MOV R3,#23
DJNZ R3,$ ;等待46微妙
RRC A ;把讀得的位值環(huán)移給A
DJNZ R2,RE01 ;讀下一個(gè)BIT
MOV @R1,A
INC R1
DJNZ R4,RE00
RET
;--------------------------------------------
;200ms對(duì)閃動(dòng)標(biāo)記取反一次
;--------------------------------------------
INT_T0:
PUSH ACC
PUSH PSW
MOV TL0,TIMER_L
MOV TH0,TIMER_H
INC TIMER_COUN
MOV A,TIMER_COUN
CJNE A,#04H,INT_END
MOV TIMER_COUN,#00H
CPL FLAG2
INT_END:
POP PSW
POP ACC
RETI
;==========================================================
;重新對(duì) DS18B20 初始化
;將設(shè)定的溫度報(bào)警值寫(xiě)入 DS18B20
;==========================================================
RE_18B20:
JB FLAG1,RE_18B20A
RET
RE_18B20A:
CALL RESET
MOV A,#0CCH ;跳過(guò)ROM匹配
LCALL WRITE
MOV A,#4EH ;寫(xiě)暫存寄存器
LCALL WRITE
MOV A,TEMP_TH ;TH(報(bào)警上限)
LCALL WRITE
MOV A,TEMP_TL ;TL(報(bào)警下限)
LCALL WRITE
MOV A,#7FH ;12位精確度
LCALL WRITE
RET
;====================================================
;功能鍵掃描子程序
;====================================================
SCANKEY:
MOV P1,#0F0H
JB K1,SCAN_K2
CALL BEEP_BL
SCAN_K1: CALL ALERT_TL
CALL ALERT_PLAY
JB K1,SCAN_K1
CALL BEEP_BL
SCAN_K11: CALL ALERT_TH
CALL ALERT_PLAY
JB K1,SCAN_K11
CALL BEEP_BL
SCAN_K2: JB K2,SCAN_K3
CALL BEEP_BL
SCAN_K3: JB K3,SCAN_K4
CALL BEEP_BL
LCALL RESET_ALERT
LCALL RE_18B20
LCALL WRITE_E2
SCAN_K4: JB K4,SCAN_END
CALL BEEP_BL
SCAN_END: RET
;================================================
;設(shè)置溫度報(bào)警值
;================================================
RESET_ALERT:
CALL ALERT_TL
CALL ALERT_PLAY
JNB K3,$ ;K3為位移鍵
SETB TR0
RESET_TL:
CALL ALERT_PLAY
JNB FLAG2,R_TL01
mov 75H,7fh ;送入熄滅符
mov 76H,7fh
CALL ALERT_PLAY
JMP R_TL02
R_TL01: CALL ALERT_TL
mov 75h,7Eh ;送設(shè)定值
mov 76h,7Dh
CALL ALERT_PLAY ;顯示設(shè)定值
R_TL02: JNB K1,K011A
JNB K2,K011B
JNB K3,RESET_TH
JMP RESET_TL
K011A:
INC TEMP_TL
MOV A,TEMP_TL
CJNE A,#120,K012A ;沒(méi)有到設(shè)定上限值,轉(zhuǎn)
MOV TEMP_TL,#0
K012A: CALL TL_DEL
JMP RESET_TL
K011B:
DEC TEMP_TL
MOV A,TEMP_TL
CJNE A,#00H,K012B ;沒(méi)有到設(shè)定下限值,轉(zhuǎn)
MOV TEMP_TL,#119
K012B: CALL TL_DEL
JMP RESET_TL
;-------------------------------------------------------
RESET_TH:
CALL BEEP_BL
JNB K3,$
RESET_TH1:
CALL ALERT_PLAY
JNB FLAG2,R_TH01
mov 75H,7fh ;送入熄滅符
mov 76H,7fh
CALL ALERT_PLAY
JMP R_TH02
R_TH01: CALL ALERT_TH
mov 75h,7Eh ;
mov 76h,7Dh
CALL ALERT_PLAY
R_TH02: JNB K1,K021A
JNB K2,K021B
JNB K3,K002
JMP RESET_TH1
K021A:
INC TEMP_TH
MOV A,TEMP_TH
CJNE A,#120,K022A ;沒(méi)有到設(shè)定上限值,轉(zhuǎn)
MOV TEMP_TH,#0
K022A: CALL TH_DEL
JMP RESET_TH1
K021B:
DEC TEMP_TH ;減1
MOV A,TEMP_TH
CJNE A,#00H,K022B ;沒(méi)有到設(shè)定下限值,轉(zhuǎn)
MOV TEMP_TH,#119
K022B: CALL TH_DEL
JMP RESET_TH1
K002: CALL BEEP_BL
CLR TR0 ;關(guān)閉中斷
RET
;-----------------------------------------------------
;鍵延時(shí)子程序
;多次調(diào)用報(bào)警值顯示程序來(lái)延時(shí)
;-----------------------------------------------------
TL_DEL: ;報(bào)警低值延時(shí)
MOV R2,#0AH
TL_DEL1: CALL ALERT_TL
CALL ALERT_PLAY
DJNZ R2,TL_DEL1
RET
TH_DEL: ;報(bào)警高值延時(shí)
MOV R2,#0AH
TH_DEL1: CALL ALERT_TH
CALL ALERT_PLAY
DJNZ R2,TH_DEL1
RET
;====================================================
;實(shí)時(shí)溫度值與設(shè)定報(bào)警溫度值 TH、TL 比較子程序
;當(dāng)實(shí)際溫度大于 TH 的設(shè)定值時(shí),顯示“H”,繼電器關(guān)閉。
;當(dāng)實(shí)際溫度小于 TH 的設(shè)定值時(shí),顯示“O”,繼電器吸合。
;當(dāng)實(shí)際溫度小于 TL 的設(shè)定值時(shí),顯示“L”。
;閃動(dòng)顯示標(biāo)記符 H、L、O
;====================================================
TEMP_COMP:
SETB TR0 ;啟動(dòng)中斷
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -