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

📄 trafic lamp.asm

📁 实现了单片机对交通灯的控制
💻 ASM
字号:
SECOND1	EQU		30H					;东西路口计时寄存器
SECOND2	EQU		31H					;南北路口计时寄存器 
DBUF	EQU		40H					;显示码缓冲区1
TEMP	EQU		44H					;显示码缓冲区2
LED_G1	BIT		P2.1				;东西路口绿灯
LED_Y1	BIT		P2.2				;东西路口黄灯
LED_R1	BIT		P2.3				;东西路口红灯
LED_G2	BIT		P2.4				;南北路口绿灯
LED_Y2	BIT		P2.5				;南北路口黄灯
LED_R2	BIT		P2.6				;南北路口红灯
		ORG		0000H
		LJMP	START
		ORG		0100H
START:	MOV		TMOD,#01H			;置T0为工作方式1
		MOV		TH0,#3CH			;置T0定时初值50ms
		MOV		TL0,#0B0H				
		CLR		TF0
		SETB	TR0					;启动T0
		CLR		A
		MOV		P1,A				;关闭不相关的LED
;***************************************************
LOOP:	MOV		R2,#20				;置1s计数初值,50ms*20=1s
		MOV		R3,#20				;红灯亮20s
		MOV		SECOND1,#25			;东西路口计时显示初值25s
		MOV		SECOND2,#25			;南北路口计时显示初值25s
		LCALL	DISPLAY
		LCALL	STATE1				;调用状态1
WAIT1:	JNB		TF0,WAIT1			;查询50ms到否
		CLR		TF0			
		MOV		TH0,#3CH			;恢复T0定时初值50ms
		MOV		TL0,#0B0H
		DJNZ	R2,WAIT1			;判断1s到否?未到继续状态1
		MOV		R2,#20				;置50ms计数初值 
		DEC		SECOND1				;东西路口显示时间减1s
		DEC		SECOND2				;南北路口显示时间减1s
		LCALL	DISPLAY
		DJNZ	R3,WAIT1			;状态1维持20s
;*******************************************
		MOV		R2,#5				;置50ms计数初值	5*4=20
		MOV		R3,#3				;绿灯闪3s
		MOV		R4,#4				;闪烁间隔200ms
		MOV		SECOND1,#5			;东西路口计时显示初值5s
		MOV		SECOND2,#5			;南北路口计时显示初值5s
		LCALL	DISPLAY
WAIT2:	LCALL	STATE2				;调用状态2
		JNB		TF0,WAIT2			;查询50ms到否
		CLR		TF0
		MOV		TH0,#3CH			;恢复T0定时初值50ms
		MOV		TL0,#0B0H
		DJNZ	R4,WAIT2			;判断200ms到否?未到继续状态2
		CPL		LED_G1				;东西绿灯闪
		MOV		R4,#4				;闪烁间隔200ms
		DJNZ	R2,WAIT2			;判1s到否?未到继续状态2
		MOV		R2,#5				;置50ms计数初值
		DEC		SECOND1				;东西路口显示时间减1s
		DEC		SECOND2				;南北路口显示时间减1s
		LCALL	DISPLAY
		DJNZ	R3,WAIT2			;状态2维持3s
;****************************************
		MOV		R2,#20				;置50ms计数初值
		MOV		R3,#2				;黄灯闪2s
		MOV		SECOND1,#2			;东西路口计时显示初值2s
		MOV		SECOND2,#2			;南北路口计时显示初值2s
		LCALL	DISPLAY
WAIT3:	LCALL	STATE3				;调用状态3
		JNB		TF0,WAIT3			;查询100ms到否
		CLR		TF0
		MOV		TH0,#3CH			;恢复T0定时初值100ms
		MOV		TL0,#0B0H
		DJNZ	R2,WAIT3			;判断1s到否?未到继续状态3
		MOV		R2,#20				;置100ms计数初值
		DEC		SECOND1				;东西路口显示时间减1s
		DEC		SECOND2				;南北路口显示时间减1s
		LCALL	DISPLAY
		DJNZ	R3,WAIT3			;状态3维持2s
;*******************************************
		MOV		R2,#20				;置50ms计数初值
		MOV		R3,#20				;红灯闪20s
		MOV		SECOND1,#25			;东西路口计时显示初值25s
		MOV		SECOND2,#25			;南北路口计时显示初值25s
		LCALL	DISPLAY
WAIT4:	LCALL	STATE4				;调用状态4
		JNB		TF0,WAIT4			;查询100ms到否
		CLR		TF0
		MOV		TH0,#3CH			;恢复T0定时初值100ms
		MOV		TL0,#0B0H
		DJNZ	R2,WAIT4			;判断1s到否?未到继续状态4
		MOV		R2,#20				;置100ms计数初值
		DEC		SECOND1				;东西路口显示时间减1s
		DEC		SECOND2				;南北路口显示时间减1s
		LCALL	DISPLAY
		DJNZ	R3,WAIT4			;状态4维持20s
;*******************************************
		MOV		R2,#5				;置50ms计数初值
		MOV		R4,#4				;红灯闪20ms
		MOV		R3,#3				;绿灯闪3s
		MOV		SECOND1,#5			;东西路口计时显示初值5s
		MOV		SECOND2,#5			;南北路口计时显示初值5s
		LCALL	DISPLAY
WAIT5:	LCALL	STATE5				;调用状态5
		JNB		TF0,WAIT5			;查询100ms到否
		CLR		TF0
		MOV		TH0,#3CH			;恢复T0定时初值100ms
		MOV		TL0,#0B0H				
		DJNZ	R4,WAIT5			;判断200ms到否?未到继续状态5
		CPL		LED_G2				;南北绿灯闪
		MOV		R4,#4				;闪烁200ms
		DJNZ	R2,WAIT5			;判断1s到否?未到继续状态5
		MOV		R2,#5				;置100ms计数初值
		DEC		SECOND1				;东西路口显示时间减1s
		DEC		SECOND2				;南北路口显示时间减1s
		LCALL	DISPLAY
		DJNZ	R3,WAIT5			;状态5维持3s
;****************************************
		MOV		R2,#20				;置50ms计数初值
		MOV		R3,#2				;红灯闪2s
		MOV		SECOND1,#2			;东西路口计时显示初值2s
		MOV		SECOND2,#2			;南北路口计时显示初值2s
		LCALL	DISPLAY
		WAIT6:	LCALL	STATE6		;调用状态6
		JNB		TF0,WAIT6			;查询100ms到否
		CLR		TF0	
		MOV		TH0,#3CH			;恢复T0定时初值100ms
		MOV		TL0,#0B0H
		DJNZ	R2,WAIT6			;判断1s到否?未到继续状态6
		MOV		R2,#20				;置100ms计数初值
		DEC		SECOND1				;东西路口显示时间减1s
		DEC		SECOND2				;南北路口显示时间减1s
		LCALL	DISPLAY
		DJNZ	R3,WAIT6			;状态6维持2s
		LJMP	LOOP				;大循环
;**********************************************
STATE1:								;状态1
		SETB	LED_G1				;东西路口绿灯亮
		CLR		LED_Y1
		CLR		LED_R1
		CLR		LED_G2
		CLR		LED_Y2
		SETB	LED_R2				;南北路口红灯亮
		RET
STATE2:								;状态2
		CLR		LED_Y1
		CLR		LED_R1
		CLR		LED_G2
		CLR		LED_Y2
		SETB	LED_R2				;南北路口红灯亮
		RET
STATE3:								;状态3
		CLR		LED_G1
		CLR		LED_R1
		CLR		LED_G2
		CLR		LED_Y2
		SETB	LED_R2				;南北路口红灯亮
		SETB	LED_Y1				;东西路口绿灯亮
		RET
STATE4:								;状态4
		CLR		LED_G1
		CLR		LED_Y1
		SETB	LED_R1				;东西路口红灯亮
		SETB	LED_G2				;南北路口绿灯亮
		CLR		LED_Y2
		CLR		LED_R2
		RET
STATE5:								;状态5
		CLR		LED_G1
		CLR		LED_Y1
		SETB	LED_R1				;东西路口红灯亮
		CLR		LED_Y2
		CLR		LED_R2
		RET
STATE6:								;状态6
		CLR		LED_G1
		CLR		LED_Y1
		SETB	LED_R1				;东西路口红灯亮
		CLR		LED_G2
		CLR		LED_R2
		SETB	LED_Y2				;南北路口红灯亮
		RET
DISPLAY:							;数码显示
		MOV		A,SECOND1			;东西路口计时寄存器
		MOV		B,#10				;16进制数拆成两个10进制数
		DIV		AB
		MOV		DBUF+3,A
		MOV		A,B
		MOV		DBUF+2,A
		MOV		A,SECOND2			;南北路口计时寄存器
		MOV		B,#10				;16进制数拆成两个10进制数
		DIV		AB
		MOV		DBUF+1,A
		MOV		A,B
		MOV		DBUF,A
		MOV		R0,#DBUF
		MOV		R1,#TEMP
		MOV		R7,#4
DP10:	MOV		DPTR,#LEDMAP
		MOV		A,@R0
		MOVC	A,@A+DPTR
		MOV		@R1,A
		INC		R0
		INC		R1
		DJNZ	R7,DP10
		MOV		R0,#TEMP
		MOV		R1,#4
DP12:	MOV		R7,#8
		MOV		A,@R0
DP13:	RLC		A
		MOV		P3.0,C
		CLR		P3.1
		SETB	P3.1
		DJNZ	R7,DP13
		INC		R0
		DJNZ	R1,DP12
		RET
LEDMAP:
		DB	3FH,06H,5BH,4FH,66H,6DH		;0,1,2,3,4,5
		DB	7DH,07H,7FH,6FH,77H,7CH		;6,7,8,9,A,B
		DB	58H,5EH,7BH,71H,0,40H		;C,D,E,F, ,-
		END

⌨️ 快捷键说明

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