📄 ex10-4.asm
字号:
TEMP_ZH EQU 24H ;实测温度值存放单元
TEMPL EQU 25H
TEMPH EQU 26H
TEMP_TH EQU 27H ;高温报警值存放单元
TEMP_TL EQU 28H ;低温报警值存放单元
TEMPHC EQU 29H ;正、负温度值标记
TEMPLC EQU 2AH
TEMPFC EQU 2BH
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 寄存器选择信号
LCD_RW EQU P2.1 ;LCD 读写信号
LCD_EN EQU P2.2 ;LCD 允许信号
FLAG1 EQU 20H.0 ;DS18B20是否存在标志
KEY_UD EQU 20H.1 ;设定按键的增、减标志
DQ EQU P3.3 ;DS18B20数据信号
ORG 0000H
LJMP MAIN
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
LCALL SET_LCD
LCALL RE_18B20
START: LCALL RST ;调用18B20复位子程序
JNB FLAG1,START1 ;DS1820不存在
LCALL MENU_OK ;DS1820存在,调用显示正确信息子程序
MOV TEMP_TH,#055H ;设置TH初值85度
MOV TEMP_TL,#019H ;设置TL初值25度
LCALL RE_18B20A ;调用暂存器操作子程序
LCALL WRITE_E2 ;写入DS18B20
LCALL TEMP_BJ ;显示温度标记
JMP START2
START1: LCALL MENU_ERROR ;调用显示出错信息子程序
LCALL TEMP_BJ ;显示温度标记
SJMP $
START2: LCALL RST ;调用DS18B20复位子程序
JNB FLAG1,START1 ;DS18B20不存在
MOV A,#0CCH ;跳过ROM匹配命令
LCALL WRITE
MOV A,#44H ;温度转换命令
LCALL WRITE
LCALL RST
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE
MOV A,#0BEH ;读温度命令
LCALL WRITE
LCALL READ ;调用DS18B20数据读取操作子程序
LCALL CONVTEMP ;调用温度数据BCD 码处理子程序
LCALL DISPBCD ;调用温度数据显示子程序
LCALL CONV ;调用LCD显示处理子程序
LCALL TEMP_COMP ;调用实测温度值与设定温度值比较子程序
LCALL PROC_KEY ;调用键扫描子程序
SJMP START2 ;循环
;*************************** 键扫描子程序 *****************************
PROC_KEY:JB K1,PROC_K1
LCALL BEEP_BL
JNB K1,$
MOV DPTR,#M_ALAX1
MOV A,#1
LCALL LCD_PRINT
LCALL LOOK_ALARM
JB K3,$
LCALL BEEP_BL
JMP PROC_K2
PROC_K1: JB K2,PROC_END
LCALL BEEP_BL
JNB K2,$
MOV DPTR,#RST_A1
MOV A,#1
LCALL LCD_PRINT
LCALL SET_ALARM
LCALL RE_18B20 ;将设定的TH,TL值写入DS18B20
LCALL WRITE_E2
PROC_K2: LCALL MENU_OK
LCALL TEMP_BJ
PROC_END:RET
;*************************** 设定温度报警值 TH、TL ***************************
SET_ALARM:LCALL LOOK_ALARM
AS0: JB K1,AS00
LCALL BEEP_BL
JNB K1,$
CPL 20H.1 ;UP/DOWN 标记
AS00: JB 20H.1,ASZ01 ;20H.1=1,增加
JMP ASJ01 ;20H.1=0,减小
ASZ01: JB K2,ASZ02 ;TH值调整(增加)
LCALL BEEP_BL
INC TEMP_TH
MOV A,TEMP_TH
CJNE A,#120,ASZ011
MOV TEMP_TH,#0
ASZ011: LCALL LOOK_ALARM
MOV R5,#10
LCALL DELAY
JMP ASZ01
ASZ02: JB K3,ASZ03 ;TL值调整(增加)
LCALL BEEP_BL
INC TEMP_TL
MOV A,TEMP_TL
CJNE A,#99,ASZ021
MOV TEMP_TL,#00H
ASZ021: LCALL LOOK_ALARM
MOV R5,#10
LCALL DELAY
JMP ASZ02
ASZ03: JB K4,AS0 ;确定调整
LCALL BEEP_BL
JNB K4,$
RET
ASJ01: JB K2,ASJ02 ;TH值调整(减少)
LCALL BEEP_BL
DEC TEMP_TH
MOV A,TEMP_TH
CJNE A,#0FFH,ASJ011
JMP ASJ022
ASJ011: LCALL LOOK_ALARM
MOV R5,#10
LCALL DELAY
JMP AS0
ASJ02: JB K3,ASJ03 ;TL值调整(减少)
LCALL BEEP_BL
DEC TEMP_TL
MOV A,TEMP_TL
CJNE A,#0FFH,ASJ021
JMP ASJ022
ASJ021: LCALL LOOK_ALARM ;
MOV R5,#10
LCALL DELAY
JMP AS0
ASJ022: CPL 20H.1
JMP ASZ01
ASJ03: JMP ASZ03
RET
RST_A1: DB " SET ALERT CODE " ,0
;*********************** 实测温度值与设定温度值比较子程序 **********************
TEMP_COMP:MOV A,TEMP_TH
SUBB A,TEMP_ZH ;减数>被减数,则
JC CHULI1 ;借位标志位C=1,转
MOV A,TEMPFC
CJNE A,#0BH,COMP
SJMP CHULI2
COMP: MOV A,TEMP_ZH
SUBB A,TEMP_TL ;减数>被减数,则
JC CHULI2 ;借位标志位C=1,转
MOV DPTR,#BJ5
LCALL TEMP_BJ3
CLR RELAY ;点亮指示灯
RET
CHULI1: MOV DPTR,#BJ3
LCALL TEMP_BJ3
SETB RELAY ;熄灭指示灯
LCALL BEEP_BL ;蜂鸣器响
RET
CHULI2: MOV DPTR,#BJ4
LCALL TEMP_BJ3
SETB RELAY ;熄灭指示灯
LCALL BEEP_BL ;蜂鸣器响
RET
;-----------------------------------------
TEMP_BJ3: MOV A,#0CEH
LCALL WCOM
MOV R1,#0
MOV R0,#2
BBJJ3: MOV A,R1
MOVC A,@A+DPTR
LCALL WDATA
INC R1
DJNZ R0,BBJJ3
RET
BJ3: DB ">H"
BJ4: DB "<L"
BJ5: DB " !"
;
;**************************** 显示温度标记子程序 ***************************
TEMP_BJ: MOV A,#0CBH
LCALL WCOM
MOV DPTR,#BJ1 ;指针指到显示消息
MOV R1,#0
MOV R0,#2
BBJJ1: MOV A,R1
MOVC A,@A+DPTR
LCALL WDATA
INC R1
DJNZ R0,BBJJ1
RET
BJ1: DB 00H,"C"
;******************************** 显示正确信息子程序 ***************************
MENU_OK: MOV DPTR,#M_OK1 ;指针指到显示消息
MOV A,#1 ;显示在第一行
LCALL LCD_PRINT
MOV DPTR,#M_OK2 ;指针指到显示消息
MOV A,#2 ;显示在第一行
LCALL LCD_PRINT
RET
M_OK1: DB " DS18B20 OK ",0
M_OK2: DB " TEMP: ",0
;******************************** 显示出错信息子程序 ***************************
MENU_ERROR:MOV DPTR,#M_ERROR1 ;指针指到显示消息
MOV A,#1 ;显示在第一行
LCALL LCD_PRINT
MOV DPTR,#M_ERROR2 ;指针指到显示消息1
MOV A,#2 ;显示在第一行
LCALL LCD_PRINT
RET
M_ERROR1: DB " DS18B20 ERROR ",0
M_ERROR2: DB " TEMP: ---- ",0
;****************************DS18B20复位子程序 *****************************
RST: SETB DQ
NOP
CLR DQ
MOV R0,#6BH ;主机发出延时复位低脉冲
MOV R1,#04H
TSR1: DJNZ R0,$
MOV R0,#6BH
DJNZ R1,TSR1
SETB DQ ;拉高数据线
NOP
NOP
NOP
MOV R0,#32H
TSR2: JNB DQ,TSR3 ;等待DS18B20回应
DJNZ R0,TSR2
JMP TSR4 ; 延时
TSR3: SETB FLAG1 ; 置1标志位,表示DS1820存在
JMP TSR5
TSR4: CLR FLAG1 ; 清0标志位,表示DS1820不存在
JMP TSR7
TSR5: MOV R0,#06BH
TSR6: DJNZ R0,$ ; 时序要求延时一段时间
TSR7: SETB DQ
RET
;************************ DS18B20暂存器操作子程序 ***************************
RE_18B20:JB FLAG1,RE_18B20A
RET
RE_18B20A:
LCALL RST
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE
WR_SCRAPD:
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
;************************ 复制暂存器子程序 *******************************
WRITE_E2:LCALL RST
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE
MOV A,#48H ;把暂存器里的温度报警值拷贝到EEROM
LCALL WRITE
RET
;*********************** 重读EEROM子程序 ********************************
READ_E2:LCALL RST
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE
MOV A,#0B8H ;把EEROM里的温度报警值拷贝回暂存器
LCALL WRITE
RET
;************************ 将自定义字符写入LCD的CGRAM中 *********************
STORE_DATA:
MOV A,#40H
LCALL WCOM
MOV R2,#08H
MOV DPTR,#D_DATA
MOV R3,#00H
S_DATA: MOV A,R3
MOVC A,@A+DPTR
LCALL WDATA ;写入数据
INC R3
DJNZ R2,S_DATA
RET
D_DATA: DB 0CH,12H,12H,0CH,00H,00H,00H,00H
;*********************** DS18B20数据写入操作子程序 ************************
WRITE: MOV R2,#8 ;一共8位数据
CLR C
WR1: CLR DQ ;开始写入DS18B20总线要处于复位(低)状态
MOV R3,#07
DJNZ R3,$ ;总线复位保持16微妙以上
RRC A ;把一个字节DATA 分成8个BIT环移给C
MOV DQ,C ;写入一位
MOV R3,#3CH
DJNZ R3,$ ;等待100微妙
SETB DQ ;重新释放总线
NOP
DJNZ R2,WR1 ;写入下一位
SETB DQ
RET
;********************** DS18B20数据读取操作子程序 **************************
READ: MOV R4,#4 ;将温度低位、高位、TH、TL从DS18B20中读出
MOV R1,#TEMPL ;存入25H、26H、27H、28H单元
RE00: MOV R2,#8
RE01: CLR CY
SETB DQ
NOP
NOP
CLR DQ ;读前总线保持为低
NOP
NOP
NOP
SETB DQ ;开始读总线释放
MOV R3,#09 ;延时18微妙
DJNZ R3,$
MOV C,DQ ;从DS18B20总线读得一位
MOV R3,#3CH
DJNZ R3,$ ;等待100微妙
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -