undefined-0's Blog

历添新岁月 春满旧山河

0%

AT89S52_test8

实验八 综合实验 十字路口交通灯

南北红灯(D1、D7)亮维持15秒,在南北红灯亮的同时东西绿灯(D5、D11)也亮,并维持10s。
到10s时,东西绿灯(D5、D11)闪亮,闪亮3s后熄灭。
在东西绿灯(D5、D11)熄灭时,东西黄灯(D6、D12)亮,并维持2秒。
到2秒时,东西黄灯(D6、D12)熄灭,东西红灯(D4、D10)亮,同时南北红灯(D1、D7)熄灭,绿灯(D2、D8)亮。

接线方法:
P1.0—P3.5 T1输入
P1.1—D1 D7 南北红
P1.2—D2 D8 南北绿
P1.3—D3 D9 南北黄
P1.4—D4 D10 东西红
P1.5—D5 D11 东西绿
P1.6—D6 D12 东西黄
注:交通灯模块的LED为置低点亮

T0定时50ms,使P1.0口输出周期为100ms的方波,作为计数器T1的输入
T1重装载值:
0FB—0.5s
0F6—1s
0EC—2s
0E2—3s
9C—10s
6A—15s

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
; EW -> East & West,东西
; SN -> South & North,南北

ORG 0000H
SJMP MAIN

ORG 000BH ;T0(定时器)中断服务程序入口
LJMP T0_ISR

ORG 0030H
MAIN:
MOV A,#0FFH
MOV P1,A ;所有灯熄灭
MOV TMOD,#61H ;0110 0001:设置T1为计数器,方式2;设置T0为定时器,方式1
MOV TH0,#4CH
MOV TL0,#01H
SETB ET0 ;允许T0中断
SETB TR0 ;启动T0
SETB EA ;开中断总控

LOOP:
MOV TH1,#9CH ;10s
MOV TL1,#9CH
;T1采用查询方式,不允许中断
SETB TR1 ;启动T1

CLR P1.5 ;点亮东西绿
CLR P1.1 ;点亮南北红
JNB TF1,$ ;若10s未到,等待
MOV R0,#06H ;10s到了,装载R0(为控制绿灯闪烁次数而设的计数变量)
CALL_EW_GREEN_FLASH:
ACALL GREEN_EW_FLASH ;绿灯闪烁(闪烁三秒--->调用六次)
DJNZ R0,CALL_EW_GREEN_FLASH
SETB P1.5;东西绿闪烁结束,熄灭东西绿
CLR TR1 ;停止T1
CLR P1.6;点亮东西黄
MOV TH1,#0ECH ;2s
MOV TL1,#0ECH
SETB TR1 ;启动T1
JNB TF1,$ ;若2s未到,等待
CLR TR1 ;2s到了,停止T1
CLR TF1 ;清中断标志位
SETB P1.6;熄灭东西黄
SETB P1.1;熄灭南北红
CLR P1.4;点亮东西红
CLR P1.2;点亮南北绿
MOV TH1,#9CH ;10s
MOV TL1,#9CH
SETB TR1;启动T1
JNB TF1,$ ;若10s未到,等待
MOV R0,#06H ;10s到了,装载R0(为控制绿灯闪烁次数而设的计数变量)
CALL_SN_GREEN_FLASH:
ACALL GREEN_SN_FLASH ;绿灯闪烁(闪烁三秒--->调用六次)
DJNZ R0,CALL_SN_GREEN_FLASH
SETB P1.2;南北绿闪烁结束,熄灭南北绿
CLR TR1 ;停止T1
CLR P1.3;点亮南北黄
MOV TH1,#0ECH ;2s
MOV TL1,#0ECH
SETB TR1 ;启动T1
JNB TF1,$ ;若2s未到,等待
CLR TR1 ;2s到了,停止T1
CLR TF1 ;清中断标志位
SETB P1.3;熄灭南北黄
SETB P1.4;熄灭东西红
SJMP LOOP

T0_ISR: ;50ms到了
MOV TH0,#4CH ;重装载
MOV TL0,#01H
CPL P1.0
RETI

GREEN_EW_FLASH:
JNB TF1,$ ;若0.5s未到,等待(第一次进入GREEN_EW_FLASH时,标志位TF1未清零,不会等待)
CLR TR1 ;0.5s到了,停止T1
CLR TF1 ;清中断标志位
CPL P1.5 ;东西绿开始闪烁
MOV TH1,#0FBH ;0.5s
MOV TL1,#0FBH
SETB TR1 ;启动T1
RET

GREEN_SN_FLASH:
JNB TF1,$ ;若0.5s未到,等待(第一次进入GREEN_SN_FLASH时,标志位TF1未清零,不会等待)
CLR TR1 ;0.5s到了,停止T1
CLR TF1 ;清中断标志位
CPL P1.2 ;南北绿开始闪烁
MOV TH1,#0FBH ;0.5s
MOV TL1,#0FBH
SETB TR1 ;启动T1
RET

END