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

📄 trafficlight.asm

📁 《PIC单片机应用开发典型模块》源代码及图片
💻 ASM
字号:
;-----------------------------------
;                   交通灯控制器实例
;功能:使用6只LED模拟交通灯控制器
;-----------------------------------
SOUTH_RED			EQU		P1.0
SOUTH_YELLOW		EQU		P1.1
SOUTH_GREEN		EQU		P1.2
EAST_RED			EQU		P1.3
EAST_YELLOW		EQU		P1.4
EAST_GREEN			EQU		P1.5
SECOND_FLAG		BIT		00H
TIME_COUNT0		DATA	30H
TIME_COUNT1		DATA	31H
STATUS_FLAG		DATA	32H
SECOND_COUNT		DATA	33H

ORG	0000H				;伪指令,指定程序从0000H开始存放
LJMP	MAIN				;跳转指令,程序跳转到MAIN处
ORG	000BH				;伪指令,指定程序从T0入口地址000BH开始存放
LJMP	T0_INT				;跳转指令,程序跳转到T0_INT处

ORG	0100H
MAIN:
	MOV	SP,#60H			;给堆栈指针赋初值
	LCALL	INIT				;调用状态初始化子程序
	LCALL	T0_INIT			;调用定时器中断初始化子程序
LOOP:
	JNB		SECOND_FLAG,LOOP	;根据SECOND_FLAG值判断0.5秒是否到
	LCALL	STATUS_CHANGE		;每0.5秒调用交通灯状态转换子程序
	CLR		SECOND_FLAG		;清零SECOND_FLAG
	SJMP	LOOP				;跳转,程序继续

STATUS_CHANGE:
;---------------------------------
;     交通灯状态转换子程序
;---------------------------------
	MOV	A,STATUS_FLAG		;根据STATUS_FLAG值进行散转
	ADD		A,STATUS_FLAG
	MOV	DPTR,#STATUS_PROC_TABLE
	JMP		@A+DPTR
STATUS_PROC_TABLE:
	AJMP	STATUS1
	AJMP	STATUS2
	AJMP	STATUS3
	AJMP	STATUS4
	AJMP	STATUS5
	AJMP	STATUS6

STATUS1:
;---------------------------------
;     散转子程序1
;状态1:南北绿灯,东西红灯,持续20秒
;然后转到状态2
;---------------------------------
	DJNZ	SECOND_COUNT,STATUS1_EXIT
	MOV	SECOND_COUNT,#6		;20秒定时到,转换到状态2
	MOV	STATUS_FLAG,#01H
STATUS1_EXIT:
	RET

STATUS2:
;---------------------------------
;     散转子程序2
;状态2:南北绿灯闪,东西红灯,持续3秒
;然后转到状态3
;---------------------------------
	DJNZ	SECOND_COUNT,STATUS2_EXIT
	MOV	SECOND_COUNT,#4		;3秒定时到,转换到状态3
	MOV	STATUS_FLAG,#02H
	SETB	SOUTH_RED			;南北红灯灭
	CLR		SOUTH_YELLOW		;南北黄灯亮
	SETB	SOUTH_GREEN		;南北绿灯灭
	CLR		EAST_RED			;东西红灯亮
	SETB	EAST_YELLOW		;东西黄灯灭
	SETB	EAST_GREEN			;东西绿灯灭
	RET
STATUS2_EXIT:
	CPL		SOUTH_GREEN		;南北绿灯闪
	RET

STATUS3:
;---------------------------------
;     散转子程序3
;状态3:南北黄灯,东西红灯 ,持续2秒
;然后转到状态4
;---------------------------------
	DJNZ	SECOND_COUNT,STATUS3_EXIT
	MOV	SECOND_COUNT,#40	;2秒定时到,转换到状态4
 	MOV	STATUS_FLAG,#03H
	CLR		SOUTH_RED			;南北红灯亮
	SETB	SOUTH_YELLOW		;南北黄灯灭
	SETB	SOUTH_GREEN		;南北绿灯灭
	SETB	EAST_RED			;东西红灯灭
	SETB	EAST_YELLOW		;东西黄灯灭
	CLR		EAST_GREEN			;东西绿灯亮
STATUS3_EXIT: 
	RET

STATUS4:
;---------------------------------
;     散转子程序4
;状态4:南北红灯,东西绿灯,持续20秒
;然后转到状态5
;---------------------------------                        
	DJNZ	SECOND_COUNT,STATUS4_EXIT
	MOV	SECOND_COUNT,#6		;20秒定时到,转换到状态5
	MOV	STATUS_FLAG,#04H
STATUS4_EXIT:
	RET

STATUS5:
;---------------------------------
;     散转子程序5
;状态5:南北红灯,东西绿灯闪,持续3秒
;然后转到状态6
;---------------------------------
	DJNZ	SECOND_COUNT,STATUS5_EXIT
	MOV	SECOND_COUNT,#4		;3秒定时到,转换到状态6
	MOV	STATUS_FLAG,#05H
	CLR		SOUTH_RED			;南北红灯亮
	SETB	SOUTH_YELLOW		;南北黄灯灭
	SETB	SOUTH_GREEN		;南北绿灯灭
	SETB	EAST_RED			;东西红灯灭
	CLR		EAST_YELLOW		;东西黄灯亮
	SETB	EAST_GREEN			;东西绿灯灭
	RET
STATUS5_EXIT:
	CPL		EAST_GREEN			;东西绿灯闪
	RET

STATUS6:
;---------------------------------
;     散转子程序6
;状态6:南北红灯,东西黄灯 ,持续2秒
;然后转到状态1
;---------------------------------
	DJNZ	SECOND_COUNT,STATUS6_EXIT
	MOV	SECOND_COUNT,#40	;2秒定时到,转换到状态1
	MOV	STATUS_FLAG,#00H
	SETB	SOUTH_RED			;南北红灯灭
	SETB	SOUTH_YELLOW		;南北黄灯灭
	CLR		SOUTH_GREEN		;南北绿灯亮
	CLR		EAST_RED			;东西红灯亮
	SETB	EAST_YELLOW		;东西黄灯灭
	SETB	EAST_GREEN			;东西绿灯灭
STATUS6_EXIT:
	RET

INIT:
;---------------------------------
;     状态初始化子程序
;---------------------------------
	SETB	SOUTH_RED			;南北红灯灭
	SETB	SOUTH_YELLOW		;南北黄灯灭
	CLR		SOUTH_GREEN		;南北绿灯亮
	CLR		EAST_RED			;东西红灯亮
	SETB	EAST_YELLOW		;东西黄灯灭
	SETB	EAST_GREEN			;东西绿灯灭
	MOV	TIME_COUNT0,#250		;变量TIME_COUNT0赋初值250
	MOV	TIME_COUNT1,#8		;变量TIME_COUNT1赋初值8
	MOV	SECOND_COUNT,#40	;变量SECOND_COUNT赋初值40
	MOV	STATUS_FLAG,#00H		;变量STATUS_FLAG赋初值00H
	CLR		SECOND_FLAG		;清零位变量SECOND_FLAG
	RET

T0_INT:
;---------------------------------
;     T0中断服务程序
;每0.5秒置一SECOND_FLAG
;---------------------------------
	DJNZ	TIME_COUNT0,T0_INT_EXIT
	MOV	TIME_COUNT0,#250
 	DJNZ	TIME_COUNT1,T0_INT_EXIT
	MOV	TIME_COUNT1,#8
	SETB	SECOND_FLAG		;定时0.5秒到,置一SECOND_FLAG
T0_INT_EXIT:
	RETI

T0_INIT:
;---------------------------------
;     定时器T0的初始化
;---------------------------------
	MOV	TMOD,#00000010B		;定时器T0工作在方式2
	MOV	TL0,#06H				;设定定时器T0的初始值
	MOV	TH0,#06H				;设定定时器T0的自动重装入值
	MOV	TCON,#00010000B		;定时器T0使能
	SETB	EA					;中断允许总控制位使能
	SETB	ET0					;T0中断使能
	RET

END

⌨️ 快捷键说明

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