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

📄 xqb5030a.asm

📁 这是一个全自动洗衣机的控制器程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	MOV	A,ELECTRO_STEPS
	MOVW	A,#TIMETAB_ENHANCE_LOW		; 低水位: 水流 D
	JMP	TURN_WASHING
W_GENTLE					; "轻柔" 程序
	MOV	PROG_STEPS,#4			; 4 步一个周期
	MOVW	A,#0
	MOV	A,ELECTRO_STEPS
	MOVW	A,#TIMETAB_GENTLE
	JMP	TURN_WASHING
W_SPEEDY					; "快速" 程序
	MOV	PROG_STEPS,#4			; 4 步一个周期
	MOV	A,DW_WATLVL			; 判断水位
	CMP	A,#20H
	BEQ	W_SPEEDY_HIGH
	CMP	A,#10H
	BEQ	W_SPEEDY_MIDDLE
	CMP	A,#0
	BEQ	W_SPEEDY_LOW
	RET
W_SPEEDY_HIGH
	MOVW	A,#0
	MOV	A,ELECTRO_STEPS
	MOVW	A,#TIMETAB_SPEEDY_HIGH		; 高水位: 水流 B
	JMP	TURN_WASHING
W_SPEEDY_MIDDLE
	MOVW	A,#0
	MOV	A,ELECTRO_STEPS
	MOVW	A,#TIMETAB_SPEEDY_MIDDLE	; 中水位: 水流 C
	JMP	TURN_WASHING
W_SPEEDY_LOW
	MOVW	A,#0
	MOV	A,ELECTRO_STEPS
	MOVW	A,#TIMETAB_SPEEDY_LOW		; 低水位: 水流 D
TURN_WASHING
	CLRC
	ADDCW	A				; 偏移
	MOVW	EP,A
	MOV	A,@EP				; 取数据表中的数据
	MOV	TIMES_TURN,A
	AND	A,#00111111B			; 动作时间
	BBS	TIMES_TURN:7,TURN_STOP		; 0 = 转动 , 1 = 停转
	BBS	TIMES_TURN:6,TURN_F		; 0 = 正转 , 1 = 反转
; 正转	
TURN_Z
	CMP	A,TIME_TURN_100MS
	BLO	WASHING_CONT
	SETB	F_ELECMOTOR_Z			; 电机正转
	CLRB	F_ELECMOTOR_F			; 电机反转
	RET
; 反转
TURN_F
	CMP	A,TIME_TURN_100MS
	BLO	WASHING_CONT
	CLRB	F_ELECMOTOR_Z			; 电机正转
	SETB	F_ELECMOTOR_F			; 电机反转
	RET
; 停转
TURN_STOP
	CMP	A,TIME_TURN_100MS
	BLO	WASHING_CONT
	CLRB	F_ELECMOTOR_Z			; 电机正转
	CLRB	F_ELECMOTOR_F			; 电机反转
	RET
WASHING_CONT
	MOV	TIME_TURN_4MS,#0		; 电机转动计时单元清零
	MOV	TIME_TURN_100MS,#0
	MOV	A,ELECTRO_STEPS			; 下一步
	INCW	A
	MOV	ELECTRO_STEPS,A
	CMP	A,PROG_STEPS			; 判是否完成一个周期
	BHS	CLEAR_C
	RET
CLEAR_C
	MOV	ELECTRO_STEPS,#0		; 下一个周期
	RET

; ■■■■■■■■■■■■■■■■■■■■■■■■■
; ■■						■■
; ■■	子程序: 平衡控制			■■
; ■■	使用:	A,EP				■■
; ■■						■■
; ■■■■■■■■■■■■■■■■■■■■■■■■■
CTRL_BALANCE
	MOVW	A,#0
	MOV	A,ELECTRO_STEPS
	MOVW	A,#TIMETAB_BALANCE		; 表首址
	MOV	PROG_STEPS,#4			; 4 步一个周期
	JMP	TURN_WASHING

; ■■■■■■■■■■■■■■■■■■■■■■■■■
; ■■						■■
; ■■	子程序:	间断脱水30″			■■
; ■■	使用:	A,EP				■■
; ■■						■■
; ■■■■■■■■■■■■■■■■■■■■■■■■■
CTRL_SPIN30S
	MOVW	A,#0
	MOV	A,ELECTRO_STEPS
	MOVW	A,#TIMETAB_SPIN30S		; 表首址
	MOV	PROG_STEPS,#9			; 9 步一个周期
	JMP	TURN_WASHING

; ■■■■■■■■■■■■■■■■■■■■■■■■■
; ■■						■■
; ■■	子程序:	轻柔脱水			■■
; ■■	使用:	A,EP				■■
; ■■						■■
; ■■■■■■■■■■■■■■■■■■■■■■■■■
CTRL_SPINGENTLE
	MOVW	A,#0
	MOV	A,ELECTRO_STEPS
	MOVW	A,#TIMETAB_SPINGENTLE		; 表首址
	MOV	PROG_STEPS,#3			; 3 步一个周期
	JMP	TURN_WASHING

; ▲▲▲	以下为水流时间表(100ms为计时单位) 	▲▲▲
; [标准]水流
TIMETAB_REGULAR_HIGH	.DATA.B	010H,088H,050H,088H
;				1.6  0.8  1.6  0.8
TIMETAB_REGULAR_MIDDLE	.DATA.B	008H,08CH,048H,08CH
;				0.8  1.2  0.8  1.2
TIMETAB_REGULAR_LOW	.DATA.B	005H,08DH,045H,08DH
;				0.5  1.3  0.5  1.3
; [加强]水流
TIMETAB_ENHANCE_HIGH	.DATA.B	010H,088H,050H,088H
;				1.6  0.8  1.6  0.8
TIMETAB_ENHANCE_MIDDLE	.DATA.B	008H,08CH,048H,08CH
;				0.8  1.2  0.8  1.2
TIMETAB_ENHANCE_LOW	.DATA.B	005H,08DH,045H,08DH
;				0.5  1.3  0.5  1.3
; [快速]水流
TIMETAB_SPEEDY_HIGH	.DATA.B	010H,088H,050H,088H
;				1.6  0.8  1.6  0.8
TIMETAB_SPEEDY_MIDDLE	.DATA.B	008H,08CH,048H,08CH
;				0.8  1.2  0.8  1.2
TIMETAB_SPEEDY_LOW	.DATA.B	005H,08DH,045H,08DH
;				0.5  1.3  0.5  1.3
; [轻柔]水流
TIMETAB_GENTLE		.DATA.B	004H,092H,044H,092H
;				0.4  1.8  0.4  1.8
; 平衡水流
TIMETAB_BALANCE		.DATA.B	005H,083H,045H,083H
;				0.5  0.3  0.5  0.3
; 轻柔脱水
TIMETAB_SPINGENTLE	.DATA.B	032H,032H,0B2H
;				5    5     5
; 间断脱水30″
TIMETAB_SPIN30S		.DATA.B	028H,09EH,028H,09EH,028H,09EH,028H,09EH,094H
;				4.0  3.0				2.0

; 数据说明:	BIT 7 : 1 -- 电机停止 , 0 -- 电机转动
;		BIT 6 : 1 -- 电机反转 , 0 -- 电机正转
;		BIT 5 - 0 : 电机转动时间(十六进值)

; ■■■■■■■■■■■■■■■■■■■■■■■■■
; ■■						■■
; ■■	子程序:	洗衣过程		 	■■
; ■■	使用:	A,EP				■■
; ■■						■■
; ■■■■■■■■■■■■■■■■■■■■■■■■■
WASH_MAIN
	BBS	PROC_SOAK,JMP_300		; 判是否"浸洗"
	BBS	PROC_WASH,JMP_301		; 判是否"洗涤"
	BBS	PROC_RINSE,JMP_302		; 判是否"漂洗"
	BBS	PROC_SPIN,JMP_303		; 判是否"脱水"
	JMP	WASH_END_QUIT
JMP_300
	SETB	PROC_SOAKING			; 正在"浸泡"
	SETB	EN_NOINWATER
	JMP	WASH_SOAKING
JMP_301
	CLRB	PROC_SOAKING
	SETB	PROC_WASHING			; 正在"洗涤"
	JMP	WASH_WASHING
JMP_302
	CLRB	PROC_SOAKING
	CLRB	PROC_WASHING
	SETB	PROC_RINSEING			; 正在"漂洗"
	JMP	WASH_RINSEING
JMP_303
	CLRB	PROC_SOAKING
	CLRB	PROC_WASHING
	CLRB	PROC_RINSEING
	SETB	PROC_SPINING			; 正在"脱水"
	JMP	WASH_SPINING
;★★★	  洗衣过程结束	★★★
WASH_END_QUIT
	SETB	END_BUZZERING			; 结束蜂鸣时,按键不响应
	CMP	TIME_SUB_1SEC,#0		; 减计时为0
	BNE	WASH_END_QUIT
	CLRB	TIME_SUB			; 减计时停止
	MOV	CTRL_OUTPUT,#00H		; 关闭输出控制
	MOV	TIME_BUZZER_4MS,#0		; 蜂鸣器鸣响计时单元清零
	MOV	COUNT_WARNING,#0		; 蜂鸣次数单元清零
WT100
	MOV	WDTC,#05H			; 喂狗
	SETB	RCEN				; BUZZER ON
	CMP	TIME_BUZZER_4MS,#125		; 0.5''
	BLO	WT100
	MOV	TIME_BUZZER_4MS,#0		; 蜂鸣器鸣响计时单元清零
WT200
	MOV	WDTC,#05H			; 喂狗
	CLRB	RCEN				; BUZZER OFF
	CMP	TIME_BUZZER_4MS,#125		; 0.5''
        BLO	WT200
	MOV	TIME_BUZZER_4MS,#0		; 蜂鸣器鸣响计时单元清零
	MOV	A,COUNT_WARNING
	INCW	A				; 次数 + 1
	CMP	A,#16				; 是否鸣响 16 次?
	BLO	WT100				; 继续鸣响
; 鸣响完毕
	MOV	LED_1ST,#0FFH			; 指示灯暗
	MOV	LED_2ST,#0FFH
	MOV	LED_3ST,#0FFH
	MOV	LED_4ST,#0FFH
	MOV	LED_5ST,#0FFH
	CLRB	CTRLPOWER			; 关断电源开关
	MOV	WASH_OK,#05AH			; 洗涤完成标志
	RET
; ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
; ◆◆		"浸洗"过程		◆◆
; ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
WASH_SOAKING
	MOVW	A,#0
	MOV	A,WASH_STEPS
	MOVW	A,#TAB_SOAK			; "浸洗"过程表首址
	CLRC
	ADDCW	A				; + 步骤 (偏移量)
	MOVW	EP,A
	MOVW	A,@EP				; 取数据
	MOVW	TIME_SECH,A			; 临时保存分步运行时间
	MOV	A,TIME_SECH
	AND	A,#11110000B			; 判正在进行哪个过程?
	CMP	A,#00H
	BEQ	JMP_100
	CMP	A,#10H
	BEQ	JMP_101
	CMP	A,#80H
	BEQ	JMP_102
	RET
JMP_100
	JMP	STEP_INWATER			; 进水
JMP_101
	JMP	STEP_WASH			; 搅拌
JMP_102
	JMP	STEP_WASH_STOP			; 停止搅拌,浸泡
; ▲▲▲ 进水 ▲▲▲
STEP_INWATER
	BBC	EN_NOWATER,_INWATER_START
	CLRB	EN_NOWATER			; 由"浸泡"洗转入"洗涤"时,进水过程忽略
	JMP	_INWATER_5
_INWATER_START
	MOVW	A,#900				; 15′
	MOVW	A,TIME_MAIN_SECH
	CMPW	A				; 进水是否超过 15′?
	BHS	_INWATER_1
	SETB	ERR_INWATER			; 进水超时报警标志
	SETB	FLAG_ALARM			; 有报警标志
	MOV	LED_4ST,#086H			; "E"
	MOV	LED_5ST,#099H			; "4"
	MOV	ELECTRO_STEPS,#0		; 报警鸣响周期
	MOV	TIME_MAIN_4MS,#0		; 清主计时单元
	MOV	TIME_MAIN_SECH,#0
	MOV	TIME_MAIN_SECL,#0
	MOV	TIME_BUZZER_4MS,#0		; 清鸣响计时单元
	MOV	COUNT_WARNING,#0		; 蜂鸣次数单元清零
	CLRB	BUZZER_ONOFF			; 置 ON 标志
	SETB	BUZZER_ALARM_START		; 开始周期鸣响
	RET
