📄 c10floor.txt
字号:
;************************************************************************************************************************
;题目: *
; 四层电梯控制LED模拟显示 *
;实现方式: *
; 1、矩阵键盘:提供电梯内部按钮 *
; 0,一层按钮;1,二层按钮;2,三层按钮;3,四层按钮;4,关门按钮;5,开门按钮 *
; 2、拨码开关:提供电梯外部按钮 *
; 1号,一层上按钮;2号,二层上按钮;3号,三层上按钮;4号,四层下按钮;5号,二层下按钮;6号,三层下按钮 *
; 3、发光二极管:显示楼层状态 *
; 1号代表电梯一层,2号代表电梯二层,3号带便电梯三层,4号代表电梯四层;电梯停在某层时,关门后,该层灯亮; *
; 到达哪层,那层灯亮;当某层门开时,该层灯不断闪烁 *
; 4、LED数码管:显示电梯运行时间以及开门关门时间 *
; 用四个数码管显示时间,用时间变化快慢表示电梯减速加速,用数码管不断闪烁表示开门关门 *
;硬件连接: *
; P0.0~P0.3接发光二极管1~4号 *
; P1.0~P1.5接拨码开关1~6号 *
;************************************************************************************************************************
;------------------------------------------------------------------------------------------------------------------------
;伪定义:
S1 bit P1.0 ;拨码开关,一层开关
S2 bit P1.1 ;二层上开关
S3 bit P1.2 ;二层下开关
S4 bit P1.3 ;三层上开关
S5 bit P1.4 ;三层下开关
S6 bit P1.5 ;四层开关
S7 bit P1.6
S8 bit P1.7
S9 bit P3.0
S10 bit P3.1
S11 bit P3.2
L1 bit P0.0 ;发光二极管
L2 bit P0.1
L3 bit P0.2
L4 bit P0.3
INNERREQUEST equ 52h ;电梯内部请求位
UPREQUEST equ 53h ;外部上升请求位
DOWNREQUEST equ 54h ;外部下降请求位
INNERCUSHION equ 55h ;内部请求缓冲位
UPCUSHION equ 56h ;上升请求缓冲位
DOWNCUSHION equ 57h ;下降请求缓冲位
FLOORSTATE equ 58h ;楼层状态缓冲位
FLOORDIR equ 72h ;楼层状态显示位
UPDOWNFLAG bit 00h ;上行标志位
;---------------------------------------------------------------------------------------------------------------------
org 0000h
ljmp main
org 000bh
ljmp intt0
org 001bh
ljmp intt1
org 0100h
;************主程序**********************************************************************
main:
mov sp,#30h
mov r5,#14h
mov r4,#14h
mov tmod,#11h
mov tl0,#0b0h
mov th0,#3ch
mov tl1,#0b0h
mov th1,#3ch
setb ea
lcall inition
start:
lcall scandir
checkup:
mov a,UPCUSHION
jnz checkup1
ljmp checkdown
checkup1:
mov a,UPCUSHION
anl a,FLOORSTATE
jz up
lcall opendoor
lcall dir
mov a,FLOORSTATE
cpl a
anl a,UPCUSHION
mov UPCUSHION,a
lcall wait
ljmp uploop
up:
lcall rise
mov a,UPCUSHION
anl a,FLOORSTATE
jz up
lcall opendoor
lcall dir
mov a,FLOORSTATE
cpl a
anl a,UPCUSHION
mov UPCUSHION,a
lcall wait
uploop:
lcall rise
mov a,50h
anl a,FLOORSTATE
jz uploop
lcall opendoor
lcall dir
mov a,FLOORSTATE
cpl a
anl a,UPCUSHION
mov UPCUSHION,a
mov a,FLOORSTATE
cpl a
anl a,INNERCUSHION
mov INNERCUSHION,a
lcall wait
clr c
subb a,FLOORSTATE
jc downcross
ljmp uploop
downcross:
mov a,DOWNCUSHION
jnz downcross1
lcall scandir
ljmp upcross
downcross1:
clr c
subb a,FLOORSTATE
jc downloop
downcross2:
lcall rise
mov a,FLOORSTATE
cpl a
anl a,DOWNCUSHION
clr c
subb a,FLOORSTATE
jnc downcross2
lcall opendoor
lcall dir
mov a,FLOORSTATE
cpl a
anl a,DOWNCUSHION
mov DOWNCUSHION,a
mov a,FLOORSTATE
cpl a
anl a,51h
mov 51h,a
sjmp downloop
lcall wait
checkdown:
mov a,DOWNCUSHION
jnz down
ljmp start
down:
lcall rise
mov a,FLOORSTATE
cpl a
mov 2bh,a
mov a,DOWNCUSHION
anl a,2bh
clr c
subb a,FLOORSTATE
jnc down
lcall opendoor
lcall dir
mov a,DOWNCUSHION
anl a,2bh
mov DOWNCUSHION,a
mov a,FLOORSTATE
cpl a
anl a,51h
mov 51h,a
lcall wait
downloop:
lcall fall
mov a,51h
anl a,FLOORSTATE
jz downloop
lcall opendoor
lcall dir
mov a,FLOORSTATE
cpl a
anl a,DOWNCUSHION
mov DOWNCUSHION,a
mov a,FLOORSTATE
cpl a
anl a,INNERCUSHION
mov INNERCUSHION,a
lcall wait
mov a,FLOORSTATE
dec a
anl a,INNERREQUEST
jz upcross
sjmp downloop
upcross:
mov a,UPCUSHION
jnz upcross1
ljmp downcross
upcross1:
clr c
subb a,FLOORSTATE
jc upcross2
ljmp uploop
upcross2:
lcall fall
mov a,FLOORSTATE
dec a
anl a,UPCUSHION
jz upcross3
ljmp uploop
upcross3:
lcall opendoor
lcall dir
mov a,FLOORSTATE
cpl a
anl a,UPCUSHION
mov UPCUSHION,a
mov a,FLOORSTATE
cpl a
anl a,50h
mov 51h,a
lcall wait
ljmp uploop
;*************初始化子程序***************************************************************
inition:
mov a,#00h
mov b,#00h
mov 2ah,#00h
mov 2bh,#00h
mov 70h,#0ah
mov 71h,#0ah
mov 72h,#00h
mov 73h,#00h
mov 74h,#00h
mov 75h,#00h
mov 76h,#00h
mov P0,#00h
setb L1
mov FLOORSTATE,#01h
mov INNERREQUEST,#00h
mov UPREQUEST,#00h
mov DOWNREQUEST,#00h
mov INNERCUSHION,#00h
mov UPCUSHION,#00h
mov DOWNCUSHION,#00h
mov FLOORDIR,#01h
clr UPDOWNFLAG
ret
;***********上升子程序*******************************************************************
rise:
setb UPDOWNFLAG
setb et0
setb tr0
setb 01h
mov 70h,#0ah
upwait:
lcall scandir
jb 01h,upwait
ret
;***********下降子程序*******************************************************************
fall:
clr UPDOWNFLAG
setb tr0
setb et0
setb 01h
mov 70h,#0ah
downwait:
lcall scandir
jb 01h,downwait
ret
;**********开门子程序********************************************************************
opendoor:
setb tr1
setb et1
setb 02h
mov 71h,#0ah
openwait:
lcall scandir
mov a,FLOORSTATE
cjne a,#01h,floorled1
sjmp outt11
floorled1:
mov a,FLOORSTATE
cjne a,#02h,floorled2
sjmp outt12
floorled2:
mov a,FLOORSTATE
cjne a,#04h,floorled3
sjmp outt13
floorled3:
sjmp outt14
outt11:
cpl L1
sjmp outt10
outt12:
cpl L2
sjmp outt10
outt13:
cpl L3
sjmp outt10
outt14:
cpl L4
outt10:
; mov a,INNERCUSHION
; anl a,#10h
; jz openwait1
; mov 71h,#0ah
;; mov r4,#14h
openwait1:
jb 02h,openwait
ret
;**************无键等待子程序***********************************************************
wait:
lcall scandir
mov a,UPCUSHION
jz wait1
ljmp ret3
wait1:
mov a,DOWNCUSHION
jz wait2
ljmp ret3
wait2:
mov a,INNERCUSHION
jz wait
ret3:
ret
;*************扫描键码和显示子程序*******************************************************
scandir:
lcall dir
lcall scan
mov a,INNERCUSHION
orl a,UPCUSHION
mov 50h,a
mov a,INNERCUSHION
orl a,DOWNCUSHION
mov 51h,a
ret
;************扫描键码子程序**************************************************************
scan: ;键盘扫描子程序
lcall keyboard ;调用电梯内部
lcall switch ;调用电梯外部
ret
;***********电梯外部(拨码开关)摁键获取子程序*******************************************
switch:
lcall dir
jnb S1,askin_1
lcall delay10ms
jb S1,askin2
askin_1:
mov UPREQUEST,#01h
sjmp ret1
askin2:
mov UPREQUEST,#00h
jnb S2,askin_2
lcall delay10ms
jb S2,askin3
askin_2:
mov UPREQUEST,#02h
sjmp ret1
askin3:
mov UPREQUEST,#00h
jnb S3,askin_3
lcall delay10ms
jb S3,askin4
askin_3:
mov DOWNREQUEST,#02h
sjmp ret1
askin4:
mov DOWNREQUEST,#00h
jnb S4,askin_4
lcall delay10ms
jb S4,askin5
askin_4:
mov UPREQUEST,#04h
sjmp ret1
askin5:
mov UPREQUEST,#00h
jnb S5,askin_5
lcall delay10ms
jb S5,askin6
askin_5:
mov DOWNREQUEST,#04h
sjmp ret1
askin6:
mov DOWNREQUEST,#00h
jnb S6,askin_6
lcall delay10ms
jb S6,askin60
askin_6:
mov DOWNREQUEST,#08h
sjmp ret1
askin60:
mov DOWNREQUEST,#00h
ret1:
mov a,UPCUSHION
orl a,UPREQUEST
mov UPCUSHION,a
mov a,DOWNCUSHION
orl a,DOWNREQUEST
mov DOWNCUSHION,a
lcall dir
ret
;***************电梯内部(小键盘)摁键获取子程序******************************************
keyboard:
lcall dir
jnb S7,askin_7
lcall delay10ms
jb S7,askin8
askin_7:
mov INNERREQUEST,#01h
sjmp ret2
askin8:
mov INNERREQUEST,#00h
jnb S8,askin_8
lcall delay10ms
jb S8,askin9
askin_8:
mov INNERREQUEST,#02h
sjmp ret2
askin9:
mov INNERREQUEST,#00h
jnb S9,askin_9
lcall delay10ms
jb S9,askin10
askin_9:
mov INNERREQUEST,#04h
sjmp ret2
askin10:
mov INNERREQUEST,#00h
jnb S10,askin_10
lcall delay10ms
jb S10,askin11
askin_10:
mov INNERREQUEST,#08h
sjmp ret2
askin11:
mov INNERREQUEST,#00h
jnb S11,askin_11
lcall delay10ms
jb S11,askin12
askin_11:
mov INNERREQUEST,#10h
askin12:
mov INNERREQUEST,#00h
ret2:
mov a,INNERCUSHION
orl a,INNERREQUEST
mov INNERCUSHION,a
lcall dir
ret
;***********LED显示子程序****************************************************************
dir:
push psw
clr psw.3
setb psw.4
mov r0,#76h
mov r1,#0feh
dir1:
mov dptr,#table
mov a,@r0
movc a,@a+dptr
mov dptr,#0f300h
movx @dptr,a
mov dptr,#0f400h
mov a,r1
movx @dptr,a
acall delay5ms
dec r0
mov a,r1
rl a
mov r1,a
cjne r0,#71h,dir1
pop psw
ret
table:
db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,0ffh
;****************定时器0子程序***********************************************************
intt0:
push acc
push psw
clr et0
clr tr0
mov a,#0b7h
add a,tl0
mov tl0,a
mov a,#3ch
add a,th0
mov th0,a
djnz r5,outt0
mov r5,#14h
djnz 70h,outt0
clr 01h
jb UPDOWNFLAG,upleft ;进行移位
mov a,FLOORSTATE
rr a
mov FLOORSTATE,a
sjmp outt00
upleft:
mov a,FLOORSTATE
rl a
mov FLOORSTATE,a
outt00:
mov a,70h
mov b,#0ah
div ab
mov 73h,a
mov 74h,b
mov a,FLOORSTATE
cjne a,#01h,dirfloor1
mov FLOORDIR,#01h
setb L1
clr L2
clr L3
clr L4
sjmp dirfloor4
dirfloor1:
cjne a,#02h,dirfloor2
mov FLOORDIR,#02h
setb L2
clr L1
clr L3
clr L4
sjmp dirfloor4
dirfloor2:
cjne a,#04h,dirfloor3
mov FLOORDIR,#03h
setb L3
clr L2
clr L1
clr L4
sjmp dirfloor4
dirfloor3:
mov FLOORDIR,#04h
setb L4
clr L2
clr L3
clr L1
dirfloor4:
pop psw
pop acc
sjmp reti2
outt0:
mov a,70h
mov b,#0ah
div ab
mov 73h,a
mov 74h,b
setb tr0
setb et0
pop psw
pop acc
reti2:
reti
;**********定时器1子程序*****************************************************************
intt1:
push acc
push psw
clr et1
clr tr1
mov a,#0b7h
add a,tl1
mov tl1,a
mov a,#3ch
add a,th1
mov th1,a
djnz r4,outt1
mov r4,#14h
djnz 71h,outt1
clr 02h
mov a,71h
mov b,#0ah
div ab
mov 75h,a
mov 76h,b
pop psw
pop acc
sjmp reti1
outt1:
mov a,71h
mov b,#0ah
div ab
mov 75h,a
mov 76h,b
setb tr1
setb et1
pop psw
pop acc
reti1:
reti
;*************5ms延时子程序**************************************************************
delay5ms:
push psw
clr psw.3
setb psw.4
mov r7,#2
del1:
mov r6,#250
djnz r6,$
djnz r7,del1
pop psw
ret
;*************10ms延时子程序*************************************************************
delay10ms:
lcall delay5ms
lcall delay5ms
ret
;*************程序结束*******************************************************************
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -