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

📄 c10floor.txt

📁 10层电梯
💻 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 + -