资源描述
大连理工大学本科设计汇报
题目: 交通灯自动控制系统设计
课程名称: 计算机原理试验
学院(系): 电信学部
专 业: 电子信息工程(英强)
班 级: 电英0902
学 号: 81541
学生姓名: 张策
成 绩:
年 1 月 8 日
题目:交通灯自动控制系统设计
1 设计要求
利用试验台上彩色LED模拟两组“红—黄—绿”交通信号指示灯,将其分别作为主干道和支线道路信号灯。
利用8253实现秒定时。主干线绿灯亮8秒,支线亮5秒,绿灯过渡到红灯时有一秒黄灯显示周期。
利用试验台上两个单脉冲模拟两个人行横道“应急通行”按钮,当按动按钮时:信号立即转为绿灯,并延时一段时间,再转回到红灯,继续完成剩下时间。
使用LED数码管模块显示信号周期时间“倒计时”。
2 设计分析及系统方案设计
能够将信号灯每一个状态设定成一个“状态字”,CPU只要经过8255APC端口每隔5秒钟更新一次“状态字”就能够实现信号灯正常工作。依据试验要求可将这些状态字设定如表3.1.3中内容。
表3.1.3:信号灯状态字表
次序
(状态)
(空)
主干路(南北)信号灯
支线路(东西)信号灯
状态字(16进制)
D7
D6
D5
D4
D3
D2
D1
D0
--
--
红
黄
绿
红
黄
绿
1
0
0
0
0
1
1
0
0
0CH ------ 主干路行
2
0
0
0
1
0
1
0
0
14H ------ 主干路转换
3
0
0
1
0
0
0
0
1
21H ------ 支线路行
4
0
0
1
0
0
0
1
0
22H------ 支线路转换
(1) 设定D8255APC口作输出、显示信号灯效果;
(2) 设定8253CNT0工作于方法3,写入初值10000,将1MHZ信号分频为100HZ,再将CNT1设置为方法2,写入初值100,将100HZ分频为周期为1秒周期性方波;将分频后结果输入到8255PA0口;
(3) 将D8255APA口设定为输入,并使用PA0和8253 OUT1连接,CPU经过查询PA0电平改变(秒信号),控制信号灯运行(经过设定计数来改变信号运行周期);
(4) 分别使用两个单脉冲输出(正脉冲数出)和386模块MIR5和SIR0连接,作为“南北”和“东西”人行横道“紧急通行”呼叫信号。当产生呼叫信号后,该方向信号灯变为绿色,维持一段时间后,信号灯恢复正常运行;
(5) 设定D8255APB口作输出,连接LED显示“倒计时”。
图 3.2 参考连接示意图
8254/8253
D7 OUT2
… CLK2
D0 GATE2
OUT1
/RD CLK1
/WR GATE1
A1 OUT0
A0 CLK0
GATE0
/CS
200H
1MHH
时钟源
+5V
逻辑笔
监测秒信号
系统总线
L7
··
··
··
L0
210H
8255
D7
·· PC D0
/RD
/WR
A1
A0
/CS PA0
系统总线
SIR0
单脉冲S10
总线
开放区
MIR5
单脉冲S9
查询
秒周期
3 硬件电路图
4 外围接口模块硬件电路功效描述
(1)8259A芯片引脚图 (2)8255芯片引脚图
功效:8259A芯片用于管理可屏蔽中止, 功效:PA口做输入,用于时钟在此试验中用于管理各路紧急呼叫请 信号电平检测,PC口作输出,
求信号。 用于状态显示。
(3)8254芯片引脚图
功效:做分频器,用于产生周期为1S时钟脉冲信号
5 主程序中关键变量说明
变量名称
内存单元
功效
Count1
0000H
用于设定主干道通行时间
Count2
0001H
用于设定从干道通行时间
CTR
0002H~0005H
用于存放四个状态字
LED
0006H~0020H
用于存放0-F字型码,以供数码管显示用
6 系统软件中各个子程序功效描述
子程序名称
入口参数
出口参数
功效 描述
INT5_PROC
无
无
MIR5对应中止服务子程序,当主干道有紧急呼叫时,主干道绿灯亮
INTS0_PROC
无
无
SIR0对应中止服务子程序,当支线道路有紧急呼叫时,支线道路绿灯亮
图3.3主程序步骤图(参考图3.1.(b))
8255初始化
PA为输入,PC为输出
8255PA输入状态字
修改查表指针
指向下一个状态
输出状态
主程序
8254初始化
CNT0为模式3,赋初值
CNT1为模式2,赋初值
PA0=0?
N
Y
8255PA输入
PA0=0?
N
Y
8255 PC为输出
第一个信号状态字
8259初始化(一)
MIR5屏蔽字11011011
SIR0屏蔽字11111110
8259初始化(二)
MIR535H类型向量表
SIR070H类型向量表
开中止STI
查询PA0
7 主程序步骤图
8 程序清单
IO_8255 EQU 210H
IO_8253 EQU 200H
DATA SEGMENT
ORG 0000H
COUNT1 DB 0
COUNT2 DB 0
CTR DB 0CH,14H,21H,22H
LED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
CLI
MOV AX,DATA
MOV DS,AX
MOV DX,IO_8255 ;8255初始化,A口输入,B口输出,C口输出
ADD DX,3
MOV AL,10010000B
OUT DX,AL
MOV DX,IO_8253 ;8253 CNT0初始化,工作于方法3,BCD码计数
ADD DX,3
MOV AL,00110111B
OUT DX,AL
MOV DX,IO_8253 ;CNT0写入初值10000,将1MHzclk信号转变成100Hz
MOV AL,0
OUT DX,AL
OUT DX,AL
MOV DX,IO_8253 ;8253 CNT1初始化,工作于方法3,二进制计数
ADD DX,3
MOV AL,01010110B
OUT DX,AL
MOV DX,IO_8253 ;CNT1设置初值,初值为100,得到周期为1秒脉冲信号
INC DX
MOV AL,100
OUT DX,AL
;---设置386主8259中止屏蔽字---
IN AL,21H
AND AL,11011011B ;开放IR5中止和IR2
OUT 21H,AL
IN AL,0A1H
AND AL,11111110B ;开放IR0
OUT 0A1H,AL
;---设置中止向量表---
PUSH DS
MOV AX,0
MOV DS,AX
;---设置MIR5对应中止向量---
LEA AX,CS:INT5_PROC
MOV SI,35H
ADD SI,SI ;找到中止向量起始地址
ADD SI,SI
MOV DS:[SI],AX
PUSH CS
POP AX
MOV DS:[SI+2],AX ;将中止服务程序段地址存入中止向量
;---设置MIR5对应中止向量---
LEA AX,CS:INTS0_PROC;AX指向SIR0中止程序入口地址
MOV SI,70H
ADD SI,SI
ADD SI,SI
MOV DS:[SI],AX
PUSH CS
POP AX
MOV DS:[SI+2],AX
POP DS ;还原DS
STI ;开中止
;--若没有中止---
DDD:MOV DX,IO_8255
IN AL,DX ;取出8255Ao
AND AL,01H
CMP AL,0
JZ DDD
CIRCLE:
LEA BX,CTR
MOV COUNT1,8 ;COUNT赋初值5,计时8S
MOV DX,IO_8255
ADD DX,2
MOV AL,[BX]
OUT DX,AL ;C端口输出第一个状态
LEA SI,LED
MOV CL,COUNT1
MOV CH,0
ADD SI,CX
MOV AL,BYTE PTR [SI]
MOV DX,IO_8255
ADD DX,1
OUT DX,AL ;B端口输出,使LED显示出对应数
MAIN1:MOV DX,IO_8255
IN AL,DX ;取出8255Ao
AND AL,01H
CMP AL,0
JNZ MAIN1
MAIN2:MOV DX,IO_8255
IN AL,DX
AND AL,01H
CMP AL,01H
JNZ MAIN2
DEC COUNT1
LEA SI,LED
MOV CL,COUNT1
MOV CH,0
ADD SI,CX
MOV AL,BYTE PTR [SI]
MOV DX,IO_8255
ADD DX,1
OUT DX,AL ; B端口输出,使LED显示出对应数
MAIN3: MOV DX,IO_8255
IN AL,DX ; 取出8255Ao
AND AL,01H
CMP AL,0
JNZ MAIN3
CMP COUNT1,2 ; 判定是否达成最终一秒
JNZ MAIN2
MAIN4: MOV DX,IO_8255
IN AL,DX ; 取出8255Ao
AND AL,01H
CMP AL,1
JNZ MAIN4
INC BX
MOV DX,IO_8255
ADD DX,2
MOV AL,[BX]
OUT DX,AL ;C端口输出下一个状态
DEC COUNT1
LEA SI,LED
MOV CL,COUNT1
MOV CH,0
ADD SI,CX
MOV AL,BYTE PTR [SI]
MOV DX,IO_8255
ADD DX,1
OUT DX,AL ; B端口输出,使LED显示出对应数
MAIN5: MOV DX,IO_8255
IN AL,DX
AND AL,01H
CMP AL,0
JNZ MAIN5
MAIN6: MOV DX,IO_8255
IN AL,DX ; 取出8255Ao
AND AL,01H
CMP AL,1
JNZ MAIN6
INC BX
MOV COUNT2,5
MOV DX,IO_8255
ADD DX,2
MOV AL,[BX]
OUT DX,AL ;C端口输出下一个状态
LEA SI,LED
MOV CL,COUNT2
MOV CH,0
ADD SI,CX
MOV AL,BYTE PTR [SI]
MOV DX,IO_8255
ADD DX,1
OUT DX,AL ; B端口输出,使LED显示出对应数
MAIN7: MOV DX,IO_8255
IN AL,DX ; 取出8255Ao
AND AL,01H
CMP AL,0
JNZ MAIN7
MAIN8: MOV DX,IO_8255
IN AL,DX
AND AL,01H
CMP AL,01H
JNZ MAIN8
DEC COUNT2
LEA SI,LED
MOV CL,COUNT2
MOV CH,0
ADD SI,CX
MOV AL,BYTE PTR [SI]
MOV DX,IO_8255
ADD DX,1
OUT DX,AL ; B端口输出,使LED显示出对应数
MAIN9: MOV DX,IO_8255
IN AL,DX ; 取出8255Ao
AND AL,01H
CMP AL,0
JNZ MAIN9
CMP COUNT2,2 ; 判定是否达成最终一秒
JNZ MAIN8
MAIN10:MOV DX,IO_8255
IN AL,DX ; 取出8255Ao
AND AL,01H
CMP AL,1
JNZ MAIN10
INC BX
MOV DX,IO_8255
ADD DX,2
MOV AL,[BX]
OUT DX,AL ;C端口输出下一个状态
DEC COUNT2
LEA SI,LED
MOV CL,COUNT2
MOV CH,0
ADD SI,CX
MOV AL,BYTE PTR [SI]
MOV DX,IO_8255
ADD DX,1
OUT DX,AL ; B端口输出,使LED显示出对应数
MAIN11:MOV DX,IO_8255
IN AL,DX
AND AL,01H
CMP AL,0
JNZ MAIN11
MAIN12: MOV DX,IO_8255
IN AL,DX ; 取出8255Ao
AND AL,01H
CMP AL,1
JNZ MAIN12
JMP CIRCLE
;-----设置MIR5对应中止服务子程序-----
INT5_PROC PROC FAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX ;保护现场
QUERY1:LEA BX,CTR
MOV AL,[BX]
MOV DX,IO_8255
ADD DX,2
OUT DX,AL ;MIR5有中止请求,则让主干道绿灯亮,即C口输出第一个状态
MOV CX,3000 ;延时一段时间
Y5:MOV DI,1000
Y4:DEC DI
JNZ Y4
LOOP Y5
ADD BX,2
MOV AL,[BX]
OUT DX,AL ;恢复到之前第三状态
MOV AL,20H ; 向主8259MIR5发送中止结束命令
OUT 20h,AL
POP DX
POP CX
POP BX
POP AX ;恢复现场
STI
IRET
INT5_PROC ENDP
;-----设置SIR0对应中止服务子程序-----
INTS0_PROC PROC FAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX ;保护现场
QUERY2:LEA BX,CTR
ADD BX,2
MOV AL,[BX]
MOV DX,IO_8255
ADD DX,2
OUT DX,AL ;SIR0有中止请求,则让支线路绿灯亮,即C口输出第三个状态
MOV CX,3000 ;延时一段时间
Y7:MOV DI,1000
Y6:DEC DI
JNZ Y6
LOOP Y7
LEA BX,CTR
MOV AL,[BX]
OUT DX,AL ;恢复到原来第一状态
MOV AL,20H ; 向主8259MIR5发送中止结束命令
OUT 20h,AL
MOV AL,20H ; 向从8259SIR0发送中止结束命令
OUT 0A0h,AL
POP DX
POP CX
POP BX
POP AX ;恢复现场
STI
IRET
INTS0_PROC ENDP
CODE ENDS
END START
9 系统调试运行结果说明、分析所出现得问题,设计体会和提议
(1)此次试验达成了预期效果,试验成功!
(2)在调试过程碰到问题及处理方法
问题1:在实施中止服务程序过程中,从片中止在处理完成后无法回到原来断点。
处理方法:在实施从片中止服务程序时,在发送中止结束命令时只发送了从片中止结束命令。也应该加上对主片中止结束命令,因为从片中止请求是经过主片发送给CPU,也占用了主片,所以也需要对主片发送中止结束命令。
问题2:在实施完中止服务程序以后,回到断点怎样保持其原来中止时计数不变?
处理方法:在实施完中止服务程序以后,需要实施一条回到原来状态程序,使之不仅能回到断点,而且也能延续其原来计时。
(3)设计评价:此次设计采取了LED数码管显示倒计时,较为人性化,不过在显示代码部分并未采取调用函数,使得程序较为繁琐。不过本程序主,从干道亮灯时间和中止时间均可调,适适用于路况不一样多种道路。
10 结论及设计体会
程序正常运行,状态转换正确,中止响应正确,倒计时显示正确,达成了试验要求。
设计体会:这次大试验设计,不仅使我意识到自已对于以往知识掌握并不是很牢靠,更让我意识到自己不足。经过这段时间学习,我对可编程器件8255,8259,8253有了更深认识,掌握了其使用原理及编程方法,而且复习了汇编语言。这不仅仅帮我顺利完成了设计试验,更能帮助我在计算机原理理论考试中取好成绩!在试验过程中,经过不停调试,不停犯错,不停修改,提升了我处理编程问题能力,学会并掌握了调试方法。
之前做接口部分试验时,因为理论课上还没讲,自己了解不好,在使用中要么常常碰到问题,要么成功了却不知其所以然。在全书学完以后做设计试验时,才恍然大悟,所以理论课能早点讲话,我认为此次设计试验会完成愈加快速和出色。
最终,衷心感谢陈老师一个学期以来悉心教育和耐心指导!
参考文件
计算机原理综合试验教程[M]. 秦晓梅,陈育斌. 大连理工大学出版社,.
展开阅读全文