_INWATER_1
	BBC	EN_ADDWATER,_INWATER_8
	NOP					; 补进水
	CLRB	TIME_SUB			; 减计时停止
	MOV	A,FLAG_WATLVL			; 判是否达到设定水位?
	CMP	A,FLAG_WATLVL_BESET
	BEQ	_INWATER_9
	CLRB	F_OUTWATER			; 关闭排水牵引器
	SETB	F_INWATER			; 打开进水阀
	RET
_INWATER_8
	MOVW	A,#120				; 2′
	MOVW	A,TIME_MAIN_SECH
	CMPW	A				; 进水是否超过 2′?
	BHS	_INWATER_3
	CLRB	TIME_SUB			; 减计时停止
	JMP	_INWATER_4
_INWATER_3
	SETB	TIME_SUB			; 减计时开始
_INWATER_4
	MOV	A,FLAG_WATLVL			; 判是否达到设定水位?
	CMP	A,FLAG_WATLVL_BESET
	BEQ	_INWATER_2
	CLRB	F_OUTWATER			; 关闭排水牵引器
	SETB	F_INWATER			; 打开进水阀
	RET
_INWATER_2					; 达到设定水位	▲▲▲▲
	MOVW	A,#120				; 2′
	MOVW	A,TIME_MAIN_SECH
	CMPW	A				; 进水是否超过 2′?
	BLO	_INWATER_5
	NOP					; 进水时间不足 2′
	MOVW	A,#60				; 1′
	MOVW	A,TIME_MAIN_SECH
	CMPW	A				; 进水是否超过 1′?
	BLO	_INWATER_6
	MOV	R7,#2				; 进水时间 <1′,倒计时时间要再减 2′
	JMP	_INWATER_7
_INWATER_6
	MOV	R7,#1				; 进水时间 >1′,倒计时时间要再减 1′
_INWATER_7
	MOV	A,WASHTIME_PROC
	CLRC
	SUBC	A,R7
	DAS					; BCD 码调整
	MOV	WASHTIME_PROC,A
	CALL	GET_DISPDATA			; 取数码管显示值
	MOV	TIME_SUB_4MS,#0
	MOV	TIME_SUB_1SEC,#0
_INWATER_5
	MOV	TIME_MAIN_4MS,#0		; 清主计时单元
	MOV	TIME_MAIN_SECH,#0
	MOV	TIME_MAIN_SECL,#0
	MOV	TIME_STEP_4MS,#0		; 清分步计时单元
	MOV	TIME_STEP_SECH,#0
	MOV	TIME_STEP_SECL,#0
_INWATER_9
	MOV	A,WASH_STEPS
	CLRC
	ADDC	A,#2				; 步骤 + 2
	MOV	WASH_STEPS,A
	CLRB	F_INWATER			; 关闭进水阀
	MOV	ELECTRO_STEPS,#0		; 洗涤周期
	MOV	TIME_TURN_4MS,#0		; 电机转动计时单元清零
	MOV	TIME_TURN_100MS,#0
	RET
; ▲▲▲ 搅拌 ▲▲▲
STEP_WASH
	BBC	EN_ADDWATER,STEP_WASH_START
	NOP					; 检测到水位下降
	CLRB	TIME_SUB
	MOV	WASH_STEPS,#0			; 重新进水
	CLRB	F_ELECMOTOR_Z			; 停止搅拌
	CLRB	F_ELECMOTOR_F
	RET
STEP_WASH_START
	SETB	TIME_SUB			; 减计时开始
	MOV	A,TIME_SECH			; 判是否搅拌完成
	AND	A,#00001111B
	MOV	TIME_SECH,A
	MOVW	A,TIME_SECH
	MOVW	A,TIME_STEP_SECH
	CMPW	A
	BHS	STEP_WASH_WASH
STEP_WASH_END					; 搅拌完成
	MOV	A,WASH_STEPS
	CLRC
	ADDC	A,#2				; 步骤 + 2
	MOV	WASH_STEPS,A
	MOV	ELECTRO_STEPS,#0		; 洗涤周期
	MOV	TIME_STEP_4MS,#0		; 清分步计时单元
	MOV	TIME_STEP_SECH,#0
	MOV	TIME_STEP_SECL,#0
	CLRB	F_ELECMOTOR_Z			; 停止搅拌
	CLRB	F_ELECMOTOR_F
	RET
