交通灯系统

  • 浙江工业大学信息工程学院单片机实验

  • 题:定义一个秒表计数器如R2

  1. 在R2的值为1~30秒,输出P1口和P3.0、P3.1实现南北绿灯、东西红灯、人行道东西红灯、南北绿灯,并将R2的值除10,商放在动态LED0,余数放在动态LED1点亮;
  2. 在R2的值为31~35秒,输出P1口和P3.0、P3.1实现南北黄灯、东西红灯、人行道东西红灯、南北红灯,并将R2的值减去30后除10,商放在动态LED0,余数放在动态LED1点亮;
  3. 在R2的值为36~65秒,输出P1口和P3.0、P3.1实现南北红灯、东西绿灯、人行道东西绿灯、南北红灯,并将R2的值减去35后除10,商放在动态LED0,余数放在动态LED1点亮;
  4. 在R2的值为66~70秒,输出P1口和P3.0、P3.1实现南北红灯、东西黄灯、人行道东西红灯、南北红灯,并将R2的值减去65后除10,商放在动态LED0,余数放在动态LED1点亮;
  5. 当R2的值等于71秒时,R2置1,重新开始

交通灯模块、动态数码管模块,利用定时器、十进制数拆分
用 8 根的排线连接单片机 P0 的 JP10 到动态数码管的 J12,用 8 根的排线连接单片机 P1 的 JP8 到 交通灯模块的 JP1
单片机的 P22、P23、P24 分别接到 74HC138 模块的A、B、C。JP165 跳线帽一定要拔掉,插在其中一根针上,以免丢掉。
南北绿灯30s,红灯30s;黄灯均为5s;东西绿灯25s,红灯35s,
人行道不显示倒计时,车道显示倒计时

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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
    ORG     0000H
RESET:
AJMP MAIN
ORG 000BH //定时器中断0入口
AJMP INTI0
ORG 0100H

MAIN:
MOV SP,#60H //计时工作方式1
MOV TMOD,#01H
MOV DPTR,#TABLE
//12MHz,机器周期1μs,需要10000个计数,初值=65536-10000=55536=D8F0H
MOV TH0,#0D8H
MOV TL0,#0F0H
SETB ET0 //开放T0中断和总中断
SETB EA
SETB TR0 //启动T0
MOV R0,#01 //计数器初值为01
MOV 30H,#00H //定时器超时一百次,达到64h即一秒
MOV 31H,#30 //南北方向红黄绿时间,30,5,30
MOV 32H,#35 //东西方向红黄绿时间,35,5,25
MOV P1,#11001101B //110东西红'011南北绿'01人行南北绿
CLR P3.0 //10人行东西红
SETB P3.1
LCALL CALCU
LJMP DISPLAY

CALCU:
/***********南北方向倒计时计算********************/
MOV R1,#10 //除数为10
MOV A,31H //倒计时数字放到A
MOV B,R1 //除数10放到B
DIV AB //A为商,B为余数
MOV R4,A //R4存放商
MOV R5,B //R5存放余数
/***********东西方向倒计时计算********************/
MOV R1,#10 //除数为10
MOV A,32H //倒计时数字放到A
MOV B,R1 //除数10放到B
DIV AB //A为商,B为余数
MOV R6,A //R6存放商
MOV R7,B //R7存放余数
RET

DISPLAY:
/***********南北方向倒计时显示********************/
CLR P2.2
CLR P2.3
CLR P2.4
MOV A,R4 //LED0输出商
MOVC A,@A+DPTR
MOV P0,A
LCALL D04MS

SETB P2.2
MOV A,R5 //LED1输出余数
MOVC A,@A+DPTR
MOV P0,A
/***********东西方向倒计时显示********************/
CLR P2.2
CLR P2.3
SETB P2.4
LCALL D04MS
MOV A,R6 //LED4输出商
MOVC A,@A+DPTR
MOV P0,A
LCALL D04MS

SETB P2.2
MOV A,R7 //LED5输出余数
MOVC A,@A+DPTR
MOV P0,A
/*********************************************/
JNB TF0,DISPLAY //wait for TF0

INTI0:
PUSH PSW //保护状态字寄存器
PUSH ACC
CLR EA //关闭总中断
MOV TH0,#0D8H //定时10ms
MOV TL0,#0F0H
INC 30H
MOV A,30H
CJNE A,#100,OUT
MOV 30H,#00H //定时器超时一百次,达到64h即一秒
INC R0 //计数器+1
DEC 31H
DEC 32H


/***********四种状态互相转变********************/
JMP5SN:
CJNE R0,#31,JMP30EW
MOV P1,#11010110B //110东西红'101南北黄'10人行南北红
CLR P3.0 //10人行东西红
SETB P3.1
MOV 31H,#5
LCALL CALCU
SJMP OUT
JMP30EW:
CJNE R0,#36,JMP5EW
MOV P1,#01111010B //011东西绿'110南北红'10人行南北红
SETB P3.0 //01人行东西绿
CLR P3.1
MOV 31H,#30
MOV 32H,#25
LCALL CALCU
SJMP OUT
JMP5EW:
CJNE R0,#66,JMP30SN
MOV P1,#10111010B //101东西黄'110南北红'10人行南北红
SETB P3.0 //01人行东西绿
CLR P3.1
MOV 32H,#5
LCALL CALCU
SJMP OUT
JMP30SN:
CJNE R0,#71,OUT
MOV R0,#1
MOV P1,#11001101B //110东西红'011南北绿'01人行南北绿
CLR P3.0 //10人行东西红
SETB P3.1
MOV 31H,#30
MOV 32H,#35
LCALL CALCU
SJMP OUT

OUT:
SETB EA //开总中断
POP ACC
POP PSW //保护状态字寄存器
RETI

D04MS: //延时0.4ms
MOV R3,#2
D1: MOV R2,#10
D2: DJNZ R2,D2
DJNZ R3,D1
RET

TABLE:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H //共阴极0~9
DB 7FH,6FH
DB 00H

END

请我喝杯咖啡吧~