📄 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 + -