📄 ds18b20-lcd.asm
字号:
op equ 21H.0
com equ 22H.1
hw equ 22H.2
K1 EQU P1.4
K2 EQU P1.5
K3 EQU P1.6
K4 EQU P1.7
BEEP EQU P3.7
RELAY EQU P1.3
LCD_X EQU 2FH ;LCD 地址变量
LCD_RS EQU P2.0
LCD_RW EQU P2.1
LCD_EN EQU P2.2
flag1 equ 20H.0 ;DS18B20是否存在标记
KEY_UD EQU 20H.1 ;设定 KEY 的UP与DOWN 标记
date_line equ p3.3
count1 data 0BH
count2 data 0CH
flag data 08H
iraddr1 data 09H
iraddr2 data 0AH
endcount1 data 0DH
endcount2 data 0EH
TEMP_ZH DATA 24H ;实时温度值存放单元
TEMPL DATA 25H ;
TEMPH DATA 26H ;
TEMP_TH DATA 27H ;高温报警值存放单元
TEMP_TL DATA 28H ;低温报警值存放单元
TEMPHC DATA 29H ;
TEMPLC DATA 2AH
TEMPPOINT DATA 2BH
;=====================================================
ORG 0000H
JMP MAIN
org 000BH
JMP timeint
MAIN: MOV SP,#60H
MOV A,#00H
MOV R0,#20H ;将 20H-2FH 单元清零
MOV R1,#10H
CLEAR: MOV @R0,A
INC R0
DJNZ R1,CLEAR
CALL SET_LCD
CALL RE_18B20
START0: call tran
start: JB K1,start11
setb hw
jmp start22
start11: jB k2,start
setb com
start22: CALL RESET
CALL TRAN1
jb hw,start33
jb com,setcom
setcom: MOV TMOD,#20H ; 定时器1工作于8位自动重载模式,用于产生波特率
MOV TH1,#0FDH
MOV TL1,#0FDH ; 波特率9600
MOV SCON,#50H ; 设定串行口工作方式
ANL PCON,#0EFH ; 波特率不倍增
SETB TR1 ; 启动定时器1 ;18B20复位子程序
MOV IE,#0
start33: JNB FLAG1,START1 ;DS1820不存在
JB HW,MEUM1
JB COM,MEUM2
MEUM1: CALL TRAN2
JMP START44
MEUM2: CALL TRAN1
START44: CALL READ_E2
CALL TEMP_BJ ;显示温度标记
JMP START2
START1: CALL MENU_ERROR
CALL TEMP_BJ ;显示温度标记
JMP $
START2:
CALL RESET
JNB FLAG1,START1 ;DS1820不存在
MOV A,#0CCH ; 跳过ROM匹配
CALL WRITE
MOV A,#44H ; 发出温度转换命令
CALL WRITE
CALL RESET
MOV A,#0CCH ; 跳过ROM匹配
CALL WRITE
MOV A,#0BEH ; 发出读温度命令
CALL WRITE
CALL READ
call CONVTEMP
Call DISPBCD
CALL CONV
CALL TEMP_COMP
jb com,chuangkou
jb hw,hongwai
hongwai: call main1
jmp main3
chuangkou:mov a,#0xee
call sendchar
mov a,temp_zh
call sendchar
mov a,temppoint
call sendchar
mov a,temphc
call sendchar
main3: clr tr0
CALL PROC_KEY ; 键扫描
SJMP START2
sendchar: MOV SBUF,A
JNB TI,$ ; 等特数据传送
CLR TI
ret
;-----------------------------------------------------
PROC_KEY:
JB K1,PROC_K1 ; 按键K1处理
CALL BEEP_BL
JNB K1,$
MOV DPTR,#M_ALAX1
MOV A,#1
CALL LCD_PRINT
CALL LOOK_ALARM
JB K3,$
CALL BEEP_BL
JMP PROC_K2
PROC_K1: ; 按键K2处理
JB K2,PROC_END
CALL BEEP_BL
JNB K2,$
MOV DPTR,#RESET_A1
MOV A,#1
CALL LCD_PRINT
CALL SET_ALARM
CALL RE_18B20 ;将设定的TH,TL值写入DS18B20内
CALL WRITE_E2
PROC_K2:
CALL MENU_OK
CALL TEMP_BJ
JMP PROC_END
PROC_END:
RET
;============================================
;设定报警值 TH、TL
;============================================
SET_ALARM:
;CALL RESET_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
JMP ASZ01
ASJ03: JMP ASZ03
RET
RESET_ALARM:
MOV DPTR,#RESET_A1 ;指针指到显示信息区
MOV A,#1 ;显示在第一行
CALL LCD_PRINT
RET
RESET_A1:
DB "RESET ALERT CODE"
TEMP_COMP:
MOV A,TEMP_TH
SUBB A,TEMP_ZH ;减数>被减数,则
JC CHULI1 ;借位标志位C=1,转
MOV A,TEMP_ZH
SUBB A,TEMP_TL ;减数>被减数,则
JC CHULI2 ;借位标志位C=1,转
MOV DPTR,#BJ5
CALL TEMP_BJ3
CLR RELAY ;继电器吸合
RET
CHULI1:
MOV DPTR,#BJ3
CALL TEMP_BJ3
SETB RELAY ;继电器关闭
CALL BEEP_BL
RET
CHULI2:
MOV DPTR,#BJ4
CALL TEMP_BJ3
CALL BEEP_BL
RET
;-----------------------------------------
TEMP_BJ3:
MOV A,#0CEH
CALL WCOM
MOV R1,#0
MOV R0,#2
BBJJ3: MOV A,R1
MOVC A,@A+DPTR
CALL WDATA
INC R1
DJNZ R0,BBJJ3
RET
BJ3:
DB ">H"
BJ4:
DB "<L"
BJ5:
DB " !"
TEMP_BJ:
MOV A,#0CBH
CALL WCOM
MOV DPTR,#BJ1 ;指针指到显示消息
MOV R1,#0
MOV R0,#2
BBJJ1: MOV A,R1
MOVC A,@A+DPTR
CALL WDATA
INC R1
DJNZ R0,BBJJ1
RET
BJ1:
DB 00H,"C"
;=================================================
MENU_OK:
MOV DPTR,#M_OK1 ;指针指到显示消息
MOV A,#1 ;显示在第一行
CALL LCD_PRINT
MOV DPTR,#M_OK2 ;指针指到显示消息
MOV A,#2 ;显示在第一行
CALL LCD_PRINT
RET
TRAN:
MOV DPTR,#M_HW ;指针指到显示消息
MOV A,#1 ;显示在第一行
CALL LCD_PRINT
MOV DPTR,#M_COM ;指针指到显示消息
MOV A,#2 ;显示在第一行
CALL LCD_PRINT
RET
TRAN1: MOV DPTR,#M_OK3 ;指针指到显示消息
MOV A,#1 ;显示在第一行
CALL LCD_PRINT
MOV DPTR,#M_OK2 ;指针指到显示消息
MOV A,#2 ;显示在第一行
CALL LCD_PRINT
RET
TRAN2: MOV DPTR,#M_OK1 ;指针指到显示消息
MOV A,#1 ;显示在第一行
CALL LCD_PRINT
MOV DPTR,#M_OK2 ;指针指到显示消息
MOV A,#2 ;显示在第一行
CALL LCD_PRINT
RET
M_OK1:
DB "DS18B20 hw OK ",0
M_OK2:
DB " TEMP: ",0
m_OK3:
db "DS18B20 COM 0K ",0
M_HW:
DB "HW SELECT K1 ",0
M_COM:
DB "COM SELECT K2 ",0
;-----------------------------------------------
MENU_ERROR:
MOV DPTR,#M_ERROR1 ;指针指到显示消息1
MOV A,#1 ;显示在第一行
CALL LCD_PRINT
MOV DPTR,#M_ERROR2 ;指针指到显示消息1
MOV A,#2 ;显示在第一行
CALL LCD_PRINT
RET
M_ERROR1:
DB " DS18B20 ERROR ",0
M_ERROR2:
DB " TEMP: ---- ",0
;====================================================
reset: setb date_line
nop
clr date_line
mov r0,#6bh ;主机发出延时复位低脉冲
mov r1,#04h
tsr1: djnz r0,$
mov r0,#6bh
djnz r1,tsr1
setb date_line ;然后拉高数据线
nop
nop
nop
mov r0,#32h
tsr2: jnb date_line,tsr3 ;等待DS18B20回应
djnz r0,tsr2
jmp tsr4 ; 延时
tsr3: setb flag1 ; 置标志位,表示DS1820存在
jmp tsr5
tsr4: clr flag1 ; 清标志位,表示DS1820不存在
jmp tsr7
tsr5: mov r0,#06bh
tsr6: djnz r0,$ ; 时序要求延时一段时间
tsr7: setb date_line
ret
;=======================================================
RE_18B20:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -