📄 泵控制.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 + -