📄 1[1][1].0.asm
字号:
ORG 0000H
TEMPER_L EQU 29H ;用于保存读出温度的低 8 位
TEMPER_H EQU 28H ;用于保存读出温度的高 8 位
FLAG1 EQU 38H ;是否检测到 DS18B20 标志位
A_BIT EQU 20H ;数码管个位数存放内存位置
B_BIT EQU 21H ;数码管十位数存放内存位置
C_BIT EQU 22H ;数码管百位数存放内存位置
DOT EQU 23H ;数码管C存放内存位置
HBJWD EQU 24H ;上限报警温度存放内存位置
LBJWD EQU 30H ;下限报警温度存放内存位置
HLIM EQU 25H ;上限温度存放内存位置
LLIM EQU 26H ;下限温度存放内存位置
CHANGE EQU 27H ;温度变量存放内存位置
TRANT EQU 31H ;按键显示转移变量
DIS_1 EQU 32H
DIS_2 EQU 33H
WDDATA BIT P1.0 ;定义DS18B20数据口
MOV P1,#00H
CLR EA ;关闭总中断
MOV SCON,#50H ;设置成串口1方式
MOV TMOD,#20H ;波特率发生器T1工作在模式2上
MOV TH1,#0F3H ;预置初值(按照波特率2400BPS预置初值)
MOV TL1,#0F3H ;预置初值(按照波特率2400BPS预置初值)
SETB TR1 ;启动定时器T1
;以上完成串口2400通讯初始化设置
LJMP MAIN
ORG 0100H
MAIN: MOV P1,#00H
SETB P1.4
MOV HBJWD,#102 ;设定初始值
MOV LBJWD,#8
MOV HLIM,#100
MOV LLIM,#10
MOV CHANGE,#0
SJMP START1
LOOPA: LCALL KEYA ;键1,调用键盘扫描子程序
LCALL NUM_CODE
LCALL SHOW
SJMP LOOPA ;等待按键
LOOPB: LCALL KEYB ;键4,调用键盘扫描子程序
LCALL NUM_CODE
LCALL SHOW
SJMP LOOPB ;等待按键
;START: LCALL DY12MS1
START1: LCALL DISPLAY
LCALL GET_TEMPER;调用读温度子程序
MOV A,29H
MOV C,40H;将 28H 中的最低位移入 C
RRC A
MOV C,41H
RRC A
MOV C,42H
RRC A
MOV C,43H
RRC A
MOV 29H,A
LCALL BAOJING;检查是否超温
LCALL DISPLAY;调用数码管显示子程序
LCALL CHUANKOU;调用串口程序
LCALL RECIEVE
AJMP START1
;500毫秒延时子程序,占用R4、R5
DELAY500:MOV R4,#248
DA222:MOV R5,#248
DJNZ R5,$
DJNZ R4,DA222
RET
;报警程序,超过上或低于下限温度则分别关和开继电器,超过上或低于下限报警温度则开蜂鸣器
BAOJING: CLR C
MOV A,HBJWD ;上报警温度值送A
SUBB A,29H
JB ACC.7,DONE0
SJMP DONE1
DONE0: LCALL MING
LCALL SHUT
RET
DONE1: CLR P1.5
MOV A,HLIM
SUBB A,29H
JB ACC.7,DONE2
SJMP DONE3
DONE2: LCALL SHUT
RET
DONE3: MOV A,LBJWD
SUBB A,29H
JNB ACC.7,DONE4
SJMP DONE5
DONE4: LCALL OPEN
LCALL MING
RET
DONE5: MOV A,LLIM
SUBB A,29H
JNB ACC.7,DONE6
SJMP DONE7
DONE6: LCALL OPEN
DONE7: RET
SHUT: CLR P1.4 ;关继电器
RET
OPEN: SETB P1.4 ;开继电器
RET
MING: SETB P1.5 ;开蜂鸣器
LCALL DY12MS1
LCALL DY12MS1
LCALL DY12MS1
CLR P1.5
LCALL DY12MS1
LCALL DY12MS1
LCALL DY12MS1
RET
;---------------------------------------------------
; 清零子程序
;---------------------------------------------------
CLEAR: MOV A_BIT,#0
MOV B_BIT,#0
MOV C_BIT,#0
MOV DOT,#0
RET
;--------------------------------------------------
; 按键扫描子程序
;--------------------------------------------------
KEYA: JB P2.4,TESTA ;K1键按下?
SETB P1.5
LCALL DY12MS1
CLR P1.5
MOV A,HLIM
MOV B,#100
DIV AB
MOV C_BIT,A
MOV A,B
MOV B,#10
DIV AB
MOV A_BIT,B
MOV B_BIT,A
MOV DOT,#0
TESTA: JB P2.5,TEST1 ;K2键按下?
SETB P1.5
LCALL DY12MS1
CLR P1.5
INC HLIM
MOV A,HLIM
MOV B,#100
DIV AB
MOV C_BIT,A
MOV A,B
MOV B,#10
DIV AB
MOV A_BIT,B
MOV B_BIT,A
MOV DOT,#0
MOV A,HLIM
ADD A,#2
MOV HBJWD,A
TEST1: JB P2.6,TESTB ;K3键按下?
SETB P1.5
LCALL DY12MS1
CLR P1.5
DEC HLIM
MOV A,HLIM
MOV B,#100
DIV AB
MOV C_BIT,A
MOV A,B
MOV B,#10
DIV AB
MOV A_BIT,B
MOV B_BIT,A
MOV DOT,#0
MOV A,HLIM
ADD A,#2
MOV HBJWD,A
TESTB: JB P2.7,TEST2
SETB P1.5
LCALL DY12MS1
CLR P1.5
LJMP START1
TEST2: RET
;---------------------------------------------------------
KEYB: JB P2.7,TESTC
SETB P1.5
LCALL DY12MS1
CLR P1.5
MOV A,LLIM
MOV B,#100
DIV AB
MOV C_BIT,A
MOV A,B
MOV B,#10
DIV AB
MOV A_BIT,B
MOV B_BIT,A
MOV DOT,#0
TESTC: JB P2.5,TEST3
SETB P1.5
LCALL DY12MS1
CLR P1.5
INC LLIM
MOV A,LLIM
MOV B,#100
DIV AB
MOV C_BIT,A
MOV A,B
MOV B,#10
DIV AB
MOV A_BIT,B
MOV B_BIT,A
MOV DOT,#0
MOV A,LLIM
SUBB A,#2
MOV LBJWD,A
TEST3: JB P2.6,TESTD ;K3键按下?
SETB P1.5
LCALL DY12MS1
CLR P1.5
DEC LLIM
MOV A,LLIM
MOV B,#100
DIV AB
MOV C_BIT,A
MOV A,B
MOV B,#10
DIV AB
MOV A_BIT,B
MOV B_BIT,A
MOV DOT,#0
MOV A,LLIM
SUBB A,#2
MOV LBJWD,A
TESTD: JB P2.4,TEST4
SETB P1.5
LCALL DY12MS1
CLR P1.5
LJMP START1
TEST4: RET
DY12MS1: MOV R6,#0D0H
DY12MS2: MOV R5,#0FFH
DY12MS3: DJNZ R5,DY12MS3
DJNZ R6,DY12MS2
RET
;--------------------------------------------------
; 取字形码子程序
;--------------------------------------------------
NUM_CODE: MOV DPTR,#TAB
MOV A,DOT
MOVC A,@A+DPTR ;取小时高位字形码
XRL A,#0B0H ;加小数点
MOV 50H,A ;字形码放50H
MOV A,A_BIT
MOVC A,@A+DPTR ;取小时低位字形码
MOV 51H,A ;字形码放51H
MOV A,B_BIT
MOVC A,@A+DPTR ;取分钟高位字形码
MOV 52H,A ;字形码放52H
MOV A,C_BIT
MOVC A,@A+DPTR ;取分钟低位字形码
MOV 53H,A ;字形码放53H
RET
TAB: DB 0C0H,0CFH,0A4H,086H,08BH ;0--4
DB 092H,098H,0C7H,080H,082H ;5--9
;-----------------------------------------------
; 显示子程序
;-----------------------------------------------
SHOW: MOV R1,#2
SHOW1: MOV P0,50H
SETB P2.0
ACALL DELAY ;延时1ms
CLR P2.0
MOV P0,51H
SETB P2.1
ACALL DELAY
CLR P2.1
MOV P0,52H
SETB P2.2
ACALL DELAY
CLR P2.2
MOV P0,53H
SETB P2.3
ACALL DELAY
CLR P2.3
DJNZ R1,SHOW1
RET
;-----------------------------------------------
; 延时1ms子程序
;-----------------------------------------------
DELAY: MOV R7,#02H ;延时1ms
DELAY1: MOV R6,#0FFH
DELAY2: DJNZ R6,DELAY2
DJNZ R7,DELAY1
RET
;---------------------------------------------------------------------------
; 这是 DS18B20 复位初始化子程序
INIT_1820:
SETB WDDATA
NOP
CLR WDDATA
;主机发出延时 537 微秒的复位低脉冲
MOV R1,#3
TSR1: MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
SETB WDDATA;然后拉高数据线
NOP
NOP
NOP
MOV R0,#25H
TSR2:
JNB WDDATA,TSR3;等待 DS18B20 回应
DJNZ R0,TSR2
LJMP TSR4 ; 延时
TSR3:
SETB FLAG1 ; 置标志位,表示 DS1820 存在
LJMP TSR5
TSR4:
CLR FLAG1 ; 清标志位,表示 DS1820 不存在
LJMP TSR7
TSR5:
MOV R0,#117
TSR6:
DJNZ R0,TSR6 ; 时序要求延时一段时间
TSR7:
SETB WDDATA
RET
GET_TEMPER:
SETB WDDATA
LCALL INIT_1820;先复位 DS18B20
JB FLAG1,TSS2
RET ; 判断 DS1820 是否存在?若 DS18B20 不存在则返回
TSS2:
MOV A,#0CCH ; 跳过 ROM 匹配
LCALL WRITE_1820
MOV A,#44H ; 发出温度转换命令
LCALL WRITE_1820
LCALL DISPLAY
LCALL INIT_1820;准备读温度前先复位
MOV A,#0CCH ; 跳过 ROM 匹配
LCALL WRITE_1820
MOV A,#0BEH ; 发出读温度命令
LCALL WRITE_1820
LCALL READ_18200; 将读出的温度数据保存到 35H/36H
RET
WRITE_1820:
MOV R2,#8;一共 8 位数据
CLR C
WR1:
CLR WDDATA
MOV R3,#6
DJNZ R3,$
RRC A
MOV WDDATA,C
MOV R3,#23
DJNZ R3,$
SETB WDDATA
NOP
DJNZ R2,WR1
SETB WDDATA
RET
READ_18200:
MOV R4,#2 ; 将温度高位和低位从 DS18B20 中读出
MOV R1,#29H ; 低位存入 29H(TEMPER_L),高位存入 28H(TEMPER_H)
RE00:
MOV R2,#8;数据一共有 8 位
RE01:
CLR C
SETB WDDATA
NOP
NOP
CLR WDDATA
NOP
NOP
NOP
SETB WDDATA
MOV R3,#9
RE10:
DJNZ R3,RE10
MOV C,WDDATA
MOV R3,#23
RE20:
DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;---------------------------------------------------------------------------
;显示部分
DISPLAY: MOV DOT,#0
MOV A,29H;将 29H 中的十六进制数转换成 10 进制
MOV B,#100 ;10 进制/100=10 进制
DIV AB
MOV C_BIT,A ;百位在 A
MOV A,B
MOV B,#10
DIV AB
MOV B_BIT,A ;十位在A
MOV A_BIT,B ;个位在B
LCALL NUM_CODE
LCALL SHOW
JB P2.4,KKK ;判断有无按键1
LJMP LOOPA
KKK: JB P2.7,FFF ;判断有无按键4
LJMP LOOPB
FFF: RET
;-----------------------------------------------
;串口发送
CHUANKOU: CLR TI
MOV A,29H
MOV SBUF,A
JNB TI,$ ;发送给PC
RET
;------------------------------------------------------------
WAIT: MOV R3,#0FFH
WAIT1: JNB RI,MAG
CLR RI
MOV A,SBUF
RET
MAG: DJNZ R3,WAIT1
RET
;串口接收
RECIEVE: MOV R2,#0FFH
RECIEVE1: JNB RI,FLAG
CLR RI
MOV A,SBUF ;接收
MOV DIS_1,A
CJNE A,#00H,GO1
CLR P1.4
SJMP RECIEVE
GO1: MOV A,DIS_1
CJNE A,#01H,GO2
SETB P1.4
RET
GO2: MOV A,DIS_1
SETB P1.5
LCALL DY12MS1
CLR P1.5
MOV HLIM,A
ADD A,#2
MOV HBJWD,A
RET
TEMP: SJMP RECIEVE
FLAG: DJNZ R2,RECIEVE1
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -