⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 机房火险预警实验板程序.asm

📁 这是个实验室火警报警系统
💻 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 + -