交通灯课程设计.docx
《交通灯课程设计.docx》由会员分享,可在线阅读,更多相关《交通灯课程设计.docx(15页珍藏版)》请在冰豆网上搜索。
交通灯课程设计
1
需求分析
在当今社会里,交通越来越发达,车辆也越来越来多,由此也带来了大量交通问题。
在本次课程设计中,我们针对现实生活中常看到的红绿灯,运用汇编语言及接口技术来
模拟十字路口的交通灯,对交通灯进行控制,并实现一定的功能。
我们通过一些接口芯片:
定时/计数器8253,并行接口8255A,中断控制器8259A
和8086计算机的硬件连接,通过8253定时及编延时子程序的方法(设备条件有限,不
能依靠纯硬件实现)、利用8259的中断功能及8255A并口输出数据功能做了一实时操作
系统,来模拟对十字路口交通灯的控制。
具体如下:
(1)用8253计时器来完成时间的设定;
(3)用8259中断控制器来进行紧急情况处理,如警车执行任务等情况;
(4)通过8255A并口来控制LED发光二极管的亮灭,输出为0则亮,输出为1则
灭;
(5)用8255来输出绿灯的倒计时间。
2
设计方案及分工
在这个方案里,我们将此设计分为5个模块,即:
实现电路设计、连接电路以及各模块
间整合的模块、实现交通灯循环的模块、对中断进行处理的模块、实现绿灯倒计时的显示模
块、实现夜间控制模块。
具体分工如下:
xx:
实现8253、电路设计、连接电路以及各模块间整合的模块
xx:
实现夜间控制模块
xx:
实现交通灯循环的模块
xx:
对中断进行处理的模块
xx:
实现绿灯倒计时的显示模块
我们想通过这次设计,具体实现以下功能:
以8086CPU为核心设计一个交通灯控制系统,通过8255并口来控制LED发光二级管
的亮灭,输出0为亮,输出一为灭;用8253来实现一个定时器(隔一定时间发生一边沿跳
变,引发8259中断);用8259来实现对中断的处理;
设有一个十字路口,东西方向与南北方向各有一个红绿灯,初始状态为东西路口的红灯
亮南北路口的绿灯,南北方向的路口通车,并显示南北路口绿灯的倒计时间。
延迟一定时间
之后,南北路口与东西路口都为黄灯亮,延迟一定的时间后,南北方向的红灯亮,东西路口
的绿灯两,东西方向的路口通车,并显示东西路口的绿灯倒计时间。
延迟一定时间后直接跳
变为东西方向的红灯亮,南北路口的绿灯亮。
如上所述循环一定次数后假设进入晚上,屏幕
上显示GoodNight!
此时这两个路口的黄灯开始闪烁,数码管清零并且闪烁。
延迟一定时间
后假设进入早晨并在屏幕上显示GoodNight!
并实现交通灯的循环。
如果遇到紧急情况,采
取紧急中断并且两个方向路口的红灯全亮确保紧急情况得到妥善处理,并且不管。
在紧急情
况中断处理模块里通过拨动按钮KK2来触发中断,使各个路口的灯全显示红灯,并在屏幕
上输出Waring!
中断完成后跳回原来的状态,继续运行。
3.
各个模块的实现
3.1交通灯循环模块(XX)
3.1.1
设计思想
十字路口分为南北方向和东西方向,各个方向有红黄绿三灯,其循环过程如下:
1:
东西方向路口的红灯亮,南北路口的绿灯亮;
2:
东西路口与南北路口都为黄灯亮;
3:
东西方向路口的绿灯亮,南北方向路口的红灯亮;
4:
不经过黄灯亮,直接跳变为状态1;
5:
按如上过程循环;
3.1.2流程图
图3-18255并口输出流程图
3.1.3具体实现
用8255控制交通灯的循环,具体状态如下(0:
灯亮1:
灯灭)
表1交通灯循环状态表
状态
D7(东西红)
D6(东西黄)
D5(东西绿)
D4(南北红)
D3(南北黄)
D2(南北绿)
D1
D0
1
0
1
1
1
1
0
1
1
2
1
0
1
1
0
1
1
1
3
1
1
0
0
1
1
1
1
4
0
1
1
1
1
0
1
1
8255初始化:
A口输出B口输出C口输出工作在方式0
8255控制字为:
10000000,即80H
3.2
实现绿灯倒计时模块(XX)
3.2.1
设计思想
十字路口在东西方向和南北方向各有一个绿灯倒计时显示,建一个Table存放字模。
当东西路口为绿灯时在第一个数码显示管上显示剩余时间。
首先让BX指向Table的首址,
将计数器中当前DL中的值赋给AL,通过相应的加减然后在Table中找出相应的字模通过
8255赋给数码显示管,本次课程设计用的是静态显示,当DL中的是发生变化时数码管上
显示的数字也随着变化,以次来实现在数码管上显示绿灯的倒计时间。
当南北路口为绿灯时,
过程与上面的描述类似。
3.3
实现夜间控制模块(XX)
3.3.1
设计思想
由于十字路口的交通灯是按一定的方式和固定时间进行循环的,并且每循环一次所
需时间为一秒,所以,根据C=T/L(C为白天交通灯循环的次数,T为白天(6:
00——24:
00)的总时间长度,L为交通灯循环一次的时间长度)可计算出白天交通灯循环的次数,由
白天交通灯循环的次数便可判断出是否让系统进入夜间控制,因此设计一个记录白天交通灯
当前循环次数的变量加以记录,并将此变量与预设白天循环次数进行比较即可。
当系统判断
出应进入夜间控制后,将四个方向的四部交通灯全部变为黄灯闪烁,并让四部计时器(LED)
于黄灯交替闪烁。
黄灯闪烁的次数根据C’=T’/L’(C’为夜间交通灯黄灯闪烁的次数,T’为夜
间(24:
00——6:
00)的总时间长度,L’为交通灯黄灯和计时器(LED)闪烁一次的时间
长度)计算得出,并将此值作黄灯闪烁的设定值,当黄灯闪烁次数与设定值相等时,系统便
转换为白天控制模式。
3.4
中断处理模块(XX)
3.4.1
设计思想
定时器8253连接着IRQ0,每当定时一定时间就可以触发IRQ0中断程序,也是主
程序;
同时IRQ7连接着一边沿触发,来处理应对紧急情况。
3.5
实现计数器模块(XX)
3.5.1
设计思想
由8253作为一定时器,每隔一定时间引发一次IRQ0中断,中断服务程序中有一变量
记录着时间值,从30H开始,依次累加,直到3AH,该值再变为30H。
依据这个值,系统
在每个值下会有着对应的状态。
如此往复,来实现对交通灯的模拟。
在这个值基础上,另有一变量,它在时间值走完一个时序循环,它自加一,当达到一定
数值,就会进入夜间模式。
当该模式完成时,该变量清零,再次进入正常工作模式。
3.5.2
流程图
等待
初始化
添IRQ0中间断量
初始化8255
初始化8259
初始化8253
初始化时间值
主程序流程图
4
源代码
DATASEGMENT
WEDW?
YKDB?
开始
添IRQ0中断向量
初始化8255
等待
初始化8259
初始化8253
初始化时间值
ZLCDB?
B2DB?
TIMEDW?
STRING1DB0AH,0DH,'GoodNight!
',00H
STRING2DB0DH,'GoodMorning!
',0AH,00H
STRING3DB0DH,'WARNING!
',0DH,00H
TABLEDB66H,4FH,5BH,06H
DATAENDS
STACKSEGMENTSTACK
DW64DUP(?
)
STACKENDS
CODESEGMENT;定义代码段
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
PUSHDS;DS:
00压栈
MOVAX,0000H
MOVDS,AX;置数据段
MOVAX,OFFSETIRQ0
ADDAX,2000H
MOVSI,0020H
MOV[SI],AX
MOVAX,0000H
MOVSI,0022H
MOV[SI],AX
MOVAX,OFFSETIRQ7
ADDAX,2000H
MOVSI,003CH
MOV[SI],AX
MOVAX,0000H
MOVSI,003EH
MOV[SI],AX
POPDS
MOVAL,80H;8255
MOVDX,63H
OUTDX,AL
MOVAL,0FCH;8259
OUT21H,AL
MOVAL,15H;8253
OUT43H,AL
MOVAL,0FFH
OUT40H,AL
MOVDL,30H
MOVZLC,30H
A1:
STI
JMPA1
IRQ0:
CALLWP
MOVAH,01H
MOVAL,DL
CMPAL,3AH
JNZA2
INCZLC
CMPZLC,32H;与换行数比较
JNZN1
CALLZPP;调用子程序
N1:
MOVAL,0DH;换行
INT10H
MOVAL,30H
A2:
INT10H
INCAX
MOVYK,AL;YK=AL
CMPDL,3AH;DL与3A比较
JNZW1;<>跳向W1
MOVDL,30H;相等则令DL=30H
W1:
MOVAH,DL
CALLWJJ;从B口输出
MOVAL,YK
MOVDL,AL
MOVAX,0120H
INT10H
MOVTIME,0099H;变量TIME赋值,延时子程序起作用
CALLDALLY
MOVAL,20H
OUT20H,AL
IRET
IRQ7:
movtime,0660h
MOVAL,01110111B
OUT61H,AL
MOVAH,06H
MOVBX,OFFSETSTRING3
INT10H
callDALLY
moval,20h
out20h,al
movtime,0020h
IRET
WJJ:
CMPAH,34H
JLHONG
CMPAH,35H
MOVAL,1111B
OUT60H,AL
JLHUANG
CMPAH,35H
JGLV
HONG:
MOVAL,7DH
MOVDX,61H
OUTDX,AL
MOVBX,OFFSETTABLE
MOVB2,0111B
CALLCHENXI
JMPXX
HUANG:
MOVAL,0BBH
MOVDX,61H
OUTDX,AL
JMPXX
LV:
MOVAL,0D7H
MOVDX,61H
OUTDX,AL
MOVBX,OFFSETTABLE
MOVB2,1110B
CALLCHENXI
ADDAH,06H
XX:
RET
ZPP:
PUSHDX
PUSHAX
MOVAL,1111B
OUT60H,AL
MOVAH,06H;显示晚上提示信息
MOVBX,OFFSETSTRING1;取STRING1的地址
INT10H;显示
MOVCX,08H
MOVTIME,0060H;变量TIME赋值,延时子程序起作用
ZP:
CALLWP
MOVAL,0BBH
MOVDX,61H
OUTDX,AL
CALLDALLY
MOVAL,0FFH
MOVDX,61H
OUTDX,AL
CALLDALLY
LOOPZP
MOVAH,06H;显示早上提示信息
MOVBX,OFFSETSTRING2
INT10H;显示
POPAX
POPDX
MOVZLC,30H
RET
WP:
PUSHAX
PUSHBX
CLI;屏蔽IRQ0
MOVAL,01H
OUT21H,AL
MOVAL,68H
OUT20H,AL
STI
MOVAL,48H
OUT20H,AL
MOVAL,00H
OUT21H,AL
POPBX
POPAX
RET
CHENXI:
PUSHAX
PUSHBX
MOVAL,B2
OUT60H,AL
SUBAH,30H
MOVAL,AH
XLAT
OUT62H,AL
POPBX
POPAX
RET
DALLY:
PUSHAX
MOVAX,TIME
MOVWE,AX
A3:
MOVAX,0560H
A4:
DECAX
JNZA4
DECWE
JNZA3
POPAX
RET
CODEENDS
ENDSTART
5
设计心得
通过本次课程设计,我们熟悉了芯片8253、8259、8255的功能和应用。
学会了用汇编
语言设计一个程序的方法。
虽然程序中有一部分是现成的,但我们还是通过查书或问老师的
方式读懂了它的思路。
在实现数码管显示数字的过程中,我们学会了先画流程图再编写程序
的良好习惯,它有利我们理清思路,更快更简洁地编写出程序。
在用到8259、8255芯片时,
通过编程进一步掌握了它们的功能。
本次课程设计提高我们的自学能力和合作精神。
在实现计数功能部分,可以用硬件也可以用软件实现,我们选择了硬件即通过8253来
实现。
在成功调试并运行后,我们不忘去尝试能否用软件实现。
在编程的过程中遇到了许多
细节方面的问题,我们通过讨论一起解决了一些问题。