?? 充氣電纜氣壓自動監測系統.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 + -