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

📄 xyiji kongzi.txt

📁 洗衣机控制51原程序
💻 TXT
字号:
	    ORG 0000H
	    JMP MAIN
	    ORG 0003H
	    JMP INTPT_0
	    ORG 0013H
	    JMP INTPT_1
W_C_ADD     EQU 2070H	;写命令子地址
W_D_ADD     EQU 2071H	;写数据地址	
R_S_ADD      EQU 2072H	;读状态字地址
R_D_ADD      EQU 2073H	;读数据地址
TIM0        EQU 30H	;延迟时间副变量
V_TIM       EQU 31H	;延迟时间主变量
HORIZEN     EQU 32H	;水位判断值
HOR_JUDGE   EQU 33H	;设定的水位值
ALARM       EQU 34H	;水位警报所用衡量
NUMBER1     EQU 35H	;各种计数
WORK_STY    EQU 36H	;设定浸泡、洗涤、漂洗、甩干
WORK_STY1   EQU 37H	;洗衣机工作方式选定1
WORK_STY2   EQU 38H	;洗衣机工作方式选定2
DATA1 	    EQU 39H	;存放待显示字符的ASCII码
WORK_STY3  EQU 3AH	;高中低洗涤控制
WORK_STY1_1 EQU 3BH	;设定浸泡和洗涤
WORK_STY2_2 EQU 3CH	;设定漂洗和甩干
BLEACH_NUM EQU 3DH;漂洗次数
WAT_HOR_NUM EQU 3EH	;水位高中低的对应数字“0、1、2”
BLE_NUM     EQU 3FH	

	ORG 0100H       
MAIN:   MOV SP,#60H     ;栈指针初始化 
	MOV IE,#85H     ;定义中断
	MOV IP,#04H     ;定义中断优先级
	MOV TCON,#01H	;定义中断方式
	MOV DPTR,#2003H ;定义8255命令口
	MOV A,#8AH      ;8255 A口输出、B口输入、C口高4位输入、低4位输出
	MOVX @DPTR,A
	MOV R0,#04H     ;60次计数
	MOV R6,#78H	;顺逆旋转的针摆动次数
	LCALL INI	;LED初始化
	CLR IT0
	CLR IT1
	;-------------水位设定-------------
WAT_HOR:MOV DPTR,#2001H            ;通过8255的B口PB.5和PB.4确定上水水位
	MOVX A,@DPTR
	ANL A,#30H
	SWAP A
	CJNE A,#00H,WAT_HOR1  
	MOV A,#25H
	JMP WAT_HOR3
WAT_HOR1:CJNE A,#01H,WAT_HOR2
	MOV A,#50H
	JMP WAT_HOR3
WAT_HOR2:CJNE A,#02H,WAT_HOR
	 MOV A,#0A0H
WAT_HOR3:MOV HOR_JUDGE,A            ;将水位设定值传送给固定存储单元
	LCALL DCHAR1		    ;调用第一行汉字“欢迎使用全自动洗衣机”显示子程序
	LCALL WATER_HOR_LCD	    ;调用“水位设定为:”显示子程序
	MOV DPTR,#2001H		    
	MOVX A,@DPTR
	JB ACC.0,WOR_STY
	JMP WAT_HOR

	;------------工作状态选定-----------------
WOR_STY:MOV DPTR,#2002H		    ;通过8255的c口PC.5和PC.4确定漂洗次数
	MOVX A,@DPTR
	ANL A,#0F0H
	SWAP A
	CJNE A,#00H,WOR_STY1 
	MOV A,#03H
	JMP WOR_STY3
WOR_STY1:CJNE A,#01H,WOR_STY2
	MOV A,#04H
	JMP WOR_STY3
WOR_STY2:CJNE A,#02H,WOR_STY
	MOV A,#05H
WOR_STY3:MOV BLEACH_NUM,A	    ;将漂洗次数传送给固定存储单元
	MOV DPTR,#2001H 	    ;工作状态选定
	MOVX A,@DPTR
	MOV WORK_STY,A
	LCALL INI	            ;调用初始化子程序
	LCALL BLEACH_NUM_LCD        ;调用漂洗次数字符显示子程序
	LCALL DCHAR2	            ;调用浸泡、洗涤字符显示子程序
	LCALL DCHAR3		    ;调用漂洗、甩干字符显示子程序
	LCALL TURN_STY  	    ;读取洗涤状态 高 中 低
	LCALL WASH_END_LCD	    ;结束
	JMP WOR_STY
	
INTPT_0:MOV A,#00H  		    ;中断0,即洗衣机工作开关 
	LCALL CONVER   		    ;读取上水、判断水位子程序
	
	;-------------浸泡------------------
SOAK:	 MOV A,WORK_STY1	    ;判断是否进行浸泡
	 JB ACC.1,TRUN_S1
	 LCALL SOAK_LCD		    ;调用浸泡字符显示子程
	 MOV V_TIM,#10		    ;DELAYMS中用到的延时变量
	 MOV NUMBER1,#120           ;运行延时的次数
SOAK1:	 DJNZ NUMBER1,SOAK2
	 JMP TRUN_S1
SOAK2:	 LCALL DELAYMS
	 JMP SOAK1
	;-------------强洗------------------
TRUN_S1: MOV A,WORK_STY1	    ;判断是否进行洗涤
	 JB ACC.0,BLEACH1
	 MOV R2,WORK_STY3           ;判断是否进行强洗
	 CJNE R2,#03H,TRUN_M1
	 MOV DPTR,#DB_S1	    ;调用强洗字符显示子程
	 LCALL TURN_LCD	            
	 MOV V_TIM,#10              ;控制延时程序即控制转速
         MOV NUMBER1,#2
TRUN_S2: DJNZ NUMBER1,TRUN_S3 
	 MOV WORK_STY3,#00H	    ;调整洗涤方式选择
	 JMP TRUN_M1
TRUN_S3: MOV A,#01H
	 LCALL CIRCLE1
         JMP TRUN_S2
	;-------------中洗------------------
TRUN_M1: MOV R2,WORK_STY3           ;判断是否进行中洗
	 CJNE R2,#00H,TRUN_L1
	 MOV DPTR,#DB_M1	    ;调用中洗字符显示子程
	 LCALL TURN_LCD	            	 
	 MOV V_TIM,#30
         MOV NUMBER1,#2
TRUN_M2: DJNZ NUMBER1,TRUN_M3
 	 JMP TRUN_L1        
TRUN_M3: MOV A,#01H
	 LCALL CIRCLE1
         JMP TRUN_M2
	;-------------弱洗------------------
TRUN_L1: MOV DPTR,#DB_L1	    ;调用弱洗字符显示子程
	 LCALL TURN_LCD		 
	 MOV V_TIM,#50
         MOV NUMBER1,#2
TRUN_L2: DJNZ NUMBER1,TRUN_L3
         JMP BLEACH1 
TRUN_L3: MOV A,#01H
	 LCALL CIRCLE1
         JMP TRUN_L2
	;-------------漂洗------------------
BLEACH1: MOV A,WORK_STY2 	    ;判断是否进行漂洗
	 JB ACC.1,SWING1
	 MOV NUMBER1,#2
BLEACH4: LCALL WAT_OUT1
	 LCALL CONVER		    ;上水
	 LCALL BLEACH_LCD	    ;调用漂洗字符显示子程
	 MOV V_TIM,#60
BLEACH2: DJNZ NUMBER1,BLEACH3
         MOV NUMBER1,#2
         DJNZ BLEACH_NUM,BLEACH4
         JMP SWING1
BLEACH3: MOV A,#01H
	 LCALL CIRCLE1
         JMP BLEACH2
	;-------------甩干------------------
SWING1:  MOV A,WORK_STY2            ;判断是否进行甩干
	 JB ACC.0,WASH_END
	 LCALL SWING_LCD	    ;调用甩干字符显示子程
	 MOV V_TIM,#10
         MOV NUMBER1,#2
	 MOV A,#01H
SWING2:  DJNZ NUMBER1,SWING3
         JMP WASH_END
SWING3:  RL A                       ;创建甩干单独顺转程序
	 LCALL DELAYMS
	 MOV P1,A
	 DJNZ R6,SWING4
	 MOV R6,#78H
	 JMP SWING2
SWING4:  CJNE A,#10H,SWING5        
	 MOV A,#01H
	 MOV P1,A
SWING5:  JMP SWING3
WASH_END:RETI
	;-------------中断1结束--------------
INTPT_1:PUSH ACC
	PUSH DPH
	PUSH DPL
	PUSH B
STOP:	JMP $                       ;洗衣机工作时强行中断按钮
	POP B
	POP DPL
	POP DPH
	POP ACC
	RETI    
	;------------顺转----------------       
CIRCLE1:RL A                        ;顺转移位
	LCALL DELAYMS               ;转动速度控制子程序
	MOV P1,A
	DJNZ R6,GOON1
	MOV R6,#78H
	JMP CIRCLE2
GOON1:  CJNE A,#10H,CIR_AGAIN1      ;转动一次调整回初值
	MOV A,#01H
	MOV P1,A
CIR_AGAIN1:JMP CIRCLE1 
	
	;---------逆转-----------------
CIRCLE2:RR A 			    ;逆转移位
	LCALL DELAYMS		    ;转动速度控制子程序
	MOV P1,A
	DJNZ R6,GOON2
	MOV R6,#78H
	RET               	    ;结束旋转
GOON2:  CJNE A,#80H,CIR_AGAIN2      ;转动一次调整回初值   
	MOV A,#08H
	MOV P1,A
CIR_AGAIN2:JMP CIRCLE2 
	;----------水位转化--------------
CONVERMS: MOV DPTR,#2030H           ;使用adc0809得到模数转化值
	  MOV A,#00H
	  MOVX @DPTR,A
	  MOV R3,#200
CONVER_DEL: NOP
	  DJNZ R3,CONVER_DEL
	  MOVX A,@DPTR
	  MOV HORIZEN,A
	  RET
	;----------蜂鸣水位报警-----------
HOR_ALARM:CLR C			   
	  MOV A,HORIZEN
	  CJNE A,HOR_JUDGE,ALARM1   ;转换至与设定值之间判断并存入c
 ALARM1:  RET
	;-----------脱水------------------
WAT_OUT1: LCALL WAT_OUT_LCD	    ;调用脱水字符显示子程
  	  LCALL CONVERMS            ;水位转化
	  CLR C
	  MOV A,HORIZEN
	  CJNE A,#05H,WAT_OUT2
WAT_OUT2: JC WAT_OUT_END
	  MOV DPTR,#2002H
	  MOV A,#00H
	  MOVX @DPTR,A
	  JMP WAT_OUT1
WAT_OUT_END:  RET
	;-------------上水-----------------
CONVER: 
	LCALL WAT_IN_LCD	    ;调用上水字符显示子程序
	LCALL CONVERMS              ;水位转化
	LCALL HOR_ALARM             ;水位报警
	JC START
	MOV DPTR,#2002H
	MOV A,#00H
	MOVX @DPTR,A
	JMP CONVER
START:  MOV DPTR,#2002H
	MOV A,#01H
	MOVX @DPTR,A
	MOV P1,A
	RET
	;----------洗衣机转速控制---------
DELAYMS:  PUSH V_TIM
	  PUSH TIM0
	  ;MOV V_TIM,#01H           ;减速程序
DELAY1:   MOV TIM0,#100
DELAY2:   NOP
	  NOP
	  DJNZ TIM0,DELAY2
	  DJNZ V_TIM,DELAY1
	  POP TIM0
	  POP V_TIM
	  RET
	;----------洗涤状态 高 中 低------------
TURN_STY: PUSH DPH
	  PUSH DPL
	  PUSH ACC
	  PUSH WORK_STY
	  MOV A,WORK_STY
 	  ANL A,#0CH
	  RR A
	  RR A
	  MOV WORK_STY3,A           ;形成洗涤状态
	  POP WORK_STY             
	  POP ACC
	  POP DPL
	  POP DPH
	  RET
	
	;---------LCD字符显示第1行--------------
DCHAR1:	PUSH DPH
	PUSH DPL
	PUSH ACC
	MOV DPTR,#DB_LCD	    ;第一行"全自动洗衣机"
	MOV B,#12		    ;所显汉字字数*2
	MOV A,#80H
	LCALL CMD_LCD		    ;写行命令
DCH0:	MOV A,#00H
	MOVC A,@A+DPTR              ;调用程序空间表中数据,并传递给A
	MOV DATA1,A
	MOV A,DATA1
	LCALL W_LCD		    ;写数据命令
	INC DPTR
	DJNZ B,DCH0		    ;提取次数
	POP ACC
	POP DPL
	POP DPH
	RET
	;---------LCD字符显示第2行--------------
DCHAR2:	PUSH DPH
	PUSH DPL
	PUSH ACC
	PUSH WORK_STY
	MOV DPTR,#DB_LCD1	    ;第二行"浸泡 洗涤"
	MOV A,#90H		    ;写行首地址
	LCALL CMD_LCD
	MOV A,WORK_STY
	ANL A,#03H
	MOV WORK_STY1,A
	MOV B,#0CH
	MUL AB
	MOV WORK_STY1_1,A           ;得到所需显示的行首偏移地址
	MOV B,#12
DCH1:	MOV A,WORK_STY1_1
	MOVC A,@A+DPTR
	MOV DATA1,A
	MOV A,DATA1
	LCALL W_LCD
	INC DPTR
	DJNZ B,DCH1
	POP WORK_STY
	POP ACC
	POP DPL
	POP DPH
	RET
	;---------LCD字符显示第3行--------------
DCHAR3:	PUSH DPH
	PUSH DPL
	PUSH ACC
	PUSH WORK_STY
	MOV DPTR,#DB_LCD2	    ;第三行"漂洗 甩干"
	MOV A,#88H
	LCALL CMD_LCD
	MOV A,WORK_STY
	ANL A,#30H
	SWAP A
	MOV B,#0CH
	MOV WORK_STY2,A
	MUL AB
	MOV WORK_STY2_2,A	    ;得到所需显示的行首偏移地址
	MOV B,#12
DCH2:	MOV A,WORK_STY2_2
	MOVC A,@A+DPTR
	MOV DATA1,A
	MOV A,DATA1
	LCALL W_LCD
	INC DPTR
	DJNZ B,DCH2
	POP WORK_STY
	POP ACC
	POP DPL
	POP DPH
	RET
	;-----------上水LCD-------------------------
WAT_IN_LCD:PUSH DPH
	PUSH DPL
	PUSH ACC
	MOV DPTR,#DB_WAT_IN	    ;"上水"
	MOV B,#10
	MOV A,#98H		    ;在第四行写
	LCALL CMD_LCD		    ;写行命令
WAT_IN_LCD0:	MOV A,#00H
	MOVC A,@A+DPTR
	MOV DATA1,A
	MOV A,DATA1
	LCALL W_LCD		    ;写数据命令
	INC DPTR
	DJNZ B,WAT_IN_LCD0
	POP ACC
	POP DPL
	POP DPH
	RET
	;-----------浸泡LCD------------------------
SOAK_LCD:PUSH DPH
	PUSH DPL
	PUSH ACC
	MOV DPTR,#DB_SOAK	    ;"浸泡"
	MOV B,#10
	MOV A,#98H
	LCALL CMD_LCD		    ;写行命令
SOAK_LCD0:	MOV A,#00H
	MOVC A,@A+DPTR
	MOV DATA1,A
	MOV A,DATA1
	LCALL W_LCD		    ;写数据命令
	INC DPTR
	DJNZ B,SOAK_LCD0
	POP ACC
	POP DPL
	POP DPH
	RET
	;-----------高中低洗涤LCD------------------------------
TURN_LCD:PUSH DPH
	PUSH DPL
	PUSH ACC
	MOV B,#10
	MOV A,#98H
	LCALL CMD_LCD		    ;写行命令
TURN_LCD0:	MOV A,#00H
	MOVC A,@A+DPTR
	MOV DATA1,A
	MOV A,DATA1
	LCALL W_LCD		    ;写数据命令
	INC DPTR
	DJNZ B,TURN_LCD0
	POP ACC
	POP DPL
	POP DPH
	RET
	;-----------漂洗LCD-----------------------
BLEACH_LCD:PUSH DPH
	PUSH DPL
	PUSH ACC
	MOV DPTR,#DB_BLEACH	    ;"漂洗"
	MOV B,#10
	MOV A,#98H
	LCALL CMD_LCD		    ;写行命令
BLEACH_LCD0:	MOV A,#00H
	MOVC A,@A+DPTR
	MOV DATA1,A
	MOV A,DATA1
	LCALL W_LCD		    ;写数据命令
	INC DPTR
	DJNZ B,BLEACH_LCD0
	POP ACC
	POP DPL
	POP DPH
	RET
	;-----------甩干LCD------------------------
SWING_LCD:PUSH DPH
	PUSH DPL
	PUSH ACC
	MOV DPTR,#DB_SWING	    ;"甩干"
	MOV B,#10
	MOV A,#98H
	LCALL CMD_LCD		    ;写行命令
SWING_LCD0:	MOV A,#00H
	MOVC A,@A+DPTR
	MOV DATA1,A
	MOV A,DATA1
	LCALL W_LCD		    ;写数据命令
	INC DPTR
	DJNZ B,SWING_LCD0
	POP ACC
	POP DPL
	POP DPH
	RET
	;-----------脱水LCD-------------------------
WAT_OUT_LCD:PUSH DPH
	PUSH DPL
	PUSH ACC
	MOV DPTR,#DB_WAT_OUT	    ;"脱水"
	MOV B,#10
	MOV A,#98H
	LCALL CMD_LCD		    ;写行命令
WAT_OUT_LCD0:	MOV A,#00H
	MOVC A,@A+DPTR
	MOV DATA1,A
	MOV A,DATA1
	LCALL W_LCD		    ;写数据命令
	INC DPTR
	DJNZ B,WAT_OUT_LCD0
	POP ACC
	POP DPL
	POP DPH
	RET
	;---------结束LCD--------------------
WASH_END_LCD:PUSH DPH
	PUSH DPL
	PUSH ACC
	MOV DPTR,#DB_WASH_END	    ;"结束"
	MOV B,#4
	MOV A,#98H
	LCALL CMD_LCD		    ;写行命令
WASH_END_LCD0:	MOV A,#00H
	MOVC A,@A+DPTR
	MOV DATA1,A
	MOV A,DATA1
	LCALL W_LCD		    ;写数据命令
	INC DPTR
	DJNZ B,WASH_END_LCD0
	POP ACC
	POP DPL
	POP DPH
	RET
	;-------水位设定LCD------------------
WATER_HOR_LCD:PUSH DPH
	PUSH DPL
	PUSH ACC
	MOV A,#90H
	LCALL CMD_LCD		    ;写行命令
	MOV DPTR,#2001H
	MOVX A,@DPTR
	ANL A,#30H
	SWAP A
	MOV B,#06H
	MUL AB
	MOV WAT_HOR_NUM,A	    ;得到所需显示的行首偏移地址
	MOV DPTR,#DB_WAT
	MOV B,#6
WATER_HOR_LCD0: MOV A,WAT_HOR_NUM
	MOVC A,@A+DPTR
	LCALL W_LCD		    ;写数据命令
	INC DPTR
	DJNZ B,WATER_HOR_LCD0
	POP ACC
	POP DPL
	POP DPH
	RET	
	;-------漂洗次数LCD------------------
BLEACH_NUM_LCD:PUSH DPH
	PUSH DPL
	PUSH ACC
	MOV A,#80H
	LCALL CMD_LCD		    ;写行命令
	MOV DPTR,#2002H
	MOVX A,@DPTR
	ANL A,#0F0H
	SWAP A
	MOV B,#0CH
	MUL AB
	MOV BLE_NUM,A		    ;得到所需显示的行首偏移地址
	MOV DPTR,#DB_BLEACH_NUM	
	MOV B,#12
BLEACH_NUM_LCD0:MOV A,BLE_NUM
	MOVC A,@A+DPTR
	MOV DATA1,A
	MOV A,DATA1
	LCALL W_LCD		    ;写数据命令
	INC DPTR
	DJNZ B,BLEACH_NUM_LCD0
	POP ACC
	POP DPL
	POP DPH
	RET		
	;-------LCD初始化--------------------
INI:	PUSH ACC
	MOV A,#38H
	LCALL CMD_LCD
	LCALL DELAYLC
	MOV A,#38H
	LCALL CMD_LCD
	LCALL DELAYLC
	MOV A,#38H
	LCALL CMD_LCD
	MOV A,#0CH
	LCALL CMD_LCD
	MOV A,#01H
	LCALL CMD_LCD
	MOV A,#02H
	LCALL CMD_LCD
	POP ACC
	RET
DELAYLC:MOV R6,#00H		    ;延时50ms子程序
	MOV R7,#00H
DELAYLC1:	NOP
	DJNZ R7,DELAYLC1
	DJNZ R6,DELAYLC1
	RET
CHKBUSY:PUSH DPH		    ;忙状态检测
	PUSH DPL
	PUSH PSW
	PUSH ACC
	MOV  DPTR,#R_S_ADD
CHK:	MOVX A,@DPTR		    ;从液晶模块读状态
	JB ACC.7,CHK
	POP ACC
	POP PSW
	POP DPL
	POP DPH
	RET
	;--------LCD写命令-------------------
CMD_LCD:PUSH DPH
	PUSH DPL
	LCALL CHKBUSY
	MOV DPTR,#W_C_ADD
	MOVX @DPTR,A
	POP DPL
	POP DPH
	RET
	;---------LCD写数据------------------
W_LCD:	PUSH DPH
	PUSH DPL
	LCALL CHKBUSY
	MOV DPTR,#W_D_ADD
	MOVX @DPTR,A
	POP DPL
	POP DPH
	RET
DB_LCD: DW 0C8ABH,0D7D4H,0B6AFH,0CFB4H,0D2C2H,0BBFAH
DB_LCD1: DW 0A1CCH,0BDFEH,0C5DDH,0A1CCH,0CFB4H,0B5D3H
	      DW 0A1CCH,0BDFEH,0C5DDH,0A1C1H,0CFB4H,0B5D3H
	      DW 0A1C1H,0BDFEH,0C5DDH,0A1CCH,0CFB4H,0B5D3H 
	      DW 0A1C1H,0BDFEH,0C5DDH,0A1C1H,0CFB4H,0B5D3H 
DB_LCD2:   DW 0A1CCH,0C6AFH,0CFB4H,0A1CCH,0CBA6H,0B8C9H 	
	        DW 0A1CCH,0C6AFH,0CFB4H,0A1C1H,0CBA6H,0B8C9H
	        DW 0A1C1H,0C6AFH,0CFB4H,0A1CCH,0CBA6H,0B8C9H  	
	        DW 0A1C1H,0C6AFH,0CFB4H,0A1C1H,0CBA6H,0B8C9H
DB_WAT_IN:    DW 0C9CFH,0CBAEH,0A1F1H,0A1F1H,0A1F1H
DB_SOAK:      DW 0BDFEH,0C5DDH,0A1F1H,0A1F1H,0A1F1H
DB_S1:	        DW 0C7BFH,0CFB4H,0A1F1H,0A1F1H,0A1F1H
DB_M1:	        DW 0D6D0H,0CFB4H,0A1F1H,0A1F1H,0A1F1H
DB_L1:	        DW 0C8F5H,0CFB4H,0A1F1H,0A1F1H,0A1F1H
DB_BLEACH:    DW 0C6AFH,0CFB4H,0A1F1H,0A1F1H,0A1F1H
DB_SWING:      DW 0CBA6H,0B8C9H,0A1F1H,0A1F1H,0A1F1H
DB_WAT_OUT:   DW 0CDD1H,0CBAEH,0A1F1H,0A1F1H,0A1F1H
DB_WASH_END:  DW 0CDA3H,0D6B9H
DB_BLEACH_NUM:  DW 0C6AFH,0CFB4H,0B4CEH,0CAFDH,0A1C3H,0A3B3H
	        		DW 0C6AFH,0CFB4H,0B4CEH,0CAFDH,0A1C3H,0A3B4H
	        		DW 0C6AFH,0CFB4H,0B4CEH,0CAFDH,0A1C3H,0A3B5H
DB_WAT: DW 0B5CDH,0CBAEH,0CEBBH
         DW 0D6D0H,0CBAEH,0CEBBH
         DW 0B8DFH,0CBAEH,0CEBBH
	     END

⌨️ 快捷键说明

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