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

📄 泵控制.asm

📁 小型循环热水泵定时自动控制程序
💻 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 + -