STEP_WASH_WASH
	CALL	CTRL_WASHING			; 搅拌洗衣
	RET
; ▲▲▲ 停止搅拌,浸泡 ▲▲▲
STEP_WASH_STOP
	SETB	TIME_SUB			; 减计时开始
	MOV	A,LED_1ST
	OR	A,DW_WATLVL
	MOV	R7,A
	MOVW	A,#0
	MOV	A,R7
	MOVW	A,#TAB_SOAK_PROG
	CLRC
	ADDCW	A				; + 步骤 (偏移量)
	MOVW	EP,A
	MOV	A,@EP
	MOV	TIMES_SOAK_SET,A		; 取搅拌浸泡次数
	MOV	A,TIME_SECH			; 判是否浸泡完成
	AND	A,#00001111B
	MOV	TIME_SECH,A
	MOVW	A,TIME_SECH
	MOVW	A,TIME_STEP_SECH
	CMPW	A
	BLO	STEP_WASH_END
	CLRB	F_ELECMOTOR_Z			; 停止搅拌,浸泡
	CLRB	F_ELECMOTOR_F
	RET
STEP_WASH_STOP_END
	MOV	A,TIMES_SOAK_ADD
	INCW	A				; 搅拌浸泡次数 + 1
	MOV	TIMES_SOAK_ADD,A
	CMP	A,TIMES_SOAK_SET
	BHS	WASH_SOAKING_END
	JMP	STEP_WASH_END
; ▲▲▲ 浸洗过程完成 ▲▲▲
WASH_SOAKING_END
	CLRB	PROC_SOAK			; 清"浸泡"标志
	SETB	LED_SOAK			; "浸泡"指示灯暗
WASH_SET
	MOV	TIME_MAIN_4MS,#0		; 清主计时单元
	MOV	TIME_MAIN_SECH,#0
	MOV	TIME_MAIN_SECL,#0
	MOV	TIME_STEP_4MS,#0		; 清分步计时单元
	MOV	TIME_STEP_SECH,#0
	MOV	TIME_STEP_SECL,#0
	MOV	WASH_STEPS,#0			; 过程周期步骤
	MOV	ELECTRO_STEPS,#0		; 洗涤周期
	RET
; ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
; ◆◆		"洗涤"过程		◆◆
; ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
WASH_WASHING
	MOV	A,DW_WATLVL
	CLRC
	RORC	A
	MOV	R6,A				; 水位偏移
	MOVW	A,#0
	MOV	A,LED_1ST
	MOVW	A,#TAB_WASH_PROG
	CLRC
	ADDCW	A
	MOVW	EP,A
	MOV	A,@EP
	MOV	R7,A				; 程序偏移
	MOVW	A,#0
	MOV	A,WASH_STEPS			; 洗涤步骤偏移
	MOVW	A,#TAB_WASH			; "洗涤"过程表首址
	CLRC
	ADDCW	A
	ADDC	A,R6
	ADDC	A,R7
	MOVW	EP,A
	MOVW	A,@EP				; 取数据
	MOVW	TIME_SECH,A			; 临时保存分步运行时间
	MOV	A,TIME_SECH
	AND	A,#11110000B			; 判正在进行哪个过程?
	CMP	A,#00H
	BEQ	JMP_200				; 进水
	CMP	A,#10H
	BEQ	JMP_201				; 搅拌
	CMP	A,#20H
	BEQ	JMP_202				; 平衡控制
	RET
JMP_200
	JMP	STEP_INWATER
JMP_201
	JMP	STEP_WASH
JMP_202
	JMP	WASH_BALANCE
; ▲▲▲ 平衡控制 ▲▲▲
WASH_BALANCE:
	MOV	A,TIME_SECH			; 判是否平衡控制完成
	AND	A,#00001111B
	MOV	TIME_SECH,A
	MOVW	A,TIME_SECH
	MOVW	A,TIME_STEP_SECH
	CMPW	A
	BLO	WASH_WASHING_END
	CALL	CTRL_BALANCE			; 平衡控制
	RET
; ▲▲▲ 洗涤过程完成 ▲▲▲
WASH_WASHING_END
	CLRB	PROC_WASH			; 清"洗涤"标志
	SETB	LED_WASH			; "洗涤"指示灯暗
	JMP	WASH_SET

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -