基于51单片机的简单交通灯程序
这是一个比较完整的程序。最近实习要做交通灯,
写了个程序。比较简单,不过初学者可以参考,呵呵
;*************************************
;file name: traffic_light.asm
;
;FOUCTION : 实现交通灯的交替控制及特殊情况(如急救车等)通过时实现绿灯,通过外中断实现
;
;WRITER :
;Finish Time: 2010.6.8
;*************************************
North_South_Red BIT P1.0
North_South_Yellow BIT P1.1
North_South_Green BIT P1.2
East_West_Red BIT P1.3
East_West_Yellow BIT P1.4
East_West_Green BIT P1.5
Scd EQU 30H ;秒
ORG 0000H
JMP START
ORG 0003H
JMP INIT0
ORG 000BH
JMP TIME0
;*************************************
;NAME: 交通灯交替工作控制程序
;
;FOUCTION: 红绿黄交替点亮: 红灯亮33秒钟后绿灯亮27秒,然后闪烁3秒,最后黄灯点亮三秒 ,循环
;
;WRITER :
;TIME : 2010.6.8
;*************************************
TIME0:
MOV TH0,#30H
MOV TL0,#0B0H
INC 31H
MOV A,31H
N: CJNE A,#20,EXIT ;判断是否到一秒
MOV 31H,#0
INC Scd
MOV A,Scd
CJNE A,#27,NEXT1 ;判断绿灯是否到27s
SETB F0
JMP EXIT
NEXT1: MOV A,Scd
CJNE A,#30,NEXT2 ;判断绿灯是否亮30s
CLR F0
MOV P1,#0EEH
JMP EXIT
NEXT2:
MOV A,Scd
CJNE A,#33,NEXT3
MOV P1,#0F3H ;初始化
NEXT3:
MOV A,Scd
CJNE A,#60,NEXT4
SETB 00H
JMP EXIT
NEXT4: MOV A,Scd
CJNE A,#63,NEXT5
CLR 00H
MOV P1,#0F5H
JMP EXIT
NEXT5: MOV A,Scd
CJNE A,#66,EXIT
MOV P1,#0DEH
MOV Scd,#0
EXIT: RETI
;*************************************
;NAME: 外中断0
;
;FOUCTION: 东西方向出现特殊情况 ?
; 南北红灯亮,东西绿灯亮,延时10s
;WRITER :
;TIME : 2010.6.8
;*************************************
INIT0:
PUSH PSW
PUSH ACC
CLR EA
MOV R2,P1 ;保存数据
MOV P1,#0F6H
CALL DELLAY10S
MOV P1,R2 ;恢复
SETB EA
POP ACC
POP PSW
RETI
;*******************主程序初始化部分**************
START:
MOV Scd, #00H
MOV 31H, #00H
MOV P1, #0FFH
CLR 00H
CLR F0
MOV TMOD, #01H ;设定定时器1
MOV IE, #83H ;设定中断使能 定时器中断0、外部中断0和1
MOV SP, #60H
MOV TH0, #30H
MOV TL0, #0B0H
SETB TR0
LOOP:
JNB F0,N0
CPL East_West_Green ;绿灯闪三秒
CALL DELAY500MS
JMP N1
N0:
JNB 00H,N1
CPL North_South_Green ;绿灯闪三秒
CALL DELAY500MS
N1:
JMP LOOP
;************************************
;Name : DELAY
;
;Fouction: delay 10s
;
;Time : 2010.06.09
;Writer :
;*************************************
DELLAY10S:
MOV R4,#0BFH
D1:
MOV R6,#0BDH
D0:
MOV R5,#89H
DJNZ R5,$
DJNZ R6,D0
DJNZ R4,D1
NOP
RET
;************************************
;Name : DELAY
;
;Fouction: delay 10s
;
;Time : 2010.06.17
;Writer :
;*************************************
DELAY500MS: ;Delay 0.5s
MOV 57H,#17H
DL1:
MOV 56H,#98H
DL0:
MOV 55H,#46H
DJNZ 55H,$
DJNZ 56H,DL0
DJNZ 57H,DL1
RET
END