单片机交通灯(正常)汇编代码实现

1.设计要求

(1)红灯和绿灯相互转换经过黄灯,并且黄灯5秒,绿灯倒数闪烁;
(2)南北东西都是25秒(包含黄灯5秒),先南北通行,后东西通行;
2.仿真原理整体图
在这里插入图片描述
黄灯5秒倒数
3.代码
在这里插入图片描述

//变量定义
		REDTIME	EQU 30H
		GREENTIME EQU 31H
//程序起点
		ORG 0000H
		LJMP MAIN
		ORG 000BH
		LJMP COUNTTIME ;定时器0中断
		ORG 0003H
		LJMP CHANMODE ;外部中断0
//主程序
		ORG 0100H
MAIN:
;1.启动检查
;2.初始化定时器0、外部中断
		MOV TMOD,#01H	   	;采用方式1
		MOV TH0,#0ECH	   	;定时5ms的定时常数
		MOV TL0,#76H
		SETB TR0		   	;启动定时器
		SETB ET0		   	;允许定时器中断
		SETB EX0			;允许外部中断
		SETB IT0			;下降沿触发方式
		SETB EA			   	;开启CPU中断
;3.定义变量初值
		MOV R0,#0
		MOV REDTIME,#25		;红灯起始25s
		MOV GREENTIME,#20	;绿灯起始20s
		MOV P0,#0FFH		;数码管全不亮
		MOV P2,#00H			;共阴数码管每段都不亮
		MOV P1,#00H			;每个发光二极管都不亮

		MOV R1,GREENTIME		;R1储存实时变化的南北时间
		MOV R2,REDTIME	;R2储存实时变化的东西时间

		SETB P1.0			;初始状态,南北绿灯亮
		SETB P1.5			;初始状态,东西红灯亮
		MOV R3,#1			;记录运行的阶段
		MOV R4,#0			;记录数码管位选信号	
		MOV R5,#0			;记录绿灯闪烁次数
		MOV R7,#0			;记录工作模式0为正常运行,1为设置模式	
;4.开始LED和SEG开始倒计时工作
LOOP:	CJNE R7,#1,WORK		;进行模式判断
		LCALL SETMODE		;R7=1,则进入设置模式
		JMP LOOP			;进行模式判断的循环

WORK:	CJNE R0,#200,LOOP	;工作模式
		MOV R0,#0			;R0=200则为1s进行倒计时时间的变化
		DEC R1
		DEC R2
		LCALL TWINKGREEN	;绿灯闪烁子程序(判断绿灯是否闪烁,是否执行闪烁)
		LCALL  STAGECHAN	;运行的阶段的判断,即一个阶段的倒计时完成之后,重新赋值
		JMP LOOP

//-----定时器0中断用于定时-----
		ORG 0300H
COUNTTIME:
		MOV TH0,#0ECH
		MOV TL0,#76H		;定时器重装	
		CJNE R7,#0,STEPR0	
		INC R0				;R0记录中断执行的次数,每执行一次加1
STEPR0:	INC R4				;R4为片选信号
		CJNE R4,#8,TODISP
		MOV R4,#0
TODISP:	LCALL DISPSEG		;根据数码管的片选信号进行显示
DONTIME:RETI

//-----外部中断0,用于模式改变-----
		ORG 0400H
CHANMODE:
		INC R7
		CJNE R7,#2,REINIT
		MOV R7,#0

REINIT:	MOV R2,#0			 ;标志位清零,一切从头开始
		MOV R3,#1			
		MOV R4,#0				
		MOV R5,#0
		MOV R1,GREENTIME
		MOV R2,REDTIME
		MOV P1,#00H
		SETB P1.0
		SETB P1.5
DONSTOP:RETI

//-----子程序-----------------------------------
;0 设置模式
SETMODE:								
CHECKEY:JB P3.3,CKEYDO
		LCALL DELAY50
		LCALL DELAY50  ;延时,消抖
WTKUP:	JB P3.3,FINUP
		JMP WTKUP	   ;等待按键弹起
FINUP:	LCALL INCTIME  ;完成按键的一次动作之后进行秒数的增加
		JMP DONSET

CKEYDO:	JB P3.4,DONSET
		LCALL DELAY50
		LCALL DELAY50  ;延时消抖
WTKUP2:	JB P3.4,FINDON ;等待按键弹起
		JMP WTKUP2	   ; 完成按键的一次动作之后进行秒数的减少
FINDON:	LCALL DECTIME
DONSET:	
		MOV R1,GREENTIME
		MOV R2,REDTIME 
		RET

;0.1设置模式时间减
INCTIME:MOV A,GREENTIME
		CJNE A,#90,INCON  ;最高绿灯时间为90s(红灯95s)
		JMP DONINC
INCON:	ADD A,#5
		MOV GREENTIME,A
		MOV A,REDTIME
		ADD A,#5
		MOV REDTIME,A
		MOV R1,GREENTIME
		MOV R2,REDTIME
DONINC: 
		MOV R1,GREENTIME
		MOV R2,REDTIME 
		RET
;0.2设置模式时间加			
DECTIME:MOV A,GREENTIME
		CJNE A,#10,DECON  ;最低绿灯时间为10s(红灯15s)
		JMP DONDEC
DECON:	SUBB A,#5
		MOV GREENTIME,A
		MOV A,REDTIME
		SUBB A,#5
		MOV REDTIME,A
		MOV R1,GREENTIME
		MOV R2,REDTIME
DONDEC:	RET
;DELAY50MS子程序(50ms)
DELAY50:MOV R6,#200
H2:		MOV R0,#125
H1:		DJNZ R0,H1
		DJNZ R6,H2
		RET
;1.绿灯闪烁子程序
TWINKGREEN:
		CJNE R3,#1,TOTAG3
		CJNE R1,#3,DONTWINK
WT1:	CJNE R0,#100,WT1
		MOV R0,#0
		CPL P1.0
		INC R5
		CJNE R5,#2,WT1
		MOV R5,#0
		DEC R1
		DEC R2
		CJNE R1,#0,WT1
		JMP DONTWINK		

TOTAG3:	CJNE R3,#3,DONTWINK
		CJNE R2,#3,DONTWINK
WT2:	CJNE R0,#100,WT2
		MOV R0,#0
		CPL P1.3
		INC R5
		CJNE R5,#2,WT2
		MOV R5,#0
		DEC R1
		DEC R2
		CJNE R2,#0,WT2
DONTWINK:RET
;2.运行阶段的判断与倒计时重新赋值子程序
STAGECHAN:		
		CJNE R1,#0,COMR2	;检查东西南北的倒计时是否为0,计数运行阶段
		JMP INCR3
COMR2:	CJNE R2,#0,DONESTAGE;都不为0,没有阶段的变化
INCR3:	INC R3

		CJNE R3,#5,STAGE1
		MOV R3,#1

STAGE1:	CJNE R3,#2,STAGE2
		MOV R1,#5
		CPL P1.0		   	;南北绿灯灭,黄灯亮
		CPL P1.1

STAGE2:	CJNE R3,#3,STAGE3
		MOV R1,REDTIME
		MOV R2,GREENTIME
		CPL P1.1
		CPL P1.2			;南北黄灯灭红灯亮
		CPL P1.5			;东西红灯灭,绿灯亮
		CPL P1.3
STAGE3:	CJNE R3,#4,STAGE4
		MOV R2,#5
		CPL P1.3
		CPL P1.4			;东西绿灯灭,黄灯亮
STAGE4:	CJNE R3,#1,DONESTAGE
		MOV R1,GREENTIME
		MOV R2,REDTIME
		CPL P1.4
		CPL P1.5			;东西黄灯灭,绿灯亮
		CPL P1.0   			;南北红灯灭,绿灯亮
		CPL P1.2
		CPL P
DONESTAGE:RET
  • 4
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值