;*********START启动程序***********
START: MOV TMOD,#11H
MOV IE,#8AH
MOV TH0,#3CH ;定时100ms
MOV TL0,#0B0H
MOV TH1,#0ECH ;定时10ms
MOV TL1,#78H
SETB TR0
MOV SP,#6FH
;*********STOP停止程序***********
STOP: CLR P0.6
CLR P0.7
MOV R3,#0
MOV P3,#1FH ;数码管显示"1"
JB P1.7,$ ;等待开始工作指令
SETB P0.6
SETB TR1 ;启动T1
;10ms一次读取按键
;*********一楼上升按键选择程序***********
UP1: MOV A,20H ;目前在1楼
ORL A,21H ;取得>1楼请求情况
ORL A,22H
ANL A,#0EH
JZ UP1 ;无请求,则等待
CLR P0.7 ;上升指示灯亮
ACALL DLY ;上升2s
;*********二楼上升按键选择程序***********
UP2: MOV P3,#2FH ;到达2楼,数码管显示"2"
JB 20H.1,UP21 ;是2楼电梯间的上升请求,转UP21
JB 22H.1,UP21 ;是电梯内目标2楼请求,转UP21
SJMP UP22
UP21: CLR 20H.1 ;清二楼电梯间上升请求标志位
CLR 22H.1 ;清电梯内目标2楼请求标志位
SETB P0.7 ;上升指示灯灭
MOV R2,#0 ;5s定时开始
CJNE R2,#50,$ ;等待5s延时
UP22: MOV A,20H
ORL A,21H
ORL A,22H
ANL A,#0CH ;取得>2楼请求情况
JNZ UP23
AJMP DOWN22 ;>2楼无请求,转2楼下降
UP23: CLR P0.7 ;上升指示灯亮
ACALL DLY ;上升2s
;*********三楼上升按键选择程序***********
UP3: MOV P3,#3FH ;到达3楼,数码管显示"3"
JB 20H.2,UP31 ;是3楼电梯间的上升请求,转UP31
JB 22H.2,UP31 ;是电梯内目标3楼请求,转UP31
SJMP UP32
UP31: CLR 20H.1 ;清3楼电梯间上升请求标志位
CLR 22H.1 ;清电梯内目标3楼请求标志位
SETB P0.7 ;上升指示灯灭
MOV R2,#0 ;5s定时开始
CJNE R2,#50,$ ;等待5s延时
UP32: MOV A,20H
ORL A,21H
ORL A,22H
ANL A,#08H ;取得>3楼请求情况
JNZ UP33
AJMP DOWN32 ;>3楼无请求,转3楼下降
UP33: CLR P0.7 ;上升指示灯亮
ACALL DLY ;上升2s
UP34: MOV P3,#4FH ;到达4楼,数码管显示"4"
;*********四楼下降按键选择程序***********
UP41: CLR 20.H3 ;清4楼电梯间下降请求标志位
CLR 22H.3 ;清电梯内目标4楼请求标志位
SETB P0.7 ;上升指示灯灭
MOV R2,#0 ;5s定时开始
CJNE R2,#50,$ ;等待5s延时
UD4: MOV A,50H
ORL A,21H
ORL A,22H
ANL A,#07H ;取得<4楼的请求情况
JNZ DOWN4
AJMP UD4
DOWN4: CLR P0.6 ;下降指示灯亮
ACALL DLY ;下降2s
;*********三楼下降按键选择程序***********
DOWN3: MOV P3,#3FH ;到达3楼,数码管显示"3"
JB 21H.2,DOWN31 ;是3楼电梯间的下降请求,转DOWN31
JB 22H.2,DOWN31 ;是电梯内目标3楼请求,转DOWN31
S JMP DOWN32
DOWN31:CLR 21H.2 ;清3楼电梯间下降请求标志位
CLR 22H.2 ;清电梯内目标3楼请求标志位
SETB P0.6 ;下降指示灯灭
MOV R2,#0 ;5s定时开始
CJNE R2,#50,$ ;等待5s延时
DOWN32:MOV A,20H
ORL A,21H
ORL A,22H
ANL A,#03H ;取得<3楼的请求情况
JNZ DOWN33
AJMP UP32 ;<3无楼请求,转3楼上升
DOWN33:CLR P0.6 ;下降指示灯亮
ACALL DLY
;*********二楼下降按键选择程序***********
DOWN2: MOV P3,#2FH ;到达2楼,数码管显示"2"
JB 21H.1,DOWN21 ;是2电梯间的下降请求,转DOWN21
JB 22H.1,DOWN2 ;是电梯内目标3楼请求,转DOWN21
SJMP DOWN22
DOWN21:CLR 21H.1 ;清2楼电梯间下降请求标志位
CLR 22H.1 ;清电梯内目标2楼请求标志位
SETB P0.6 ;下降指示灯灭
MOV R2,#0 ;5s定时开始
CJNE R2,#50,$ ;等待5s延时
DOWN22:MOV A,20H
ORL A,21H
ORL A,22H
ANL A,#02H ;取得<2的请求情况
JNZ DOWN23
AJMP UP22 ;<2楼请求,转2楼上升
DOWN23:CLR P0.6 ;下降指示灯亮
ACALL DLY
DOWN1: MOV P3,#1FH ;到达1,数码管显示"1"
DOWN11:CLR 21H.0 ;清电梯内目标1请求标志位
SETB P0.6 ;下降指示灯灭
MOV R2,#0 ;0 s定时开始
CJNE R2,#50,$ ;5s延时
CJNE R3,#0,DOWN12 ;Stop键是否按下过
AJMP UP1
DOWN12:CLR P0.6 ;若Stop键按下过,转S1停止工作
CLR P0.7
AJMP S1
;定时器T0中断服务程序:5s计时
TIME: MOV TH0,#3CH
MOV TL0,#0B0H
INC R2 ;R2计数器
RETI
;*********定时器T1中断服务程序:按键状态检查*********
TIME1: MOV TH1,#0ECH ;每10s检查一次按键
MOV TL1,#78H
MOV 6EH,A
MOV 30H,P1 ;读入所有按键状态
MOV 31H,P3
JB P1.6,TIME11 ;若Stop键未按下,则正常运行
MOV R3,#0FFH ;Stop键按下,标志R3置非0数
MOV 20H,#0 ;清除全部电梯间上升请求
MOV 21H,#0 ;清除全部电梯间下降请求
MOV 22H,#0 ;清除全部电梯内目标楼层请求
MOV 30H,#0FFH ;修改读入的按键状态,使之为
MOV 31H,#0FEH ;电梯内目标为一楼
CLR TR1 ;并关闭T1,不再读取按键
TIME11: MOV A,30H
CPL A
ANL A,#07H ;取得电梯间上升请求
ORL 20H,A
MOV A,20H ;取得上升指示灯状态
CPL A
ANL A,#07H
MOV 32H,A
MOV A,30H
CPL A
ANL A,#38H ;取得电梯间下降请求
RR A
RR A
ORL 21H,A
MOV A,21H
CPL A
ANL A,#0EH
RL A
RL A
ORL 32H,A
MOV A,P0
ANL A,#0C0H
ORL A,32H
MOV P0,A ;刷新上升、下降请求指示灯
MOV A,31H
ANL A,#0FH ;取得电梯内目标楼层请求
ORL 22H,A
MOV A,22H
CPL A
MOV P2,A ;刷新电梯内目标楼层指示灯
TIME12: MOV A,6EH
RETI
|