51单片机模拟交通灯

利用51单片机的控制二极管及数码管的显示来模拟交通灯,系统晶振为11.0592MHZ,东西方向红灯设置为30秒,南北方向红灯设置为20 秒,P1.3接一个应急按钮,按下第一次放开,南北方向绿灯一直亮,东西方向红灯一直亮(目的是为了方便大领导通行),按下放开第二次,南北绿灯闪3秒黄灯亮2秒后变红灯,东西方向变为绿灯,之后沿着之前的设置一直循环,下面是仿真图、程序源代码

仿真图

程序源代码如下:
作者:胡琴
联系qq:1257394091
网站:http://www.51hei.com 

本程序已经通过软件仿真以及在自己搭建的硬件上测试通过.
org 0000h
ajmp main
org 000bh
ajmp inti0
org 0030h
main:mov tmod,#01h
     mov ie,#82h
  mov th0,#4ch 
  mov tl0,#00h
  mov sp,#60h
  mov 31h,#30  ;东西绿灯初值30秒
  mov 32h,#30  ;南北红灯初值30秒
  clr 4fh  ;清标志位
  clr p1.1 ;开东西绿灯
  clr p1.5 ;开南北红灯
  setb tr0 ;启动T0
loop:lcall display  ;调用显示子程序
     lcall key   ;调用应急按键判断
     ajmp loop
inti0:push psw
      clr ea
   mov th0,#4ch
   mov tl0,#00h
   inc 35h
   mov a,35h
   cjne a,#20,out  ;判1秒是否到时
   mov 35h,#00
   jb 4fh,yi   ;判别标志位
   dec 31h ;东西时间每秒减1
   dec 32h ;南北时间每秒减1
   mov a,31h
   cjne a,#05,out ;判是否到25秒
   setb p2.0  ;到25秒关时间显示
   setb p2.1 
   setb p1.1   ;东西绿灯闪灭3秒
  lcall del500ms 
  clr p1.1
  lcall del500ms
  setb p1.1
  lcall del500ms
  clr p1.1
  lcall del500ms
  setb p1.1
     lcall del500ms
  clr p1.1
  lcall del500ms
  setb p1.1   ;灭东西绿灯
  sjmp er
out:setb ea
    pop psw
 reti 
  er:clr p1.2  ;东西黄灯亮2秒
  mov 33h,#4   ;延时2秒
loop1:lcall del500ms
      djnz 33h,loop1
   setb p1.2   ;2秒后灭东西黄灯
   clr p2.0  ;5秒后开时间显示
   clr p2.1
   mov 31h,#20   ;东西时间赋20秒初值
      mov 32h,#20 ;南北时间赋20秒初值
   setb 4fh
   setb p1.5  ;关南北红灯
   clr p1.0  ;点亮东西红灯
      clr p1.6  ;点亮南北绿灯
   sjmp out
   yi:dec 31h ;东西时间每秒减1
   dec 32h ;南北时间每秒减1
   mov a,31h
   cjne a,#5,out  ;判是否到15秒
   setb p2.6    ;到15秒关时间显示
   setb p2.7    ;
   setb p1.6  ;南北绿灯闪灭3秒
  lcall del500ms
  clr p1.6
  lcall del500ms
  setb p1.6
  lcall del500ms
  clr p1.6
  lcall del500ms
  setb p1.6
     lcall del500ms
  clr p1.6
  lcall del500ms
   setb p1.6    ;关南北绿灯
   clr p1.7   ;南北黄灯亮2秒
  mov 34h,#4   ;延时2秒
loop2:lcall del500ms
      djnz 34h,loop2
   setb p1.7   ;2秒后灭南北黄灯
   clr p2.6 ;5秒后开时间显示
   clr p2.7 ;
   mov 31h,#30 ;东西时间重赋30秒初值
   mov 32h,#30 ;南北时间重赋30秒初值
   clr p1.1    ;点亮东西绿灯
   clr p1.5    ;点亮南北红灯
   setb p1.0    ;关东西红灯
   clr 4fh
   sjmp out
display:mov a,31h  ;东西方向时间显示
        mov b,#10
  div ab
  mov 20h,a
  mov 21h,b
  disp1:mov a,20h
        mov dptr,#table
  movc a,@a+dptr
  mov p0,a
  clr p2.0
  lcall del1ms
  setb p2.0
  disp2:mov a,21h
        mov dptr,#table
  movc a,@a+dptr
  mov p0,a
  clr p2.1
  lcall del1ms
  setb p2.1
  disp3:mov a,32h   ;南北方向时间显示
  mov b,#10
  div ab
  mov 22h,a
  mov 23h,b
  disp4:mov a,22h
        mov dptr,#table
  movc a,@a+dptr
  mov p3,a
  clr p2.6
  lcall del1ms
  setb p2.6
  disp5:mov a,23h
        mov dptr,#table
  movc a,@a+dptr
  mov p3,a
  clr p2.7
  lcall del1ms
  setb p2.7
  ret
table:db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h   ;0-9数字 
del1ms:mov r7,#10   ;1ms延时子程序
d1:mov r6,#50
   djnz r6,$
   djnz r7,d1
   ret
del500ms:mov r5,#5  ;500ms延时子程序
del3:mov r4,#200
del4:mov r3,#250
     djnz r3,$
  djnz r4,del4
  djnz r5,del3
  ret
key:jb p1.3,keyout
    jnb p1.3,$
 clr ea
 inc 36h
 mov a,36h
 cjne a,#2,key4
 mov 36h,#00
   setb p1.6   ;东西绿灯闪灭3秒
  lcall del500ms 
  clr p1.6
  lcall del500ms
  setb p1.6
  lcall del500ms
  clr p1.6
  lcall del500ms
  setb p1.6
     lcall del500ms
  clr p1.6
  lcall del500ms
  setb p1.6   ;灭东西绿灯
  clr p1.7  ;东西黄灯亮2秒
  mov 33h,#4   ;延时2秒
loop3:lcall del500ms
      djnz 33h,loop3
   setb p1.7   ;2秒后灭东西黄灯
   setb p1.0   ;关东西红灯
   setb p1.6  ;关南北绿灯
   clr p1.1  ;开西绿灯
   clr p1.5  ;开南北红灯
   setb ea
   sjmp keyout
key4:clr p1.6 ;;开南北绿灯
     clr p1.0   ;开东西红灯
  setb p1.1
  setb p1.2
  setb p1.3
  setb p1.4
  setb p1.5
  setb p1.7
 keyout:ret
end

利用51单片机的控制二极管及数码管的显示来模拟交通灯,系统晶振为11.0592MHZ,东西方向红灯设置为30秒,南北方向红灯设置为20 秒,P1.3接一个应急按钮,按下第一次放开,南北方向绿灯一直亮,东西方向红灯一直亮(目的是为了方便大领导通行),按下放开第二次,南北绿灯闪3秒黄灯亮2秒后变红灯,东西方向变为绿灯,之后沿着之前的设置一直循环,下面是仿真图、程序源代码

仿真图

程序源代码如下:
作者:胡琴
联系qq:1257394091
网站:http://www.51hei.com 

本程序已经通过软件仿真以及在自己搭建的硬件上测试通过.
org 0000h
ajmp main
org 000bh
ajmp inti0
org 0030h
main:mov tmod,#01h
     mov ie,#82h
  mov th0,#4ch 
  mov tl0,#00h
  mov sp,#60h
  mov 31h,#30  ;东西绿灯初值30秒
  mov 32h,#30  ;南北红灯初值30秒
  clr 4fh  ;清标志位
  clr p1.1 ;开东西绿灯
  clr p1.5 ;开南北红灯
  setb tr0 ;启动T0
loop:lcall display  ;调用显示子程序
     lcall key   ;调用应急按键判断
     ajmp loop
inti0:push psw
      clr ea
   mov th0,#4ch
   mov tl0,#00h
   inc 35h
   mov a,35h
   cjne a,#20,out  ;判1秒是否到时
   mov 35h,#00
   jb 4fh,yi   ;判别标志位
   dec 31h ;东西时间每秒减1
   dec 32h ;南北时间每秒减1
   mov a,31h
   cjne a,#05,out ;判是否到25秒
   setb p2.0  ;到25秒关时间显示
   setb p2.1 
   setb p1.1   ;东西绿灯闪灭3秒
  lcall del500ms 
  clr p1.1
  lcall del500ms
  setb p1.1
  lcall del500ms
  clr p1.1
  lcall del500ms
  setb p1.1
     lcall del500ms
  clr p1.1
  lcall del500ms
  setb p1.1   ;灭东西绿灯
  sjmp er
out:setb ea
    pop psw
 reti 
  er:clr p1.2  ;东西黄灯亮2秒
  mov 33h,#4   ;延时2秒
loop1:lcall del500ms
      djnz 33h,loop1
   setb p1.2   ;2秒后灭东西黄灯
   clr p2.0  ;5秒后开时间显示
   clr p2.1
   mov 31h,#20   ;东西时间赋20秒初值
      mov 32h,#20 ;南北时间赋20秒初值
   setb 4fh
   setb p1.5  ;关南北红灯
   clr p1.0  ;点亮东西红灯
      clr p1.6  ;点亮南北绿灯
   sjmp out
   yi:dec 31h ;东西时间每秒减1
   dec 32h ;南北时间每秒减1
   mov a,31h
   cjne a,#5,out  ;判是否到15秒
   setb p2.6    ;到15秒关时间显示
   setb p2.7    ;
   setb p1.6  ;南北绿灯闪灭3秒
  lcall del500ms
  clr p1.6
  lcall del500ms
  setb p1.6
  lcall del500ms
  clr p1.6
  lcall del500ms
  setb p1.6
     lcall del500ms
  clr p1.6
  lcall del500ms
   setb p1.6    ;关南北绿灯
   clr p1.7   ;南北黄灯亮2秒
  mov 34h,#4   ;延时2秒
loop2:lcall del500ms
      djnz 34h,loop2
   setb p1.7   ;2秒后灭南北黄灯
   clr p2.6 ;5秒后开时间显示
   clr p2.7 ;
   mov 31h,#30 ;东西时间重赋30秒初值
   mov 32h,#30 ;南北时间重赋30秒初值
   clr p1.1    ;点亮东西绿灯
   clr p1.5    ;点亮南北红灯
   setb p1.0    ;关东西红灯
   clr 4fh
   sjmp out
display:mov a,31h  ;东西方向时间显示
        mov b,#10
  div ab
  mov 20h,a
  mov 21h,b
  disp1:mov a,20h
        mov dptr,#table
  movc a,@a+dptr
  mov p0,a
  clr p2.0
  lcall del1ms
  setb p2.0
  disp2:mov a,21h
        mov dptr,#table
  movc a,@a+dptr
  mov p0,a
  clr p2.1
  lcall del1ms
  setb p2.1
  disp3:mov a,32h   ;南北方向时间显示
  mov b,#10
  div ab
  mov 22h,a
  mov 23h,b
  disp4:mov a,22h
        mov dptr,#table
  movc a,@a+dptr
  mov p3,a
  clr p2.6
  lcall del1ms
  setb p2.6
  disp5:mov a,23h
        mov dptr,#table
  movc a,@a+dptr
  mov p3,a
  clr p2.7
  lcall del1ms
  setb p2.7
  ret
table:db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h   ;0-9数字 
del1ms:mov r7,#10   ;1ms延时子程序
d1:mov r6,#50
   djnz r6,$
   djnz r7,d1
   ret
del500ms:mov r5,#5  ;500ms延时子程序
del3:mov r4,#200
del4:mov r3,#250
     djnz r3,$
  djnz r4,del4
  djnz r5,del3
  ret
key:jb p1.3,keyout
    jnb p1.3,$
 clr ea
 inc 36h
 mov a,36h
 cjne a,#2,key4
 mov 36h,#00
   setb p1.6   ;东西绿灯闪灭3秒
  lcall del500ms 
  clr p1.6
  lcall del500ms
  setb p1.6
  lcall del500ms
  clr p1.6
  lcall del500ms
  setb p1.6
     lcall del500ms
  clr p1.6
  lcall del500ms
  setb p1.6   ;灭东西绿灯
  clr p1.7  ;东西黄灯亮2秒
  mov 33h,#4   ;延时2秒
loop3:lcall del500ms
      djnz 33h,loop3
   setb p1.7   ;2秒后灭东西黄灯
   setb p1.0   ;关东西红灯
   setb p1.6  ;关南北绿灯
   clr p1.1  ;开西绿灯
   clr p1.5  ;开南北红灯
   setb ea
   sjmp keyout
key4:clr p1.6 ;;开南北绿灯
     clr p1.0   ;开东西红灯
  setb p1.1
  setb p1.2
  setb p1.3
  setb p1.4
  setb p1.5
  setb p1.7
 keyout:ret
end

  • 18
    点赞
  • 114
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值