📄 充气电缆气压自动监测系统.asm
字号:
;定义内存
;显示缓冲区
DMODE DATA 30H
DPYE DATA 31H
DPYA DATA 32H
DPYB DATA 33H
DPYC DATA 34H
DPYD DATA 35H
;
DDMODE DATA 3FH
SMODE DATA 36H
MODET DATA 37H
TIMER DATA 38H
KYE DATA 39H
;AD转换结果暂存区
ADBUFA DATA 3AH
ADBUFB DATA 3BH
;修改上下限值时暂存修改前的值
SETBUFA DATA 3CH
SETBUFB DATA 3DH
;安全次数
SAFCNT DATA 3EH
;时钟存放
HOUR DATA 52H
MINUTE DATA 53H
;控制位 闪烁控制个位
FLASH DATA 20H
FLASH_D BIT 00H
FLASH_C BIT 01H
FLASH_B BIT 02H
FLASH_A BIT 03H
FLASH_E BIT 04H
FLASH_M BIT 05H
;控制位,与AD转换和报警有关
OVER BIT 08H
ALARM BIT 09H
DONE BIT 0AH
;键盘特征位
KYETZ DATA 22H
KON BIT 10H
KSETEN BIT 11H
KSET BIT 12H
;循环标志位
EBIT BIT 13H
;允许修改标志位
OK BIT 17H
;定义引脚
;键盘显示接口芯片7279各引脚
CS BIT P1.2
CLK BIT P1.1
DAT BIT P1.0
;指示灯、蜂鸣器
LED1 BIT P2.4
LED1 BIT P2.5
BELL BIT P2.6
;电磁阀运行
OUT1 BIT P2.7
OUT2 BIT P2.8
;AD转换器件 TLC2543个引脚
AD_CLK BIT P1.3
AD_CS BIT P1.6
DIN BIT P1.4
DOUT BIT P1.5
; DS1302各引脚
T_RST BIT P2.2
T_PIO BIT P2.1
T_SCLK BIT P2.0
;定义键值
KYE_MODE EQU 0FH
KYE_SET EQU 0EH
KYE_E EQU 0AH
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP KYEINT
ORG 000BH
AJMP TIMEINT
ORG 0030H
/***************************************************
主程序完成初始化
***************************************************/
MAIN:
MOV SP,#5FH
MOV TMOD,#00100001B ;定时器0方式一,定时器1方式二
MOV TH1,#0E6H
MOV TL1,#0E6H
MOV TH0,#03CH ;12MHz,定时50ms
MOV TL0,#0B0H
MOV SCON,#050H ;定义串行通信,REN=1。8位方式
MOV PCON,#00H
CLR EA ;关中断
CLR A
MOV R0,#20H
MOV R2,#20H
MCLR:
MOV @R0,A ;部分内存清零
INC R0
DJNZ R2,MCLR
MOV 31H,#0AH ;方式0译码,对应符号 "-"。
MOV MODET,#64H
CLR OK
MOV 42H,#20H ;初始化各路上下限值
MOV 43H,#00H
MOV 44H,#08H
MOV 45H,#00H
MOV 48H,#20H
MOV 49H,#00H
MOV 4AH,#08H
MOV 4BH,#00H
MOV 4EH,#20H
MOV 4FH,#00H
MOV 50H,#08H
MOV 51H,#00H
SETB EA ;开中断
CLR ET1
SETB EX0
SETB IT0
SETB ET0
SETB TR0
SETB TR1
AJMP $ ;等待中断
RET
/******************************************************************
定时器中断子程序,完成主要功能有,AD转换,尺度变换,显示等
******************************************************************/
TIMEINT:
ORL TL0,#0B0H ;重装定时值
MOV TH0,#3CH
DEC MODET ;5s定时单元减1
MOV R7,#00H ;初始化通道值
LOOP:
ACALL RD_AD ;读两次,第一次写入地址,第二次才是本次转换值
ACALL RD_AD
ACALL RULE
ACALL H2BCD
ACALL WRAD
ACALL COMP
JNB OVER,NEXT1
MOV MODET,#64H
JB ALARM,NEXT2 ;避免几路同时报警,仅对最先越位出进行报警。
SETB ALARM ;ALARM=1
CLR KON
CLR KSETEN
JNB KSET,NEXT2
CLR KSET
ACALL RESAVE ;修改DMODE之前保护修改前的上下限,
MOV DMODE,R7 ;以防止报警时正在修改上下限值
AJMP NEXT2 ;越界时安全次数不增加
NEXT1:
INC SAFCNT
NEXT2:
MOV A,R7 ;修改测量地点
ADD A,#3
MOV R7,A
CLR C
SUBB A,#08H ;用减法判断是为了避免死循环
JC LOOP ;为9时向下执行,否则循环。
MOV R7,#00H ;三次循环结束,从0路重新开始循环
MOV A,SAFCNT ;安全运行次数
JNZ NEXT3 ;不为零不撤销报警标志
CLR ALARM ;安全运行次数够,清报警标志和
CLR DONE ;已报警也要清零
NEXT3:
MOV SAFCNT,#0FDH ;重新开始都要对次数初始化,不管是不是报警
JNB ALARM,NEXT5 ;没有产生报警
JB DONE,NEXT5 ;ALARM=1,DONE=1表示已经报警,TO NEXT5
SETB BELL
MOV FLASH,#00111111B
ACALL RS232
CLR KON ;冗余
CLR KSETEN
CLR KSET
SETB DONE
NEXT5:
JNB KON,NEXT6 ;KON=0没有键按下
MOV A,MODET ;KON=1有键按下
JNZ NEXT9 ;时间不到不处理,显示键盘操作
CLR KON ;5s时间到,退出键盘操作,
CLR KSETEN ;清标志位,保存未修改成功的值
JNB KSET,NEXT9
CLR KSET
ACALL RESAVE ; 保护修改前的上下限
AJMP NEXT9 ;不是0.3.6.以及循环(键盘操作,)
NEXT6:
JB EBIT,NEXT7 ;循环显示否
MOV FLASH,#00000000B
AJMP NEXT8 ;不循环跳转
NEXT7:
MOV FLASH,#00010000B
MOV A,MODET
JNZ NEXT8 ;MODET不为0时不改变显示路号
MOV A,SMODE
ADD A,#3
MOV SMODE,A
CLR C
SUBB A,#09H
JC NEXT8 ;0~8 GOTO NEXT8;A=8也有借位
MOV SMODE,#0 ;SMODE>=9 初始化
NEXT8:
MOV DMODE,SMODE ;036E模式,DMODE要有SMODE决定
NEXT9:
MOV A,MODET
JNZ NEXT10
MOV MODET,#64H
NEXT10:
ACALL NEWBUF ;缓冲区刷新
ACALL DYP ;显示刷新
ACALL SHINE ;闪烁刷新
ACALL RDTIME ;读时间
MOV A,MINUTE ;正点与上位机通信,传输各路气压值
JNZ NEXT11
ACALL RS232
NEXT11:
SETB OUT1 ;读口操作先写1
SETB OUT2
MOV C,OUT1
MOV LED1,C
MOV C,OUT2
MOV LED2,C
RETI
/*****************************************
键盘中断子程序
****************************************/
KYEINT:
MOV A,#15H ;读键盘值指令
ACALL SENDHD
ACALL READHD
MOV A,KYE ;键值存于A
JB KON,KYEL1 ;键盘操作状态进入KYEL1
CJNE A,#KYE_MODE,OUT1 ;第一次按键不是MODE,则加长竿退出
SETB KON ;第一次进入
CLR KSETEN ;冗余
CLR KSET ;冗余
MOV MODET,#64H ;5s
MOV FLASH,#00100000B
AJMP OUT1 ;第一次操作(MODE)完成相应动作后加长竿退出
KYEL1:
JB KSET,KYEL8_1 ;键盘操作中,如果KSET=1,进行修改上下限操作
;加长竿到KYEL8
MOV A,KYE
JZ KYEL2 ;0
MOV A,KYE
CLR C
SUBB A,#3
JZ KYEL2 ;3
MOV A,KYE
CJNE A,#06,KYEL3 ;!=6
KYEL2:
CLR KON ;0/3/6
CLR KSETEN
MOV MODET,#64H
MOV FLASH,#00000000B ;不闪烁
MOV DMODE,KYE ;存MODE
MOV SMODE,KYE
CLR EBIT ;清循环显示
AJMP OUT1 ;0/3/6动作后退出,同时退出键盘操作状态
KYEL3:
MOV A,KYE
CJNE A,#KYE_E,KYEL4 ;E,循环显示
CLR KON ;退出键盘操作
CLR KSETEN ;不允许修改上下限
MOV MODET,#64H
MOV FLASH,#00010000B ;"-"闪烁
MOV DMODE,#00H ;从0路开始循环
MOV SMODE,#00H
SETB EBIT ;置循环显示位
AJMP OUT ;动作后退出
KYEL4:
MOV A,KYE ;时间现实。MODE9
CJNE A,#09H,KYEL5
CLR KSETEN ;不允许修改上下限,也不退出键盘操作
MOV MODET,#64H
MOV DMODE,#09H
MOV FLASH,#00000011B ;后两位,分闪烁
OUT1:
AJMP OUT ;跳出,加长竿跳出
KYEL8_1:
AJMP KYEL8 ;加长竿
KYEL5:
MOV A,KYE
CLR C
SUBB A,#01H
JZ KYEL6 ;1
MOV A,KYE
CLR C
SUBB A,#02H
JZ KYEL6 ;2
MOV A,KYE
CLR C
SUBB A,#04H
JZ KYEL6 ;4
MOV A,KYE
CLR C
SUBB A,#05H
JZ KYEL6 ;5
MOV A,KYE
CLR C
SUBB A,#07H
JZ KYEL6 ;7
MOV A,KYE
CJNE A,#08H,KYEL7 ;不0/3/6/E/1/2/4/5/7/8跳到KYEL7
;8
KYEL6:
SETB KSETEN ;1/2/4/5/7/8.允许修改上下限
MOV MODET,#64H
MOV DMODE,KYE ;显示修改的位置
MOV DDMODE,KYE ;保存现在所修改的位置,便于异常情况时的恢复
MOV FLASH,#00100000B ;MODE值闪烁
AJMP OUT ;退出
KYEL7:
JNB KSETEN,OUT ;不是0/3/6/E/1/2/4/5/7/8,
;不在允许修改MODE下退出
MOV A,KYE
CJNE A,#KYE_SET,OUT ;允许修改MODE,不是SET键退出
SETB KSET ;时SET
MOV MODET,#64H
MOV FLASH,#00001000B ;百位闪烁
ACALL SAVE ;保护修改前的值
AJMP OUT ;退出
KYEL8:
MOV A,#09H ;SET=1,修改各路限值
CLR C
SUBB A,KYE ;判断KYE在不在0~9之间
JC KYEL12 ;不再继续判断其他的……
MOV MODET,#64H
ACALL REGULATE ;调调整函数
AJMP OUT
KYEL12:
MOV A,KYE
CJNE A,#KYE_SET,OUT ;再按SET表示修改完成
ACALL CHECK
JNB OK,KYEL13 ;合理否.不合理
CLR KSET ;合理
CLR KSETEN
CLR KON
MOV MODET,#64H
MOV FLASH,#00000000B
MOV DMODE,SMODE
JNB EBIT,OUT
SETB FLASH_E
AJMP OUT
KYEL13:
ACALL RESAVE ;写回上次值
CLR KSET
CLR KSETEN
CLR KON
MOV MODET,#64H
MOV FLASH,#00000000B
JNB EBIT,OUT
SETB FLASH_E
AJMP OUT
OUT:
RETI
/***************************************************************
将二进制转换为BCD码,12位.
高8位位于ADBUFA,低四位位于ADBUFB的高四字节
**************************************************************/
H2BCD:
CLR A ;A,R3,R4,R2,
MOV R3,A
MOV R4,A
MOV R2,#0CH ;12bit
H2BCD1:
MOV A,ADBUFB
RLC A
MOV ADBUFB,A
MOV A,ADBUFA
RLC A
MOV ADBUFA,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
DA A
MOV R3,A
DJNZ R2,H2BCD1
MOV ADBUFA,R3
MOV ADBUFB,R4
RET
/*******************************************
写AD转换值到相应区域
*****************************************/
WRAD:
MOV A,R7
RL A
ADD A,#40H
MOV R0,A
MOV @R0,ADBUFA
INC R0
MOV @R0,ADBUFB
RET
/*********************************************
比较是否越界,越位置越位标志OVER为1
********************************************/
COMP:
MOV A,R7 ;A,R7,R0,C
RL A
ADD A,#40H
MOV R0,A
INC R0
INC R0 ;UP
MOV A,ADBUFA
CLR C
DEC A ;不借位,有利于判断是否>UP
SUBB A,@R0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -