51汇编实现交通灯设计

47a8184a046c44ff9b2838bb33fbb11d.jpg

 

基于仿真文件电路图结尾有设计的汇编代码

实验代码:12MHZ晶振

ORG 0000H
AJMP START
ORG 0003H     ;外部中断来临
AJMP URGENCY;紧急情况处理
ORG 000BH
AJMP TIMING
START:MOV TMOD,#01H ;T0定时器
MOV TH0,#3CH   ;定时50ms
MOV TL0,#0B0H    ;定时50ms
MOV R0,#00H
MOV R1,#03H  ;南北晶体管
MOV R2,#05H ;东西晶体管
MOV R3,#40;紧急情况T1定时器实现25ms×40=1秒
MOV R4,#06H    ;紧急6S
SETB P3.2
MOV P1,#00H;高三位东西红黄绿,低三位南北红黄绿
SETB ET0;开内部TF0中断
SETB EX0;开外部IE0中断
SETB EA
SETB PX0;设置高一级中断
AJMP MAIN
MAIN:
SETB TR0;启动计时器
ACALL LOOP1  ;东西红灯,南北绿灯
SETB TR0;启动计时器
ACALL LOOP2   ;东西红灯,南北黄灯
SETB TR0;启动计时器
ACALL LOOP3   ;东西绿灯,南北红灯
SETB TR0;启动计时器
ACALL LOOP4   ;东西黄灯,南北红灯
SJMP MAIN     ;回到循环
LOOP1:
CJNE R0,#20,LOOP11      ;50MS*20=1S,够1S顺序执行
MOV R0,#00H            ;对R0清零,为下次计时1S做准备
DEC R1                 ;南北送显时间-1
DEC R2                 ;东西送显时间-1
CJNE R1,#00H,LOOP1      ;判断南北绿灯是否结束
CLR TR0                 ;停止计数器
MOV R1,#02H           ;下个状态黄灯2S
RET                   ;回到主程序
LOOP11:
MOV P1,#14H            ;东西红灯,南北绿灯
ACALL DISPLAY           ;数码管显示
AJMP LOOP1

LOOP2:
CJNE R0,#20,LOOP21
MOV R0,#00H
DEC R1
DEC R2
CJNE R1,#00H,LOOP2       ; 判断南北黄灯2S是否结束
CLR TR0
MOV R1,#05H                ;下个状态南北红灯
MOV R2,#03H                ;下个状态东西绿灯3S
RET
LOOP21:
MOV P1,#0CH    ;东西红灯,南北黄灯
ACALL DISPLAY
AJMP LOOP2

LOOP3:
CJNE R0,#20,LOOP31
MOV R0,#00H
DEC R1
DEC R2
CJNE R1,#02H,LOOP3
MOV R2,#02H
RET
LOOP31:
MOV P1,#22H     ;东西绿灯,南北红灯
ACALL DISPLAY
AJMP LOOP3

LOOP4:
CJNE R0,#20,LOOP41
MOV R0,#00H
DEC R1
DEC R2
CJNE R1,#00H,LOOP4
MOV R1,#03H
MOV R2,#05H
RET
LOOP41:
MOV P1,#21H   ; 东西黄灯,南北红灯
ACALL DISPLAY
AJMP LOOP4
;紧急情况处理

URGENCY:
CLR TR0
MOV A,P1
PUSH A     ;保护现场
MOV A,TH0
PUSH A
MOV A,TL0
PUSH A
MOV A,TMOD
PUSH A
MOV A,R2
PUSH  A  
MOV A,R1
PUSH A
MOV A,R0
PUSH A    ;保护现场
MOV A,R4    ;将R4紧急秒数送显
MOV R1,A
MOV R2,A
MOV TMOD,#10H ;T1定时器,方式一
MOV TH1,#9EH   ;定时25ms
MOV TL1,#50H    ;定时25ms
SETB TR1
WAIT:JBC TF1,URG1
MOV P1,#24H;两个红灯
ACALL  DISPLAY
SJMP WAIT
URG1:
MOV TH1,#9EH   ;定时25ms,赋初值
MOV TL1,#50H    ;定时25ms,赋初值
DEC R3
CJNE R3,#00H,WAIT
MOV R3,#40
DEC R4
MOV A,R4
MOV R1,A
MOV R2,A
CJNE R4,#00H,WAIT
MOV R3,#40
MOV R4,#06H
POP A
MOV R0,A
POP A    ; 恢复中断前
MOV R1,A
POP A    
MOV R2,A
POP A
MOV TMOD,A
POP A
MOV TL0,A
POP A
MOV TH0,A
POP A
MOV P1,A    ;恢复中断前
SETB TR0     ;启动T0计时器
RETI         ;返回中断前位置

;正常情况计时器中断跳转

TIMING:

INC R0

MOV TH0,#3CH ;重装

MOV TL0,#0B0H ;

RETI

;送显函数

DISPLAY:

MOV 60H,R1;南北晶体管放在60H

MOV 61H,R2;东西晶体管放在61H

MOV DPTR,#8002H

MOV A,#04H;选择南北晶体管位置

MOVX @DPTR,A

MOV DPTR,#TAB

MOV A,60H;

DEC A

MOVC A,@A+DPTR

MOV DPTR,#8004H

MOVX @DPTR,A

ACALL DELAY

MOV DPTR,#8002H

MOV A,#01H;选择东西晶体管位置

MOVX @DPTR,A

MOV DPTR,#TAB

MOV A,61H;

DEC A

MOVC A,@A+DPTR

MOV DPTR,#8004H

MOVX @DPTR,A

ACALL DELAY

RET

;延时程序,时间R6×(R7×2)×一个机器周期,若出现鬼影,适当增加一下延时时间

DELAY:

MOV R6,#2

L1:MOV R7,#250

DJNZ R7,$

DJNZ R6,L1

 RET

;数码管段码表

TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;共阴数码管0-9显示

;TAB: DB 0C0H 0F9H 0A4H 0B0H 99H 92H 82H 0F8H 80H 90H ;共阳数码管0-9显示

 

 

使用伟福编译器,设置如下:

08daee9c7782474a82a00d5000558234.png

 

proteus仿真文件:

https://share.weiyun.com/RRviPhOM

 

 

  • 26
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值