实验具体内容

本实验利用 8255 实现可编程的并行 IO 扩展功能,并利用其完成交通灯控制。实验要求红灯常亮 30S,绿灯常亮 25S 后闪烁 5S。使用静态数码管显示绿灯常亮倒计时。

实验原理图如下

img

连线关系:

img

注意事项:

本实验中的东西方向信号灯同步控制,南北方向信号灯同步控制,即:东西方向上同种颜色的灯同时亮或灭,南北方向上同种颜色的灯同时亮或灭。

程序中的延时 1 秒钟,可以利用纯软件延时实现,也可以结合定时器硬件中断加软件计数方式实现。

图中的 CD4511 是 BCD 码到 LED 数码管的显示码转换芯片,因此要显示某个数字,只需要在相应的端口送出该数字的 BCD 码即可,不用进行软件译码。

流程图

image-20220212130442364

实验过程

  1. 关掉实验箱电源。将 MCU 板,PIO 版,KEY&LED 板插接在母板上。按照前面连接关系表将硬件连接好。
  2. 在仿真器断电情况下将仿真器的仿真头插在 MCU 板的 CPU 插座上。将仿真器与开发 PC 机的通信口连接好,打开实验箱及仿真器的电源。
  3. 运行 Keil uVision2 开发环境,建立工程 PIO8255_trafic.uV2,CPU 为 AT89S51,不包含启动文件 STARTUP.A51。
  4. 按照实验功能要求创建源程序 PIO8255_trafic.asm 并加入到工程PIO8255_trafic.uV2,并设置工程 PIO8255_trafic.uV2 属性,将其晶振频率设置为 11.0592MHz,选择输出可执行文件,DEBUG 方式选择硬件 DEBUG,并选择其中的“WAVE V series MCS51 Driver”仿真器。
  5. 构造(Build)工程 PIO8255_trafic.uV2。如果编程有误进行修改,直至构造正确为止。
  6. 运行程序,交通灯状态切换以及倒计时器的显示是否符合程序要求,若不符合,分析出错原因,继续重复第 4、5 步的步骤,直至结果正确。

实验结果:

状态1:东西绿灯亮,南北红灯亮,持续25s,用七段数码管显示倒计时,初值为25;

状态2:东西绿灯以1Hz频率闪烁,南北红灯亮,持续5s,用七段数码管显示倒计时,初值为5;

状态3:东西红灯亮,南北绿灯亮,持续25s,用七段数码管显示倒计时,初值为25;

状态4:东西红灯亮,南北绿灯以1Hz频率闪烁,持续5s,用七段数码管显示倒计时,初值为5;

验证成功。

总结51单片机利用可编程IO扩展芯片的使用方法: 首先需要对8255的命令口进行初始化配置,确定A、B、C口的工作方式,将C51的读写端口分别与8255的读写端口相连,以控制对8255的读写。将8255的输入端与C51的数据输出端相连,通过向C51的数据输出端输出数据实现向8255输入数据,8255按照工作方式输出数据。

编写程序的时候考虑到不知道通过调用子程序的方法控制164的输入输出是否会把R2寄存器的内容入栈,所以选择在每一个状态中加164的控制程序。

实验源程序

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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
    ORG 0000H
   AJMP START

   ORG 0030H
START:
   MOV DPTR,#0003H         ;指向8255A的命令口
   MOV A,#80H             ;取方式字:A口0方式输出
   MOVX @DPTR,A
   MOV DPTR,#0000H         ;指向A口
STATUS1:                    ;状态1:东西绿灯亮,南北红灯亮
   MOV A,#96H             ;01101001
   MOVX @DPTR,A
   MOV R2,#19H             ;延时25s

;下面INOUT标号用于处理164的输入数据,以及串行输入并行输出达到控制七段数码管显示
INOUT1:
   MOV R3,#08H
   MOV B,#0AH
   MOV A,R2
   DIV AB                  ;商存入A中,余数存入B中
   RL A
   RL A
   RL A
   RL A
   ADD A,B
OUTPUT1:
   CLR C
   RRC A
   JC ONE1
ZERO1:
   CLR P3.0
   CLR P3.1            ;给164上升沿
   NOP
   NOP
   NOP
   NOP
   SETB P3.1
   DJNZ R3,OUTPUT1
   AJMP DELAY1
ONE1:
   SETB P3.0
   CLR P3.1            ;给164上升沿
   NOP
   NOP
   NOP
   NOP
   SETB P3.1
   DJNZ R3,OUTPUT1
DELAY1:
   CALL DELAY1s
   DJNZ R2,INOUT1
   MOV R2,#05H               ;为循环5次作准备
   
STATUS2:                    ;状态2:东西绿灯闪烁,南北红灯亮
INOUT2:
   MOV R3,#08H
   MOV B,#0AH
   MOV A,R2
   DIV AB                  ;商存入A中,余数存入B中
   RL A
   RL A
   RL A
   RL A
   ADD A,B
OUTPUT2:
   RRC
   JC ONE2
ZERO2:
   CLR P3.0
   CLR P3.1            ;给164上升沿
   NOP
   NOP
   NOP
   NOP
   SETB P3.1
   DJNZ R3,OUTPUT2
   AJMP DELAY2
ONE2:
   SETB P3.0
   CLR P3.1            ;给164上升沿
   NOP
   NOP
   NOP
   NOP
   SETB P3.1
   DJNZ R3,OUTPUT2
DELAY2:
   MOV A,#0BEH             ;东西绿灯灭   10111110
   MOVX @DPTR,A            
   CALL DELAY500ms
   MOV A,#96H             ;东西绿灯亮     10010110
   MOVX @DPTR,A
   CALL DELAY500ms
   
LOOP1:
   DJNZ R2,INOUT2

STATUS3:                    ;状态3:东西红灯亮,南北绿灯亮
   MOV A,#69H             ;10010110
   MOVX @DPTR,A            
   MOV R2,#19H           ;延时25s
INOUT3:
   MOV R3,#08H
   MOV B,#0AH
   MOV A,R2
   DIV AB                  ;商存入A中,余数存入B中
   RL A
   RL A
   RL A
   RL A
   ADD A,B
OUTPUT3:
   RRC A
   JC ONE3
ZERO3:
   CLR P3.0
   CLR P3.1            ;给164上升沿
   NOP
   NOP
   NOP
   NOP
   SETB P3.1
   DJNZ R3,OUTPUT3
   AJMP DELAY3
ONE3:
   SETB P3.0
   CLR P3.1            ;给164上升沿
   NOP
   NOP
   NOP
   NOP
   SETB P3.1
   DJNZ R3,OUTPUT3
DELAY3:
   CALL DELAY1s
   DJNZ R2,INOUT3
   MOV R2,#05H
STATUS4:                    ;状态4:东西红灯亮,南北绿灯闪烁
INOUT4:
   MOV R3,#08H
   MOV B,#0AH
   MOV A,R2
   DIV AB                  ;商存入A中,余数存入B中
   RL A
   RL A
   RL A
   RL A
   ADD A,B
OUTPUT4:
   RRC A
   JC ONE4
ZERO4:
   CLR P3.0
   CLR P3.1            ;给164上升沿
   NOP
   NOP
   NOP
   NOP
   SETB P3.1
   DJNZ R3,OUTPUT4
   AJMP DELAY4
ONE4:
   SETB P3.0
   CLR P3.1            ;给164上升沿
   NOP
   NOP
   NOP
   NOP
   SETB P3.1
   DJNZ R3,OUTPUT4
DELAY4:
   MOV A,#0EBH             ;南北绿灯灭
   MOVX @DPTR,A            
   CALL DELAY500ms
   MOV A,#69H             ;南北绿灯亮
   MOVX @DPTR,A        
   CALL DELAY500ms
LOOP2:
   DJNZ R2,INOUT4
AJMP STATUS1


DELAY1s:                  ;1s延时程序
   MOV R7,#100
DL1:
   MOV R6,#100
DL2:
   MOV R5,#48
   DJNZ R5,$
   DJNZ R6,DL2
   DJNZ R7,DL1
   RET

DELAY500ms:                  ;0.5延时程序
   MOV R7,#50
DL3:
   MOV R6,#100
DL4:
   MOV R5,#48
   DJNZ R5,$
   DJNZ R6,DL4
   DJNZ R7,DL3
   RET

END