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

📄 充气电缆气压自动监测系统.asm

📁 本程序是一种先进的充气电缆气压自动监测系统的程序。其特点是可以对电缆线路上各点的气压值进行24小时实时监控。使管理人员可以实时掌握电缆内的气压情况
💻 ASM
📖 第 1 页 / 共 2 页
字号:



;定义内存
;显示缓冲区
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 + -