📄 交通灯控制.asm
字号:
;晶振12M
;CPU:ATMEL89s51/89s52
sec equ 30h
sec1 equ 31h
sec2 equ 32h
sec3 equ 33h
ge_bit equ 34h
shi_bit equ 35h
deng1 equ 36h
deng2 equ 37h
biaozhi1 equ 38h
biaozhi2 equ 39h
org 0000h
ljmp start
org 000bh
ljmp ET_0
org 001bh
ljmp ET_1
org 0030h
ET_0:inc sec1 ;sec1每200us就加1
RETI
ET_1:mov th1,#0ffh ;形成175μ秒中断(200偏低音,100、150偏高音)
mov tl1,#51h
cPL p3.7
RETI
reflash:mov a,sec1
mov b,#5
div ab
mov sec1,b
add a,sec2 ;sec2每200us×5=1ms就加1
mov b,#100
div ab
mov sec2,b
add a,sec3 ;sec3每1ms×100=0.1s就加1
mov b,#10
div ab
mov sec3,b
cjne a,#1,exit ;sec每0.1s×10=1就减1
dec deng1
dec deng2
inc sec
mov a,sec
cjne a,#140,exit
mov sec,#00
exit:ret
start:mov sec,#00h
mov sec1,#00h
mov sec2,#00h
mov sec3,#00h
mov deng1,#00h
mov deng2,#00h
mov sp,#60h
mov ie,#00h
mov tmod,#12h ;T0&T1方式选择 T1方式1,16位计数器;T0方式2,8位自动重装计数器
mov ip,#02h ;设置中断优先级控制T0>T1
mov th0,#38h ;计数器赋初值
mov tl0,#38h
mov th1,#0ffh
mov tl1,#51h
setb ea
setb et0 ;开放总中断和允许T0中断
setb et1 ;允许T1中断
setb tr0 ;启用t0
mov p2,#0ffh
mov p1,#0ffh
lcall chuli1
lcall chuli2
lcall chuli3
ljmp play0
chuli1:lcall reflash
mov a,sec
cjne a,#60,ca1
ca1:jc case01 ;绿灯通行时间
cjne a,#80,ca2
ca2:jc case02 ;拐弯时间
ljmp case03 ;红灯继续等待时间
chuli2:lcall reflash
mov a,sec
cjne a,#80,ca3
ca3:jc case04
cjne a,#120,ca4
ca4:jc case05
ljmp case06
case01:mov deng1,#60
ret
case02:mov deng1,#20
ret
case03:mov deng1,#60
ret
case04:mov deng2,#80
ret
case05:mov deng2,#40
ret
case06:mov deng2,#20
ret
play0:lcall reflash
lcall chuli3
mov p0,#0ffh
mov a,deng1
mov b,#10
div ab
mov ge_bit,b
mov shi_bit,a
mov dptr,#num1
mov a,ge_bit
movc a,@a+dptr
mov p0,a
clr p1.7
lcall dims
setb p1.7
mov a,shi_bit
movc a,@a+dptr
mov p0,a
clr p1.6
lcall dims
setb p1.6
mov a,deng1
cjne a,#00h,next1
lcall chuli1
next1:ljmp play1
play1:lcall reflash
lcall chuli3
mov p0,#0ffh
mov a,deng2
mov b,#10
div ab
mov ge_bit,b
mov shi_bit,a
mov dptr,#num1
mov a,ge_bit
movc a,@a+dptr
mov p0,a
clr p3.4
lcall dims
setb p3.4
mov a,shi_bit
movc a,@a+dptr
mov p0,a
clr p3.3
lcall dims
setb p3.3
mov a,deng2
cjne a,#00h,next2
lcall chuli2
next2:ljmp play0
chuli3:mov a,sec
cjne a,#55,cs1
cs1:jc case11
cjne a,#58,cs2
cs2:jc case12
cjne a,#60,cs3
cs3:jc case13
cjne a,#77,cs4
cs4:jc case14
cjne a,#80,cs5
cs5:jc case15
cjne a,#115,cs6
cs6:jc case16
cjne a,#118,cs7
cs7:jc case17
cjne a,#120,cs8
cs8:jc case18
cjne a,#137,cs9
cs9:jc case19
mov p2,#10111011b
lcall turn2
ret
case11:mov p2,#10111110b
ret
case12:mov p2,#10111111b
lcall grenn1
ret
case13:mov p2,#10111101b
ret
case14:mov p2,#10110011b
ret
case15:mov p2,#10111011b
lcall turn1
ret
case16:mov p2,#11101011b
ret
case17:mov p2,#11111011b
lcall grenn2
ret
case18:mov p2,#11011011b
ret
case19:mov p2,#00111011b
ret
;绿灯闪1
grenn1:mov a,sec3
cjne a,#5,re1
re1:jc er1
clr p2.0
er1:ret
;绿灯闪2
grenn2:mov a,sec3
cjne a,#5,re2
re2:jc er2
clr p2.4
er2:ret
;拐灯闪1
turn1:mov a,sec3
cjne a,#5,re3
re3:jc er3
clr p2.3
er3:ret
;拐灯闪2
turn2:mov a,sec3
cjne a,#5,re4
re4:jc er4
clr p2.7
er4:ret
;dims是动态扫描七段码时的延时
dims:mov r5,#0b0h
djnz r5,$
ret
num1:DB 0C0H;0
DB 0F9H;1
DB 0A4H;2
DB 0B0H;3
DB 099H;4
DB 092H;5
DB 082H;6
DB 0F8H;7
DB 080H;8
DB 090H;9
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -