资源描述
这是我初学单片机,并用Proreus软件自己绘制自己编写程序实现的一个交通红绿灯的系统。这是硬件连接图和程序,以便今后复习。
左
上
右
下
中控制部分,上面一个开关按下时,南北方向绿灯,东西方向红灯
黄灯闪烁3秒
绿灯设置15秒,红灯设置18秒。绿灯走完15秒后黄灯闪烁3秒变为红灯,红灯走完18秒后变成绿灯,以此循环。
源程序:
COUNT EQU 30H ;T0中断计数
SNLEDDATA EQU 31H ;存储南北数码管显示的数据
SNCOLORFLAG EQU 32H ;=1时南北绿灯亮,=2时南北黄灯亮,=3时南北红灯亮
SNLEDDATAINIT EQU 33H ;存储南北各颜色灯的初始时间
EWLEDDATA EQU 34H ;存储东西数码管显示的数据
EWCOLORFLAG EQU 35H ;=1时东西红灯亮,=2时东西绿灯亮,=3时东西黄灯亮
EWLEDDATAINIT EQU 36H ;存储东西各颜色灯的初始时间
org 0000h
lJMP MAIN
org 0003h
ljmp exint0
ORG 000BH
lJMP INTT0
org 0013h
ljmp exint1
org 0100h
;主函数**************************************
MAIN:
CALL INIT
START:
MOV A,COUNT
CJNE A,#200,NOT1S ;没到1秒跳转
MOV COUNT,#00 ;1秒时间到
DEC SNLEDDATA
MOV A,SNLEDDATA
JNZ checkewleddata
MOV SNLEDDATA,SNLEDDATAINIT
INC SNCOLORFLAG
MOV A,SNCOLORFLAG
CJNE A,#04,checkewleddata
MOV SNCOLORFLAG,#01
checkewleddata:
DEC EWLEDDATA
MOV A,EWLEDDATA
JNZ timenotover
MOV EWLEDDATA,EWLEDDATAINIT
INC EWCOLORFLAG
MOV A,EWCOLORFLAG
CJNE A,#04,timenotover
MOV EWCOLORFLAG,#01
TIMENOTOVER:
NOT1S:
call ewcolorcheck
CALL snCOLORCHECK
CALL DISPLAY
JMP START
;*********************************************
;初始化函数***********************************
INIT: MOV SP,#60H
MOV TMOD,#01H
MOV TH0,#0eCH
MOV TL0,#078H
MOV COUNT,#00H
MOV SNLEDDATAINIT,#15
MOV EWLEDDATAINIT,#18
MOV SNLEDDATA,SNLEDDATAINIT
MOV EWLEDDATA,EWLEDDATAINIT
SETB TR0 ;开定时器0
SETB ET0 ;允许定时器0中断
setb ex0 ;允许外部0中断
setb ex1 ;允许外部1中断
setb it0 ;外部中断0下降沿触发
setb it1 ;外部中断1下降沿触发
SETB EA ;开总中断
MOV P2,#0feH
MOV SNCOLORFLAG,#01
MOV EWCOLORFLAG,#01
RET
;*****************************************
;外部中断0***********************************
exint0:
push acc
push psw
mov a,p0
push acc
mov a,p1
push acc
mov a,p2
push acc
clr ex1
clr p2.0
clr p2.1
clr p2.2
clr p2.3
setb p1.4
clr p1.1
clr p1.2
setb p1.5
clr p1.3
clr p1.4
jnb p3.2,$
setb ex1
pop acc
mov p2,a
pop acc
mov p1,a
pop acc
mov p0,a
pop psw
pop acc
reti
;外部中断1***********************************
exint1:
push acc
push psw
mov a,p0
push acc
mov a,p1
push acc
mov a,p2
push acc
clr ex0
clr p2.0
clr p2.1
clr p2.2
clr p2.3
setb p1.4
setb p1.2
clr p1.1
clr p1.0
setb p1.3
clr p1.5
clr p1.4
jnb p3.3,$
setb ex0
pop acc
mov p2,a
pop acc
mov p1,a
pop acc
mov p0,a
pop psw
pop acc
reti
;T0中断函数*******************************
INTT0:PUSH ACC
PUSH PSW
MOV TH0,#0ecH ;#0ech
MOV TL0,#078H ;#078h
MOV A,P2
RL A
CJNE A,#11101111B,NOT5
MOV A,#0feH ;p2.0=0,南北数码管十位亮,p2.1=0,南北数码管个位亮
NOT5: MOV P2,A ;p2.2=0,东西数码管十位亮,p2.3=0,东西数码管个位亮
INC COUNT
POP PSW
POP ACC
RETI
;****************************************
;南北红绿黄灯控制**************************
snCOLORCHECK:
PUSH ACC
PUSH B
PUSH PSW
sngreen:
MOV A,SNCOLORFLAG
CJNE A,#01,snYELLOW
MOV SNLEDDATAINIT,#03 ;设置南北黄灯闪烁时间
CLR P1.2
CLR P1.1
SETB P1.0 ;南北绿灯亮
JMP snCOLORCHECKOUT
snYELLOW:
;MOV A,SNCOLORFLAG
CJNE A,#02,snred
MOV SNLEDDATAINIT,#18 ;设置南北红灯亮时间
MOV A,COUNT
MOV B,#100
DIV AB
MOV A,B
CJNE A,#00H,snNOTFLASH
CPL P1.1 ;南北黄灯闪烁
CLR P1.0
CLR P1.2
snNOTFLASH:
JMP snCOLORCHECKOUT
snred:
MOV SNLEDDATAINIT,#15 ;设置南北绿灯亮时间
CLR P1.0
CLR P1.1
SETB P1.2 ;南北红灯亮
snCOLORCHECKOUT:
POP PSW
POP B
POP ACC
RET
;******************************************************
;东西红绿黄灯控制**************************************
ewCOLORCHECK:
PUSH ACC
PUSH B
PUSH PSW
ewred:
MOV A,ewCOLORFLAG
CJNE A,#01,ewyellow
MOV ewLEDDATAINIT,#15 ;设置东西绿灯亮时间
CLR P1.3
CLR P1.4
SETB P1.5 ;东西红灯亮
JMP ewCOLORCHECKOUT
ewyellow:
;MOV A,ewCOLORFLAG
CJNE A,#03,ewgreen
MOV ewLEDDATAINIT,#18 ;设置东西红灯亮时间
MOV A,COUNT
MOV B,#100
DIV AB
MOV A,B
CJNE A,#00H,ewNOTFLASH
CPL P1.4 ;东西黄灯闪烁
CLR P1.3
CLR P1.5
ewNOTFLASH:
JMP ewCOLORCHECKOUT
ewgreen:
MOV ewLEDDATAINIT,#03 ;设置东西黄灯闪烁时间
CLR P1.4
CLR P1.5
SETB P1.3 ;东西绿灯亮
ewCOLORCHECKOUT:
POP PSW
POP B
POP ACC
RET
;************************************************************
;数码管显示**************************************************
DISPLAY:
PUSH ACC
PUSH PSW
PUSH B
MOV A,SNLEDDATA
MOV B,#10
DIV AB
MOV R0,B
MOV R1,A
MOV A,EWLEDDATA
MOV B,#10
DIV AB
MOV R2,B
MOV R3,A
MOV DPTR,#TABLE
MOV A,P2
DISPSNH:
CJNE A,#0feH,DISPSNL
MOV A,R1
MOVC A,@A+DPTR
MOV P0,A
JMP DISPOUT
DISPSNL:
CJNE A,#0fdH,DISPEWH
MOV A,R0
MOVC A,@A+DPTR
MOV P0,A
JMP DISPOUT
DISPEWH:
CJNE A,#0fbH,DISPEWL
MOV A,R3
MOVC A,@A+DPTR
MOV P0,A
JMP DISPOUT
DISPEWL:
CJNE A,#0f7H,DISPOUT
MOV A,R2
MOVC A,@A+DPTR
MOV P0,A
DISPOUT:
POP B
POP PSW
POP ACC
RET
;**************************************************
TABLE:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
; 0 1 2 3 4 5 6 7 8 9
END
展开阅读全文