?? ds18b20-溫度控制.asm
字號:
;*******************************************************************
;* *
;* ME500單片機開發系統演示程序 - DS18B20溫度控制 *
;* *
;* 數碼管顯示 *
;* *
;* 版本: V1.0 (2006/11/20) *
;* 作者: gguoqing (Email: gguoqing@willar.com) *
;* 網站: www.willar.com(偉納電子) www.mcusj.com(偉納單片機世界) *
;* 郵箱: support@willar.com *
;* *
;*【版權】Copyright(C)偉納電子 www.willar.com All Rights Reserved *
;*【聲明】此程序僅用于學習與參考,引用請注明版權和作者信息! *
;* *
;*******************************************************************
TIMER_L EQU 23H
TIMER_H EQU 24H
TIMER_COUN EQU 25H
TEMPL EQU 26H
TEMPH EQU 27H
TEMP_TH EQU 28H
TEMP_TL EQU 29H
TEMPHC EQU 2AH
TEMPLC EQU 2BH
TEMP_ZH EQU 2CH
BEEP BIT P3.7
DATA_LINE BIT P3.3
RELAY BIT P1.3
FLAG1 BIT 20H.0
FLAG2 BIT 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定時值
MOV TIMER_H,#4CH
MOV TIMER_COUN,#00H ;中斷計數
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 ;復位與檢測DS18B20
JNB FLAG1,MAIN1 ;FLAG1=0,DS18B20不存在
JMP START
MAIN1: CALL RESET
JB FLAG1,START
LCALL BEEP_BL ;DS18B20錯誤,報警
JMP MAIN1
START:
MOV A,#0CCH ; 跳過ROM匹配
CALL WRITE
MOV A,#044H ; 發出溫度轉換命令
CALL WRITE
CALL RESET
MOV A,#0CCH ; 跳過ROM匹配
CALL WRITE
MOV A,#0BEH ; 發出讀溫度命令
CALL WRITE
CALL READ_TEMP ;讀溫度數據
CALL CONVTEMP ;溫度數據處理
CALL DISPBCD
CALL TEMP_PLAER ;顯示實時溫度
CALL SCANKEY ;掃描鍵
LCALL TEMP_COMP ;比較溫度值
JMP MAIN1
;=====================================================
;DS18B20 復位與檢測子程序
;FLAG1=1 OK, FLAG1=0 ERROR
;======================================================
RESET:
SETB DATA_LINE
NOP
CLR DATA_LINE
MOV R0,#64H ;主機發出延時600微秒的復位低脈沖
MOV R1,#03H
RESET1: DJNZ R0,$
MOV R0,#64H
DJNZ R1,RESET1
SETB DATA_LINE ;然后拉高數據線
NOP
MOV R0,#25H
RESET2: JNB DATA_LINE,RESET3 ;等待DS18B20回應
DJNZ R0,RESET2
JMP RESET4 ; 延時
RESET3: SETB FLAG1 ; 置標志位,表示DS1820存在
JMP RESET5
RESET4: CLR FLAG1 ; 清標志位,表示DS1820不存在
JMP RESET6
RESET5: MOV R0,#064H
DJNZ R0,$ ; 時序要求延時一段時間
RESET6: SETB DATA_LINE
RET
;===========================================================
;
;===========================================================
WRITE: MOV R2,#8 ;一共8位數據
CLR CY
WR1:
CLR DATA_LINE ;開始寫入DS18B20總線要處于復位(低)狀態
MOV R3,#09
DJNZ R3,$ ;總線復位保持18微妙以上
RRC A ;把一個字節DATA 分成8個BIT環移給C
MOV DATA_LINE,C ;寫入一個BIT
MOV R3,#23
DJNZ R3,$ ;等待46微妙
SETB DATA_LINE ;重新釋放總線
NOP
DJNZ R2,WR1 ;寫入下一個BIT
SETB DATA_LINE
RET
;========================================================
;讀溫度子程序
;從DS18B20中讀出溫度低位、高位和報警值TH、TL
;存入26H、27H、28H、29H
;========================================================
READ_TEMP:
MOV R4,#4
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 ;開始讀總線釋放
MOV R3,#07 ;延時15微妙
DJNZ R3,$
MOV C,DATA_LINE ;從DS18B20總線讀得一個BIT
MOV R3,#23
DJNZ R3,$ ;等待46微妙
RRC A ;把讀得的位值環移給A
DJNZ R2,RE01 ;讀下一個BIT
MOV @R1,A
INC R1
DJNZ R4,RE00
RET
;--------------------------------------------
;中斷服務子程序
;200MS對閃動標記 FLAG2 取反一次
;--------------------------------------------
INT_T0:
PUSH ACC ;入棧保護
PUSH PSW
MOV TL0,TIMER_L ;重置定時參數
MOV TH0,TIMER_H
INC TIMER_COUN ;中斷次數加1
MOV A,TIMER_COUN
CJNE A,#04H,INT_END
MOV TIMER_COUN,#00H
CPL FLAG2 ;對 FLAG2 取反
INT_END:
POP PSW ;出棧
POP ACC
RETI
;==========================================================
;重新對 DS18B20 初始化
;將設定的溫度報警值寫入 DS18B20
;==========================================================
RE_18B20:
JB FLAG1,RE_18B20A
RET
RE_18B20A:
CALL RESET
MOV A,#0CCH ;跳過ROM匹配
LCALL WRITE
MOV A,#4EH ;寫暫存寄存器
LCALL WRITE
MOV A,TEMP_TH ;TH(報警上限)
LCALL WRITE
MOV A,TEMP_TL ;TL(報警下限)
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
;================================================
;設置溫度報警值
;================================================
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 ;送設定值
MOV 76H,7DH
CALL ALERT_PLAY ;顯示設定值
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 ;沒有到設定上限值,轉
MOV TEMP_TL,#0
K012A: CALL TL_DEL
JMP RESET_TL
K011B:
DEC TEMP_TL
MOV A,TEMP_TL
CJNE A,#00H,K012B ;沒有到設定下限值,轉
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 ;沒有到設定上限值,轉
MOV TEMP_TH,#0
K022A: CALL TH_DEL
JMP RESET_TH1
K021B:
DEC TEMP_TH ;減1
MOV A,TEMP_TH
CJNE A,#00H,K022B ;沒有到設定下限值,轉
MOV TEMP_TH,#119
K022B: CALL TH_DEL
JMP RESET_TH1
K002: CALL BEEP_BL
CLR TR0 ;關閉中斷
RET
;-----------------------------------------------------
;鍵延時子程序
;多次調用報警值顯示程序來延時
;-----------------------------------------------------
TL_DEL: ;報警低值延時
MOV R2,#0AH
TL_DEL1: CALL ALERT_TL
CALL ALERT_PLAY
DJNZ R2,TL_DEL1
RET
TH_DEL: ;報警高值延時
MOV R2,#0AH
TH_DEL1: CALL ALERT_TH
CALL ALERT_PLAY
DJNZ R2,TH_DEL1
RET
;====================================================
;實時溫度值與設定報警溫度值 TH、TL 比較子程序
;當實際溫度大于 TH 的設定值時,顯示“H”,繼電器關閉。
;當實際溫度小于 TH 的設定值時,顯示“O”,繼電器吸合。
;當實際溫度小于 TL 的設定值時,顯示“L”。
;閃動顯示標記符 H、L、O
;====================================================
TEMP_COMP:
SETB TR0 ;啟動中斷
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -