?? ds18b20-lcd1602-溫度控制.asm
字號:
;*******************************************************************
;* *
;* ME500單片機開發系統演示程序 - DS18B20溫度控制程序 *
;* *
;* LCD1602顯示 *
;* *
;* 版本: 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 *
;*【聲明】此程序僅用于學習與參考,引用請注明版權和作者信息! *
;* *
;*******************************************************************
TEMP_ZH DATA 24H ;實時溫度值存放單元
TEMPL DATA 25H ;溫度低位值存放單元
TEMPH DATA 26H ;溫度高位值存放單元
TEMP_TH DATA 27H ;高溫報警值存放單元
TEMP_TL DATA 28H ;低溫報警值存放單元
;-----------------------------------------------------------
T0_CONU DATA 30H ;中斷計數單元
TIME_L DATA 31H ;中斷定時常數 TL0
TIME_H DATA 32H ;中斷定時常數 TH0
;-----------------------------------------------------------
K1 EQU P1.4 ;獨立鍵
K2 EQU P1.5
K3 EQU P1.6
K4 EQU P1.7
;-----------------------------------------------------------
DATE_LINE EQU P3.3 ;DS18B20 數據線
BEEP EQU P3.7 ;蜂鳴器控制線
RELAY EQU P1.3 ;繼電器控制線
;-----------------------------------------------------------
LCD_X EQU 2FH ;LCD 地址變量
LCD_RS EQU P2.0 ;LCD 數據/命令選擇端
LCD_RW EQU P2.1 ;LCD 讀/寫選擇端
LCD_EN EQU P2.2 ;LCD 使能信號
;-----------------------------------------------------------
FLAG1 BIT 20H.0 ;DS18B20是否存在標志
KEY_UD BIT 20H.1 ;設定 KEY 的UP與DOWN 標志
FLAG2 BIT 20H.2 ;閃爍標志
FLAG3 BIT 20H.3 ;溫度正負標志
FLAG4 BIT 20H.4 ;蜂鳴器靜音標志
;===========================================================
ORG 0000H
JMP MAIN
ORG 000BH
JMP INT_T0
ORG 0030H
;===========================================================
MAIN: MOV SP,#60H
MOV A,#00H
MOV R0,#20H ;將 20H-2FH 單元清零
MOV R1,#10H
CLEAR: MOV @R0,A
INC R0
DJNZ R1,CLEAR
MOV TMOD,#01H ;T0,方式1
MOV TIME_L,#00H ;50ms定時值
MOV TIME_H,#4CH
MOV T0_CONU,#00H ;中斷計數
MOV IE,#82H ;EA=1,ET0=1
SETB TR0
CALL SET_LCD ;初始化 LCD 1602
START:
CALL RESET ;18B20復位子程序
JNB FLAG1,START1 ;DS1820不存在
CALL MENU_OK ;
CALL TEMP_BJ ;顯示溫度標記
JMP START3
START1:
CALL MENU_ERROR ;
CLR TR0
START2:
CALL RESET ;18B20復位子程序
JB FLAG1,START
CALL BEEP_BL ;DS1820不正常時,報警。
JMP START2
;-----------------------------------------------------------
START3:
CALL RESET ;DS18B20 復位與檢測
JNB FLAG1,START1 ;DS1820不存在
CALL READ_TEMP ;讀出溫度與報警數據
CALL CONVTEMP
CALL TEMP_COMP ;溫度比較子程序
CALL CONV
CALL PROC_KEY ;鍵功能掃描
SJMP START3
;-----------------------------------------------
;T0,50ms中斷子程序
;500ms對閃動標記 20H.2 取反一次
;-----------------------------------------------
INT_T0:
PUSH ACC ;入棧保護
PUSH PSW
MOV TL0,TIME_L ;重裝定時值
MOV TH0,TIME_H ;
INC T0_CONU ;中斷次數加1
MOV A,T0_CONU
CJNE A,#0AH,INT_END ;500ms 是否到?
MOV T0_CONU,#00H
CPL 20H.2 ;閃動標記取反
INT_END:
POP PSW ;出棧
POP ACC
RETI
;-------------------------------------------------
;按鍵功能處理子程序
;K1: 查看報警值, K3: 退出查看狀態
;K2: 設定報警值
;-------------------------------------------------
PROC_KEY:
JB K1,PROC_K1 ; 按鍵K1處理
CALL BEEP_BL ;蜂鳴器響一聲
JNB K1,$ ;等待 K1 釋放
MOV DPTR,#M_ALAX1
MOV A,#1
CALL LCD_PRINT
CALL LOOK_ALARM ;查看報警值
JB K3,$ ;等待 K3 鍵按下
CALL BEEP_BL
JMP PROC_K2
PROC_K1: ; 按鍵K2處理
JB K2,PROC_K4
CALL BEEP_BL ;蜂鳴器響一聲
JNB K2,$ ;等待 K2 釋放
MOV DPTR,#RESET_A1
MOV A,#1
CALL LCD_PRINT
CALL SET_ALARM ;設定報警值
CALL RE_18B20 ;將設定的TH,TL值寫入DS18B20內
CALL WRITE_E2 ;溫度報警值拷貝到EEROM
PROC_K2:
CALL MENU_OK
CALL TEMP_BJ
PROC_K4:
JB K4,PROC_END ;按鍵K4處理
CALL BEEP_BL ;蜂鳴器響一聲
JNB K4,$ ;等待 K4 釋放
CPL FLAG4
PROC_END:
RET
;---------------------------------------------
M_ALAX1:
DB " LOOK ALERT CODE",0
RESET_A1:
DB "RESET ALERT CODE",0
;============================================
;設定報警值 TH、TL
;K1: 選擇 UP/DOWN 方式
;K2: 設定 TH 值,K3: 設定 TL 值
;K4: 確定與退出
;============================================
SET_ALARM:
CALL LOOK_ALARM
AS0:
JB K1,AS00
CALL BEEP_BL
JNB K1,$
CPL 20H.1 ;UP/DOWN 標記
AS00: JB 20H.1,ASZ01 ;20H.1=1,UP
JMP ASJ01 ;20H.1=0,DOWN
ASZ01: JB K2,ASZ02 ;TH值調整(增加)
CALL BEEP_BL
INC TEMP_TH
MOV A,TEMP_TH
CJNE A,#120,ASZ011 ;沒有到設定上限值,轉
MOV TEMP_TH,#0
ASZ011: CALL LOOK_ALARM ;顯示設定值
MOV R5,#10 ;
CALL DELAY
JMP ASZ01
ASZ02: JB K3,ASZ03 ;TL值調整(增加)
CALL BEEP_BL
INC TEMP_TL
MOV A,TEMP_TL
CJNE A,#99,ASZ021 ;沒有到設定上限值,轉
MOV TEMP_TL,#00H
ASZ021: CALL LOOK_ALARM ;顯示設定值
MOV R5,#10
CALL DELAY
JMP ASZ02
ASZ03: JB K4,AS0 ;確定調整 OK
CALL BEEP_BL
JNB K4,$
RET
ASJ01:
JB K2,ASJ02 ;TH值調整 (減少)
CALL BEEP_BL
DEC TEMP_TH ;
MOV A,TEMP_TH
CJNE A,#0FFH,ASJ011 ;沒有到設定下限值,轉
JMP ASJ022
ASJ011: CALL LOOK_ALARM ;顯示設定值
MOV R5,#10
CALL DELAY
JMP AS0
ASJ02: JB K3,ASJ03 ;TL值調整(減少)
CALL BEEP_BL
DEC TEMP_TL
MOV A,TEMP_TL
CJNE A,#0FFH,ASJ021 ;沒有到設定下限值,轉
JMP ASJ022
ASJ021: CALL LOOK_ALARM ;顯示設定值
MOV R5,#10
CALL DELAY
JMP AS0
ASJ022: CPL 20H.1 ;DOWN/UP 轉換標記
JMP ASZ01
ASJ03: JMP ASZ03
RET
;===================================================
;在LCD1602的第一行顯示"RESET ALERT CODE"
;===================================================
RESET_ALARM:
MOV DPTR,#RESET_A2 ;指針指到顯示信息區
MOV A,#1 ;顯示在第一行
CALL LCD_PRINT
RET
RESET_A2:
DB "RESET ALERT CODE"
;====================================================
;實時溫度值與設定報警溫度值 TH、TL 比較子程序
;當實際溫度大于 TH 的設定值時,顯示“>H”,繼電器關閉
;當實際溫度小于 TH 的設定值時,顯示“!!”,繼電器吸合
;當實際溫度小于 TL 的設定值時,顯示“<L”,蜂鳴器響
;閃動顯示標記符 >H、<L、!!
;====================================================
TEMP_COMP:
; SETB TR0 ;啟動中斷
MOV A,TEMP_ZH
CJNE A,TEMP_TH,T_COMP0
T_COMP0:
JNC CHULI1
MOV A,TEMP_ZH
SUBB A,TEMP_TL ;減數>被減數,則
JC CHULI2 ;借位標志位C=1,轉
JNB FLAG2,T_COMP1 ;FLAG2=0,顯示標記字符
MOV LCD_X,#0EH ;FLAG2=1,清屏,形成閃動效果
LCALL CLR_TWO2
JMP T_COMP2
T_COMP1: MOV DPTR,#BJ5 ;顯示"!!"
CALL TEMP_BJ3
T_COMP2: CLR RELAY ;繼電器吸合
; CLR TR0 ;關閉中斷
RET
CHULI1: ;超溫處理
JNB FLAG2,CHULI10
MOV LCD_X,#0EH
LCALL CLR_TWO2
JMP CHULI11
CHULI10: MOV DPTR,#BJ3 ;顯示">H"
CALL TEMP_BJ3
SETB RELAY ;繼電器關閉
JB FLAG4,CHULI11
CALL BEEP_BL ;蜂鳴器響
CHULI11: ;CLR TR0 ;關閉中斷
RET
CHULI2: ;欠溫處理
JNB FLAG2,CHULI20
MOV LCD_X,#0EH
LCALL CLR_TWO2
JMP CHULI21
CHULI20: MOV DPTR,#BJ4 ;顯示"<L"
CALL TEMP_BJ3
JB FLAG4,CHULI21
CALL BEEP_BL ;蜂鳴器響
CHULI21: ; CLR TR0 ;關閉中斷
RET
;==========================================
;清兩個字符(閃爍功能用)
;==========================================
CLR_TWO2:
MOV A,#' '
MOV B,LCD_X
CALL LCDP2
INC LCD_X
MOV A,#' '
MOV B,LCD_X
CALL LCDP2
RET
;=========================================
;標記字符寫入子程序
;=========================================
TEMP_BJ3:
MOV A,#0CEH ;指定寫入地址
CALL WCOM
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -