?? 泵控制.asm
字號:
;************************************口線定義
KEY_1 BIT P1.2
LED_1 BIT P1.1
OUT_1 BIT P1.7
KEY_2 BIT P1.0
LED_2 BIT P3.7
OUT_2 BIT P1.5
KEY_3 BIT P3.5
LED_3 BIT P3.4
OUT_3 BIT P1.3
STB_LED BIT P3.3
MODE_SW1 BIT P1.4
MODE_SW2 BIT P1.6
;********************************************內存分配
OUT1_INT1 EQU 20H
OUT1_INT2 EQU 21H
KEY_MODE EQU 22H
INT_800mS EQU 23H
INT_1S EQU 24H
INT_900mS EQU 25H
INT_ONOFF EQU 26H ;中斷開關標記
OUT2_INT1 EQU 27H
OUT2_INT2 EQU 28H
OUT3_INT1 EQU 29H
OUT3_INT2 EQU 2AH
OUT3_INT3 EQU 2BH
LED_NOTE EQU 2CH ;記錄LED狀態
;********************************************程序開始
ORG 0000H;
JMP START
ORG 0003H
ORG 000BH
JMP TIMER0
ORG 0013H
ORG 001BH
ORG 0023H
;********************************************初始化程序
ORG 0040H
START: CLR EA ;禁止所有中斷
MOV SP,#60H ;設置堆栽
SETB ET0 ;允許定時中斷0
MOV TMOD,#00010001B ;設置定時工作方式為16位計時
MOV IP,#00001000B ;設置定時中斷1為最高級
MOV TH0,#15H ;設置定時中斷0為每60ms中斷一次
MOV TL0,#0A0H ;
CALL OFF_REST
MOV P1,#01010101B ;設P1口的默認值
MOV P3,#01100010B ;設P3口的默認值
MOV KEY_MODE,#00H
MOV 2DH,#00H
CLR 67H
;********************************************主(掃鍵)程序
KEY_A1:
CALL INQUIRE
JB KEY_1,KEY_A1 ;讀KEY_1等不等于1,若等于跳到KEY_A2
CALL T50MS ;延時20MS
JB KEY_1,KEY_A1 ;繼續讀KEY_1等不等于1,若等于跳到KEY_A2
CALL OUT1_MODE
JB 65H,WAIT1
MOV INT_900mS,#00H
SETB 65H
WAIT1: JB KEY_1,KEY_A1 ;讀KEY_1等不等于1,若等于跳到WAIT1等待
MOV A,INT_900mS
CJNE A,0FH,KEY_A1
CLR 65H
JB KEY_1,KEY_A1
JMP KEY_A1
;KEY_A2: CALL INQUIRE
; JB KEY_2,KEY_A3 ;讀KEY_2等不等于1,若等于跳到KEY_A3
; CALL T50MS ;延時20MS
; JB KEY_2,KEY_A3 ;繼續讀KEY_2等不等于1,若等于跳到KEY_A3
; CALL OUT2_HIGH
;WAIT2: JNB KEY_2,WAIT2 ;讀KEY_2等不等于0,若等于跳到WAIT2等待
;KEY_A3: CALL INQUIRE
; JB KEY_3,KEY_A1 ;讀KEY_3等不等于1,若等于跳到KEY_A4
; CALL T50MS ;延時20MS
; JB KEY_3,KEY_A1 ;繼續讀KEY_3等不等于1,若等于跳到KEY_A4
; CALL OUT3_HIGH
;WAIT3: JNB KEY_3,WAIT3 ;讀KEY_4等不等于0,若等于跳到WAIT3等待
; JMP KEY_A1 ;繼續掃鍵
;
INQUIRE: CALL INT_1
CALL INT1_ONOFF
CALL LED_MODE
RET
;***************************************************************控制程序
OUT1_MODE: INC KEY_MODE
JB OUT_1,OUT1_A
SETB OUT_1
SETB 34H
MOV OUT1_INT1,#0
MOV OUT1_INT2,#0
OUT1_A: MOV A,KEY_MODE
CJNE A,#01H,OUT1_B
RET
OUT1_B: MOV A,KEY_MODE
CJNE A,#02H,OUT1_C
RET
OUT1_C: MOV A,KEY_MODE
CJNE A,#03H,OUT1_D
RET
OUT1_D: MOV A,KEY_MODE
CJNE A,#04H,OUT1_OFF
RET
OUT1_OFF: CALL OFF_1
CLR OUT_1
CLR LED_1
CLR 34H
;OUT2_HIGH: JB OUT_2,OUT2_LOW
; SETB OUT_2
; SETB LED_2
; SETB 33H
; MOV OUT2_INT1,#0
; MOV OUT2_INT2,#0
; RET
; CALL END_2
;OUT2_LOW: CLR OUT_2
; CLR LED_2
; CLR 33H
; CALL OFF_2
;END_2: RET
;OUT3_HIGH: JB OUT_3,OUT3_LOW
; SETB OUT_3
; SETB LED_3
; SETB 32H
; MOV OUT3_INT1,#0
; MOV OUT3_INT2,#0
; RET
; CALL END_3
;OUT3_LOW: CLR OUT_3
; CLR LED_3
; CLR 32H
; CALL OFF_3
;END_3: RET
;***********************************************開/關定時中斷
INT1_ONOFF: MOV A,INT_ONOFF
CJNE A,#0,ON_INT
CALL OFF_REST
RET
ON_INT: SETB EA ;允許所有中斷
SETB TR0 ;定時中斷0開始計時
SETB STB_LED
RET
OFF_INT: CLR EA ;關閉所有中斷
CLR TR0
CLR STB_LED
RET
OFF_REST: CALL OFF_INT
MOV TH0,#15H ;設置定時中斷0為每60ms中斷一次
MOV TL0,#0A0H ;
MOV OUT1_INT1,#0 ;
MOV OUT1_INT2,#0 ;
MOV OUT2_INT1,#0 ;
MOV OUT2_INT2,#0 ;
MOV OUT3_INT1,#0 ;
MOV OUT3_INT2,#0 ;
MOV OUT3_INT3,#0
CLR 61H
CLR 62H
CLR 63H
CLR 64H
CLR 67H
MOV KEY_MODE,#00H
;MOV OFF,#0 ;
;MOV LED_HIGH,#0
;MOV LED_LOW,#0
;MOV LED_ON,#0
MOV INT_ONOFF,#0
INT_END1: RET
;***********************************************定時中斷中斷程序
TIMER0: PUSH PSW ;保護寄存器
PUSH ACC
MOV TH0,#15H ;從新送數開始計時
MOV TL0,#0A0H ;
INC OUT1_INT1 ;將MULTIPLE1加一
INC OUT2_INT1
INC OUT3_INT1
INC INT_800mS
INC INT_1S
INC INT_900mS
POP ACC ;恢復被保存的寄存器
POP PSW
RETI ;返回計時器
;***********************************************中斷查詢子程序(通道1)
INT_1: JNB OUT_1,INT_END
MOV A,OUT1_INT1 ;將MULTIPLE1的數送到A
CJNE A,#0F0H,INT_END ;將A的數跟240(F0)比較,若不等,則跳到INT_END(14.4秒)
MOV OUT1_INT1,#0 ;恢復MULTIPLE1的初始值
INC OUT1_INT2 ;將MULTIPLE2加一
MOV A,KEY_MODE ;將SW_MODE移到A
CJNE A,#01H,T05_INT1 ;將A的數跟00(5分)比較,若不等,則跳到T15S_INT1
MOV A,OUT1_INT2 ;將MULTIPLE2的數送到A
CJNE A,#0CH,T05_INT1 ;將A的數跟12(C,3分)比較,若不等,則跳到T15S_INT1
CALL OFF_1 ;等于就跳到OFF_1
T05_INT1: MOV A,KEY_MODE ;將SW_MODE移到A
CJNE A,#02H,T08_INT1 ;將A的數跟02(15分)比較,若不等,則跳到T30S_INT1
MOV A,OUT1_INT2 ;將MULTIPLE2的數送到A
CJNE A,#15H,T08_INT1 ;將A的數跟21(15,5分)比較,若不等,則跳到T30S_INT1
CALL OFF_1 ;等于就跳到OFF_1
T08_INT1: MOV A,KEY_MODE ;將SW_MODE移到A
CJNE A,#03H,T10_INT1 ;將A的數跟03(8分)比較,若不等,則跳到T60S_INT1
MOV A,OUT1_INT2 ;將MULTIPLE2的數送到A
CJNE A,#21H,T10_INT1 ;將A的數跟33(21,8分)比較,若不等,則跳到T60S_INT1
CALL OFF_1 ;等于就跳到OFF_1
T10_INT1: MOV A,OUT1_INT2 ;將MULTIPLE2的數送到A
CJNE A,#29H,INT_END ;將A的數跟41(29,10分)比較,若不等,則跳到INT_2
CALL OFF_1 ;等于就跳到OFF_1
INT_END: RET
;***********************************************中斷查詢子程序(通道2)
;INT_2: JNB OUT_2,INT_3
; MOV A,OUT2_INT1 ;將MULTIPLE1的數送到A
; CJNE A,#0F0H,INT_3 ;將A的數跟240比較,若不等,則跳到INT_END(14.4秒)
; MOV OUT2_INT1,#0 ;恢復MULTIPLE1的初始值
; INC OUT2_INT2 ;將MULTIPLE2加一
; MOV A,OUT2_INT2 ;將MULTIPLE2的數送到A
; CJNE A,#15H,T15S_INT2 ;將A的數跟21(15,5分)比較,若不等,則跳到T15S_INT1
;
; MOV A,SW_MODE ;將SW_MODE移到A
; CJNE A,#00H,T15S_INT2 ;將A的數跟00(5分)比較,若不等,則跳到T15S_INT1
; CALL OFF_2 ;等于就跳到OFF_1
;
;T15S_INT2: MOV A,OUT2_INT2 ;將MULTIPLE2的數送到A
; CJNE A,#3FH,T30S_INT2 ;將A的數跟63(3F,15分)比較,若不等,則跳到T30S_INT1
;
; MOV A,SW_MODE ;將SW_MODE移到A
; CJNE A,#01H,T30S_INT2 ;將A的數跟01(15分)比較,若不等,則跳到T30S_INT1
; CALL OFF_2 ;等于就跳到OFF_1
;
;T30S_INT2: MOV A,OUT2_INT2 ;將MULTIPLE2的數送到A
; CJNE A,#7DH,T60S_INT2 ;將A的數跟125(7D,30分)比較,若不等,則跳到T60S_INT1
;
; MOV A,SW_MODE ;將SW_MODE移到A
; CJNE A,#10B,T60S_INT2 ;將A的數跟01(30分)比較,若不等,則跳到T60S_INT1
; CALL OFF_2 ;等于就跳到OFF_1
;
;T60S_INT2: MOV A,OUT2_INT2 ;將MULTIPLE2的數送到A
; CJNE A,#0FAH,INT_3 ;將A的數跟250(FA,60分)比較,若不等,則跳到INT_3
;
; CALL OFF_2 ;等于就跳到OFF_1
; RET
;
;***********************************************中斷查詢子程序(通道3)
;INT_3: JNB OUT_3,INT3_END
; MOV A,OUT3_INT1 ;將MULTIPLE1的數送到A
; CJNE A,#0F0H,INT3_END ;將A的數跟240比較,若不等,則跳到INT_END(14.4秒)
; MOV OUT3_INT1,#0 ;恢復MULTIPLE1的初始值
; INC OUT3_INT2 ;將MULTIPLE2加一
;
; MOV A,OUT3_INT2 ;將MULTIPLE2的數送到A
; CJNE A,#15H,T15S_INT3 ;將A的數跟21(15,5分)比較,若不等,則跳到T15S_INT1
;
; MOV A,SW_MODE ;將SW_MODE移到A
; CJNE A,#00H,T15S_INT3 ;將A的數跟00(5分)比較,若不等,則跳到T15S_INT1
; CALL OFF_3 ;等于就跳到OFF_1
;
;T15S_INT3: MOV A,OUT3_INT2 ;將MULTIPLE2的數送到A
; CJNE A,#3FH,T30S_INT3 ;將A的數跟63(3F,15分)比較,若不等,則跳到T30S_INT1
;
; MOV A,SW_MODE ;將SW_MODE移到A
; CJNE A,#01H,T30S_INT3 ;將A的數跟01(15分)比較,若不等,則跳到T30S_INT1
; CALL OFF_3 ;等于就跳到OFF_1
;
;T30S_INT3: MOV A,OUT3_INT2 ;將MULTIPLE2的數送到A
; CJNE A,#7DH,T60S_INT3 ;將A的數跟125(7D,30分)比較,若不等,則跳到T60S_INT1
;
; MOV A,SW_MODE ;將SW_MODE移到A
; CJNE A,#10B,T60S_INT3 ;將A的數跟01(30分)比較,若不等,則跳到T60S_INT1
; CALL OFF_3 ;等于就跳到OFF_1
;
;T60S_INT3: MOV A,OUT3_INT2 ;將MULTIPLE2的數送到A
; CJNE A,#0FAH,INT3_END ;將A的數跟250(FA,60分)比較,若不等,則跳到INT_3
;
; CALL OFF_3 ;等于就跳到OFF_1
;
;INT3_END: RET
;***************************************************LED控制
LED_MODE: JNB OUT_1,LED_MODE_END
LED1_MODE_A:
MOV A,KEY_MODE
CJNE A,#10H,LED1_MODE_B
JNB 61H,LED1_MODE_1S
JNB 60H,LED1_MODE_800mS
JNB 61H,LED1_MODE_1S
CALL LED_MODE_RESET
RET
LED1_MODE_B: MOV A,KEY_MODE
CJNE A,#01H,LED1_MODE_C
JNB 35H,LED1_MODE_1S
CLR 35H
JNB 62H,LED1_MODE_1
JNB 60H,LED1_MODE_800mS
SETB 35H
JNB 61H,LED1_MODE_1S
CALL LED_MODE_RESET
RET
LED1_MODE_C: MOV A,KEY_MODE
CJNE A,#03H,LED1_MODE_D
JNB 62H,LED1_MODE_1
JNB 63H,LED1_MODE_2
JNB 60H,LED1_MODE_800mS
JNB 61H,LED1_MODE_1S
CALL LED_MODE_RESET
RET
LED1_MODE_D: MOV A,KEY_MODE
CJNE A,#04H,LED_MODE_END
JNB 62H,LED1_MODE_1
JNB 63H,LED1_MODE_2
JNB 64H,LED1_MODE_3
JNB 60H,LED1_MODE_800mS
JNB 61H,LED1_MODE_1S
CALL LED_MODE_RESET
RET
LED1_MODE_1S: JMP LED1_MODE_1S1
LED_MODE_RESET: CLR 60H
CLR 61H
CLR 62H
CLR 63H
CLR 64H
LED_MODE_END: RET
LED1_MODE_1: JNB 60H,LED1_MODE_800mS
SETB 62H
RET
LED1_MODE_2: JNB 60H,LED1_MODE_800mS
SETB 63H
RET
LED1_MODE_3: JNB 60H,LED1_MODE_800mS
SETB 64H
RET
LED1_MODE_800mS: JNB LED_1,LED1_MODE_800mS2
JB 66H,LED1_MODE_800mS1
MOV INT_800mS,#00H
SETB 66H
LED1_MODE_800mS1: MOV A,INT_800mS
CJNE A,#0DH,LED_MODE_END
CLR 61H
CLR 66H
CLR LED_1
RET
LED1_MODE_800mS2: JB 68H,LED1_MODE_800mS3
MOV INT_800mS,#00H
SETB 68H
LED1_MODE_800mS3: MOV A,INT_800mS
CJNE A,#0DH,LED_MODE_END
SETB LED_1
CLR 68H
SETB 60H
RET
LED1_MODE_1S1: JB 67H,LED1_MODE_1S2
MOV INT_1S,#00H
SETB 67H
LED1_MODE_1S2: MOV A,INT_1S
CJNE A,#11H,LED_MODE_END
SETB 61H
CLR 67H
RET
;***************************************************自動關機1.2.3
OFF_1: CLR OUT_1
CLR LED_1
CLR 34H
RET
;OFF_2: CLR OUT_2
; CLR LED_2
; CLR 33H
; RET
;OFF_3: CLR OUT_3
; CLR LED_3
; CLR 32H
; RET
;***********************************************延時子程序
T50MS: MOV R6,#41H
T50MS1: MOV R7,#0
T50MS2: NOP
DJNZ R7,T50MS2
DJNZ R6,T50MS1
RET
END
;***********************************************備注
; 61h 60h
;5s 0 0
;15s 0 1
;30s 1 0
;60s 1 1
;1.熱水器控制器時間基準:00/3分 01/5分 10/8分 11/10分
;2.控制按鍵:A.單擊運行一個預設時間單位,LED單閃;再單擊,再運行一個預設時間單位;運行中雙擊(1S內)運行10個時間單位
; LED雙閃;C:運行中三擊,運行20個時間單位,LED三閃;D:運行中四擊,運行40個時間單位,LED四閃,E:運行中按鍵持續1S,停機
; 進入待機狀態.
;3.在控制器上增加一個控制按鍵
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -