📄 机房火险预警实验板程序.asm
字号:
CONFIG12 EQU 7FH ;定义温度转换用12位有效数据表示
TEMPH EQU 40H ;温度数据高8位的存储地址
TEMPL EQU 41H ;温度数据低8位的存储地址
HYPIV1 EQU 42H
WENDUH1 EQU 50H ;温度上限高位
WENDUH2 EQU 51H ;温度上限低位
WENDUL1 EQU 52H ;温度下限高位
WENDUL2 EQU 53H ;温度下限低位
SHIDUH1 EQU 54H ;湿度上限高位
SHIDUH2 EQU 55H ;湿度上限低位
SHIDUL1 EQU 56H ;湿度下限高位
SHIDUL2 EQU 57H ;湿度下限低位
DAT EQU P0.4 ;定义DS18B20与单片机的连接口线
OE EQU P3.7 ;单片机与ADC0809的接口线
ST EQU P3.6 ;单片机与ADC0809的接口线
ORG 0000H
JMP START
ORG 0030H
START:
MOV 50H,#05H ;初始温度上限50度,温度下限10度,湿度上限70%,湿度下限40%
MOV 51H,#00H
MOV 52H,#01H
MOV 53H,#00H
MOV 54H,#07H
MOV 55H,#00H
MOV 56H,#04H
MOV 57H,#00H
LCALL INIT ;调用复位子程序对DS18B20进行复位操作
MOV R0,#00H
MAIN:
LCALL RDTEMP ;调用读子程序,从DS18B20中读取出温度值
LCALL YUNSUAN ;调用运算子程序,运算出可供数码管显示的温度值
LCALL HYPICAI ;调用湿度采集程序,采集出湿度所对应的电压
LCALL HCHULI ;调用处理子程序,处理出可供数码管显示的湿度值
LCALL DISPLAY ;调用显示子程序显示当前温度值
LCALL BIJIAO ;比较程序,将处理后的温、湿度数据与初始数据比较,判断是否报警
JNB P0.0,WENSET ;调用温度上限设定程序
JB P0.1,BUSHIDU ;调用湿度上限设定程序
LJMP SHISET
BUSHIDU:
LJMP MAIN
WENSET:
JNB P0.0,$ ;按键消抖
MOV 33H,#10001001B ;让第一个数码观显示“H”
MOV 32H,#00H ;个位
MOV 31H,#00H ;十位
WENH:
LCALL XIANSHI
JB P0.2,BU1H ;检测加1键是否被按下
LCALL DELAY10MS ;调用消抖延时
INC 31H ;个位自加1
MOV A,31H
CJNE A,#10,L1H ;当个位为10后,向十位进位,然后个位清零
INC 32H
MOV 31H,#00H
L1H:
MOV A,32H
CJNE A,#10,BU1H ;当十位也为10时则返回00
MOV 31H,#00H
MOV 32H,#00H
BU1H:
JB P0.3,BU2H ;检测减1键是否被按下
LCALL DELAY10MS
DEC 31H
MOV A,31H
CJNE A,#0FFH,BU2H ;当个位减到0,再减1次为255时,向十位借位,个位显示9
MOV 31H,#9
DEC 32H
MOV A,32H
CJNE A,#0FFH,BU2H ;当十位也减到255时,则显示99
MOV 32H,#9
BU2H:
JB P0.0,WENH ;检测温度设定功能键P0.0是否按下,没有则继续设定上限
JNB P0.0,$ ;如果被按下则开始设定下限
MOV 50H,32H
MOV 51H,31H
MOV 33H,#11000111B ;第一个数码观显示“L”
MOV 32H,#00H
MOV 31H,#00H
WENL: ;温度下限设定程序,雷同与上限设定
LCALL XIANSHI
JB P0.2,BU1L
LCALL DELAY10MS
INC 31H
MOV A,31H
CJNE A,#10,L1L
INC 32H
MOV 31H,#00H
L1L:
MOV A,32H
CJNE A,#10,BU1L
MOV 31H,#00H
MOV 32H,#00H
BU1L:
JB P0.3,BU2L
LCALL DELAY10MS
DEC 31H
MOV A,31H
CJNE A,#0FFH,BU2L
MOV 31H,#9
DEC 32H
MOV A,32H
CJNE A,#0FFH,BU2L
MOV 32H,#9
BU2L:
JB P0.0,WENL
JNB P0.0,$
MOV 52H,32H
MOV 53H,31H
LJMP MAIN
XIANSHI: ;设定显示程序
MOV P1,33H ;让第一个数码管显示H或L
MOV P3,#00000000B
CALL DLIMS
MOV A,32H
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P1,A
MOV P3,#00000001B
CALL DLIMS
MOV A,31H
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P1,A
CLR P1.7
MOV P3,#00000010B
CALL DLIMS
MOV P1,#0C0H
MOV P3,#00000011B
CALL DLIMS
MOV P1,#0FFH
MOV P3,#00000100B
CALL DLIMS
MOV P1,#0FFH
MOV P3,#00000101B
CALL DLIMS
MOV P1,#0FFH
RET
DELAY10MS:
MOV R5,#10
D1:
LCALL XIANSHI ;在延时消抖程序中加入显示程序,实现实时显示
DJNZ R5,D1
RET
SHISET: ;程序与温度设定程序雷同
JNB P0.1,$ ;检测湿度上限设定按键P0.1是否被按下
MOV 33H,#10001001B
MOV 32H,#00H
MOV 31H,#00H
SHIH:
LCALL XIANSHI0
JB P0.2,BU1H0
LCALL DELAY10MS0
INC 31H
MOV A,31H
CJNE A,#10,L1H0
INC 32H
MOV 31H,#00H
L1H0:
MOV A,32H
CJNE A,#10,BU1H0
MOV 31H,#00H
MOV 32H,#00H
BU1H0:
JB P0.3,BU2H0
LCALL DELAY10MS0
DEC 31H
MOV A,31H
CJNE A,#0FFH,BU2H0
MOV 31H,#9
DEC 32H
MOV A,32H
CJNE A,#0FFH,BU2H0
MOV 32H,#9
BU2H0:
JB P0.1,SHIH
JNB P0.1,$
MOV 54H,32H
MOV 55H,31H
MOV 33H,#11000111B
MOV 32H,#00H
MOV 31H,#00H
SHIL:
LCALL XIANSHI0
JB P0.2,BU1L0
LCALL DELAY10MS0
INC 31H
MOV A,31H
CJNE A,#10,L1L0
INC 32H
MOV 31H,#00H
L1L0:
MOV A,32H
CJNE A,#10,BU1L0
MOV 31H,#00H
MOV 32H,#00H
BU1L0:
JB P0.3,BU2L0
LCALL DELAY10MS0
DEC 31H
MOV A,31H
CJNE A,#0FFH,BU2L0
MOV 31H,#9
DEC 32H
MOV A,32H
CJNE A,#0FFH,BU2L0
MOV 32H,#9
BU2L0:
JB P0.1,SHIL
JNB P0.1,$
MOV 56H,32H
MOV 57H,31H
LJMP MAIN
XIANSHI0:
MOV P1,33H
MOV P3,#00000000B
CALL DLIMS
MOV P1,#0FFH
MOV P3,#00000001B
CALL DLIMS
MOV P1,#0FFH
MOV P3,#00000010B
CALL DLIMS
MOV P1,#0FFH
MOV P3,#00000011B
CALL DLIMS
MOV A,32H
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P1,A
MOV P3,#00000100B
CALL DLIMS
MOV A,31H
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P1,A
MOV P3,#00000101B
CALL DLIMS
MOV P1,#0FFH
RET
DELAY10MS0:
MOV R5,#10
D10:
LCALL XIANSHI0
DJNZ R5,D10
RET
INIT:
LCALL RESET ;将DS18B20进行复位操作
MOV A,#0CCH
LCALL WRITE
MOV A,#4EH
LCALL WRITE
MOV A,#CONFIG12 ;将7FH=01111111B写入DS18B20,实现12位精度的转换
LCALL WRITE
RET
YUNSUAN:
MOV A,41H
MOV B,#16
DIV AB
MOV 74H,A
MOV A,B
MOV B,#10
MUL AB
MOV B,#16
DIV AB
MOV 70H,A ;小数部分数据
MOV A,40H
MOV B,#16
MUL AB
ADD A,74H
MOV B,#100
DIV AB
MOV 73H,A ;百位温度数据
MOV A,B
MOV B,#10
DIV AB
MOV 72H,A ;十位温度数据
MOV 71H,B ;个位温度数据
RET
RDTEMP:
LCALL RESET
MOV A,#0CCH
LCALL WRITE
MOV A,#44H
LCALL WRITE
LCALL DLIMS
LCALL RESET
MOV A,#0CCH
LCALL WRITE
MOV A,#0BEH
LCALL WRITE
LCALL READ
MOV TEMPL,A
LCALL READ
MOV TEMPH,A
RET
RESET:
LA:
SETB DAT
MOV R2,#200
LB:
CLR DAT
DJNZ R2,LB
SETB DAT
MOV R2,#30
LC:
DJNZ R2,LC
CLR C
ORL C,DAT
JC LB
MOV R6,#80
LD:
ORL C,DAT
JC LP
DJNZ R6,LD
SJMP LA
DJNZ R6,LD
LP:
MOV R2,#250
LF:
DJNZ R2,LF
RET
WRITE:
MOV R3,#8
WR1A:
SETB DAT
MOV R4,#8
RRC A
CLR DAT
WR2A:
DJNZ R4,WR2A
MOV DAT,C
MOV R4,#30
WR3A:
DJNZ R4,WR3A
DJNZ R3,WR1A
SETB DAT
RET
READ:
CLR EA
MOV R6,#8
RD1A:
CLR DAT
MOV R4,#6
NOP
SETB DAT
RD2A:
DJNZ R4,RD2A
MOV C,DAT
RRC A
MOV R5,#30
RD3A:
DJNZ R5,RD3A
DJNZ R6,RD1A
SETB DAT
RET
HYPICAI:
CLR OE
ADC1:
SETB ST
CLR ST ;启动0809开始A/D转换
SETB P3.4
JNB P3.4,$ ;判断是否转换完成
SETB OE ;转换完成允许输出转换得到的数据
MOV P2,#0FFH ;在读入数据前先写1
MOV A,P2 ;存数
MOV HYPIV1,A ;把转换得到的数据存入45H
CLR OE
LCALL DLIMS
CLR OE
RET
HCHULI:
MOV A,HYPIV1
CLR C
SUBB A,#37
MOV B,#10
MUL AB
MOV R4,B ;商存在R3中,余数存在R4中
MOV R5,A ;双字节的被除数
MOV R7,#15 ;单字节的除数
LCALL DIVD
MOV A,R3
MOV B,#10
DIV AB
MOV 75H,A ;供数码管显示的湿度值高位存于75H,低位存于74H
MOV 74H,B
INC 75H
RET
DIVD:
CLR C
MOV A,R4
SUBB A,R7
JC DVD
SETB OV ;商只能是单字节的,若R4大于R7则商肯定超过单字节则益出
LJMP ZUIHOU
DVD:
MOV R6,#8
DVD1:
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV F0,C
CLR C
SUBB A,R7
ANL C,/F0
JC DVD2
MOV R4,A
DVD2:
CPL C
MOV A,R3
RLC A
MOV R3,A
DJNZ R6,DVD1
CLR OV
ZUIHOU:
RET
BIJIAO:
SETB P0.7 ;开始比较时首先关闭报警
SETB P0.6
MOV A,72H
CLR C
SUBB A,52H ;比较温度下限值的十位
JZ ZAIBI1 ;如果十位相等则比个位
JC BAOJING ;如果72H数据小于下限值则直接报警
LJMP BUBAO1
ZAIBI1:
MOV A,71H
CLR C
SUBB A,53H
JC BAOJING ;如果71H数据小于下限值则报警
BUBAO1:
MOV A,50H ;比较温度上限值的十位
CLR C
SUBB A,72H
JZ ZAIBI2
JC BAOJING
LJMP BUBAO2
ZAIBI2:
MOV A,51H
CLR C
SUBB A,71H
JZ BAOJING ;如果71H数据与温度上限值相等则报警
JC BAOJING ;如果71H数据大于温度上限值相等则报警
BUBAO2:
MOV A,75H
CLR C
SUBB A,56H
JZ ZAIBI3
JC BAOJING
LJMP BUBAO3
ZAIBI3:
MOV A,74H
CLR C
SUBB A,57H
JC BAOJING
BUBAO3:
MOV A,54H
CLR C
SUBB A,75H
JZ ZAIBI4
JC BAOJING
LJMP BUBAO
ZAIBI4:
MOV A,55H
CLR C
SUBB A,74H
JZ BAOJING
JC BAOJING
BUBAO:
RET ;当前显示数据都没有超过温、湿度上下限则不报警
BAOJING:
CLR P3.5 ;温、湿度上下限中只要有一样超出则报警。点亮报警指示灯
CLR P0.6 ;开始语音播报报警
CLR P0.7 ;关闭继电器,切断电源
MOV R0,#250 ;报警时,显示报警瞬间的温度和湿度数据,并延时一段时间看
D3: ;显示数据是否恢复正常,如正常则恢复,若不正常则继续报警
LCALL DISPLAY
DJNZ R0,D3
RET
DISPLAY:
MOV A,40H
JNB ACC.7,ZHENG
MOV 73H,#11
ZHENG:
MOV A,73H
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P1,A
MOV P3,#00100000B
CALL DLIMS
MOV A,72H
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P1,A
MOV P3,#00100001B
CALL DLIMS
MOV A,71H
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P1,A
CLR P1.7
MOV P3,#00100010B
CALL DLIMS
MOV A,70H
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P1,A
MOV P3,#00100011B
CALL DLIMS
MOV A,75H
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P1,A
MOV P3,#00100100B
CALL DLIMS
MOV A,74H
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P1,A
MOV P3,#00100101B
CALL DLIMS
MOV P1,#0FFH
RET
DLIMS:
MOV R7,#200
D2:
MOV R6,#3
DJNZ R6,$
DJNZ R7,D2
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,00H,98H,0FFH,0BFH
;共阳段码表 “0” “1” “2” “3” “4” “5” “6” “7” “8” “9” “不亮” “—”
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -