微机8086红绿灯系统设计详细设计.docx
- 文档编号:5738161
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:12
- 大小:265.11KB
微机8086红绿灯系统设计详细设计.docx
《微机8086红绿灯系统设计详细设计.docx》由会员分享,可在线阅读,更多相关《微机8086红绿灯系统设计详细设计.docx(12页珍藏版)》请在冰豆网上搜索。
微机8086红绿灯系统设计详细设计
生物医学工程学院
(医学信息专业)
信息技术设计2报告
课程设计名称
十字路口交通灯控制系统设计
摘要
十字道口的红绿灯是交通法规的无声命令,是司机和行人的行为准则。
十字道口的交通红绿灯控制是保证交通安全和道路畅通的关键。
当前,国内大多数城市正在采用“自动”红绿交通灯,它具有固定的“红灯—绿灯”转换间隔,并自动切换。
但是,实际上不同时刻的车辆流通状况是十分复杂的,是高度非线性的、随机的,还经常受人为因素的影响,例如在救护车以及警车开过的情况下,交通灯应当为其开辟“绿色通道”,使其畅通无阻。
本系统采用8253定时器计数,8255并口控制,的交通灯演示系统。
设计一个用于十字路口的交通灯管理系统,分东、西、南、北四个通行方向,东西和南北方向各有一组红、绿灯用于指挥交通;红、绿的持续时间分别为20s,周而复始。
因为南北向和东西向交通灯是对称的,所以我们从南北向和东西向各取一个交通灯来进行控制。
关键词:
8086CPU红绿灯控制系统82558253
1.系统方案选择与论证
1.1任务
设计并制作一个十字路口红绿灯控制系统。
交通信号灯的控制:
(1)通过8255并口来控制LED发光二极管的亮灭。
(2)输出为0则亮,输出为1则灭。
(3)利用8253定时来控制变换时间。
1.2要求
该系统是某十字路口交通灯控制系统,分东、西、南、北四个通行方向,东西和南北方向各有一组红、绿灯用于指挥交通,红、绿的持续时间分别为20s,周而复始。
利用8255,8253,等接口电路。
红、绿灯可使用试验箱上的发光二极管进行模拟。
系统设计时,利用8253芯片的一个计数器分别作为东西和南北计时器,当计时20s时引起绿、红灯的变化。
1.3系统基本方案
1.3.1各种方案选择及论证
1、方案选择
根据题目要求可知,东西方向的绿灯与南北方向的红灯工作状态相同,而东西方向的红灯与南北方向的绿灯工作状态相同。
两种工作状态之间切换的时间间隔为20秒。
因此,正确设置两种工作状态之间的延时是解决问题的关键。
而红绿灯的控制,可以简单的按照题目要求,由8255芯片的输出驱动LED灯即可实现。
至于延时方法,存在两种实现方案可以选择。
一种是使用软件延时,另一种是接入8253芯片,由8253芯片的计数器提供延时。
第一种方案,使用硬件延时,利用的是8253芯片的计数功能。
通过8253芯片计数器的级联,可以方便的得出多种不同的延时值。
由于是硬件延时,即使是移植到其他芯片,只需要保证接入8253芯片的时钟周期不变,程序几乎无需改动就可以改动。
如果要更改延时时间,也可以很轻易地计算出新的计数值。
第二种方案,使用软件延时,用汇编语言写一个不断循环的子程序。
然后通过控制循环次数和循环时间来控制延时时间。
这种方法的优点是不需要使用额外的硬件,再连线上比较简单。
但是,如果使用软件延时,前提是必须知道系统的时钟周期,然后通过计算得出空指令执行的次数。
因此软件延时需要依赖CPU芯片,程序移植到不同的芯片上或者延时时间改变都需要重新计算空指令执行的次数,不便于实际使用,而且延时不够准确。
其次,使用8253芯片也可以有几种不同的具体实现方案。
方案1,使用方式3输出周期为20秒的方波,然后利用8253芯片的锁存功能将计数值锁存,然后通过不断查询的方法读取计数值,判断8253是否计数完毕。
这个方案简单,但是由于实验箱上的提供的时钟周期都比较大,只用一个计数器无法实现,需要用两个计数器进行级联。
在硬件上的连线比较复杂。
方案2,使用方式3输出周期为40秒的方波,将计数器的输出连接到8255芯片,通过不断读取计数器的输出,一旦前后两次读取到的电平相反,则表明定时20秒时间到达。
这个方案与方案1类似,需要用两个计数器进行级联。
但是它比方案1简单之处在于判定方式比较简单。
而且也比方案1准确。
方案3,循环使用方式0,将计数器的输入连接到8255芯片,由于8253芯片的计数器工作在方式0时输出一个负脉冲,即只有在计数时才输出低电平,因此可以通过检测计数器的输出知道计数是否结束。
假设每一次循环计数器输出一个0.1秒的负脉冲,则每次检测到高电平,即计数结束后,重新对8253的计数器赋予初值,使其重新计数,循环200次的话,就可以得到200次*0.1秒/次=20秒的延时。
方案4,方式3和方式0级联使用。
首先令8253的计数器0工作在方式3,输出一个0.1秒的方波。
将计数器0的输出方波连接到计数器1的CLK端,作为计数器1的时钟脉冲信号。
然后令计数器1工作在方式0下,计数值为200,即可在计数器1的输出端得到一个20秒的负脉冲。
将计数器1的输出端与8255芯片的端口相连,只要检测到计数器1输出高电平,则表示20秒延时到达。
通过上述的分析,结合题目的要求和硬件的实际情况,决定使用8253芯片,而且选择方案3来实现20S的延时。
1.3.2 系统的最终方案
通过并行接口芯片8255和8086计算机的硬件连接,以及通过8254延时的方法,来实现十字路口交通灯的模拟控制。
南北向和东西向红绿灯接在8255的A口,PC0控制开关,PC7判断是否已经延时20s了。
8086工作在最小模式,8253用计数器0来计数,第0个通道的门控端接+5V,CLOCK0接实验箱上的CLK4(375KHz),8086通过检测PC7是否有高电平来判断是否20S定时到。
定时时间到了后,就对LED灯的状态进行翻转,东西方向亮红灯,南北方向亮绿灯。
2.系统硬件设计
2.1电路原理与电路图,实验系统接线图
设计思路框图:
2.2主要芯片工作原理
2.21.8255芯片的内部结构及引脚
8255可编程外围接口芯片是Intel公司生产的通用并行I/O接口芯片,它具有A、B、C三个并行接口,用+5V单电源供电,能在以下三种工作方式下工作:
方式0—基本输入/输出方式
方式1—选通输入/输出方式
方式2—双向选通输入/输出方式
8255引脚图如图3.2示,各引脚功能如下。
D7~D0——与CPU侧连接的八条双向数据线;
WR(低电平有效)——写输入信号;
RD(低电平有效)——读输入信号;
CS(低电平有效)——片选输入信号;
A0、A1——片内寄存器选择输入信号;
PA7~PA0——A口外设双向数据线;
PB7~PB0——B口外设双向数据线;
PC7~PC0——C口外设双向数据线;
RESET——复位输入信号
8255工作方式控制字和C口按位置位/复位控制字格式如上图所示:
8253的基本功能
(1)3个独立的16位计数器,最大计数范围为0~65535;
(2)每个计数器均可以按二进制或二—十进制计数;
(3)计数器速率可达2MHz;
(4)可编程6种不同的工作方式;
(5)所有输入和输出都与TTL兼容。
8253具有较好的通用性和使用灵活性,几乎适合于任何一种微处理器组成的系统。
8253的内部结构图
8253的工作方式
(1)、方式0——计数结束中断方式
(2)、方式1——可编程的单稳态触发器
(3)、方式2——比率发生器、分频器
(4)
、方式3——方波发生器
(5)、方式4——软件触发选通方式
(6)、方式5——硬件触发选通方式
8253的控制字
3.系统软件设计
3.1系统主程序的设计
主程序中主要是通过初始化8255,然后将PA口设置成为输出口,将PA口与LED灯连接起来。
首先判断开关是否有打开,当开关没有打开的时候就在不停地等待开关打开。
当开关打开后,就立刻进入赋值状态。
即将PA口的输出为10100101B。
通过延时子程序,使这个状态保持20S,然后灯自动变成另外一个状态,即PA口的输出变成01011010B。
然后这样子不断地重复,使灯的状态在不停地变化。
3.2延时子程序的设计
为了追求定时的准确性,本程序放弃了软件延时的方法,改用8253定时。
这样,就能够使定时更为准确,出现错误的机会也会更小了。
由于实验箱上有4种时钟信号的频率,我选用了最小的那个(375KHz),同时我只用了一个计数器0,并让其工作在方式0中。
用计数器0延时0.1S这样重复200次就能够准确实现延时20S的效果了。
这种做法就是简单,方便,软硬结合。
对于硬件的要求和软件编程的要求都是比较低的。
而且很容易检查出错误在哪里。
3.3检测开关是否打开子程序
该子程序的功能是检测开关是否打开了。
如果开关打开了,则继续工作,如果开关没有打开,就将灯全部熄灭。
并一直等待直到开关打开。
本系统是用PC0读取开关的状态,并且用BL记录灯在熄灭之前的状态,只要开关一打开,就能够立刻恢复开关关闭前的状态。
4.调试与分析
刚开始设计这个系统的时候,只是单纯的想用一个延时子程序来实现20S的延时,从而实现老师题目的要求。
但是后来发现,用软件延时的方式并不是很可靠。
结合实验箱上的芯片,最后选择了用8253来进行延时。
由于8253共有3个计数器,而且每个计数器都有6种工作方式。
因此刚开始的时候在选择用什么方式来进行延时确实花费了一定的时间。
最终还是确定了选择只用一个计数器,并且是工作在方式0,然后用软件设置重复200次就能够非常简单的实现延时20S的效果了。
虽然在动手开始写程序的时候已经尽量把思路理清,但是在写的过程中还是出现不少问题。
(1)刚开始的时候弄错了开关的状态,导致程序执行后一直都在检测开关的状态,无法正常运行。
后来看清楚了实验箱开关的状态,才让程序能够继续执行下去。
(2)程序刚开始的时候能够实现对灯的亮灭的控制,但是灭灯要等20S后才能实现,达不到题目的要求。
因此把检测开关状态改写成为了一个子程序,分别在程序一开始的时候,还有延时的时候都分别调用检测子程序,这样子就能够实现了对LED灯亮灭的实时控制,从而达到了题目的要求。
(3)在编程的时候一定要注意相关管脚对应的地址,不然即使你的程序是对的,在实验箱上调试的时候也有可能会出现错误。
同时在调试程序之前一定要确保硬件设备的正确。
5.收获与体会
本次实验由我自己独自完成,在这个过程中使我受益匪浅。
不仅训练了我查找资料的能力,更是一次很好考察所学的汇编语言知识和微机原理知识。
通过此次课程设计的锻炼,自己的动手能力有了很大的提高,查找问题、解决问题的能力也有了相应的进步。
在编程的中途也遇到了非常多自己当时无法解决的问题。
但是经过了几个同学的帮助,就把自己找不到的错误找出来了,可能这就是所谓的旁观者清吧。
在进行软件设计的时候,一开始就已经能够很好的实现出来了。
但是为了追求更好的效果,就在不停的对程序进行修改。
总的来说,本次设计有苦也有甜。
设计思路是最重要的,只要你的设计思路是成功的,那你的设计已经成功了一半,因此我们应该在设计前做好充分的准备。
同时在实践的过程中,一定不能半途而废,或者是中途改设计思路。
因为这样不仅会浪费大量的时间与精力,还会让你自己没有了一往直前的勇气。
因此,在做这些设计的时候一定需要耐心和勇气去克服在中途遇到的困难和阻力。
同时熟练地掌握课本上的知识,这对试验中出现的问题进行分析解决也是相当重要的。
这次设计留给我印象最深的是要成功地完成一个设计,必须要有耐心,更要有坚持的毅力。
6参考资料
[1]微型计算机原理与接口技术李伯成编清华大学出版社2008.9
[2]EL-MUT-
型微机实验系统说明书
附录1(硬件电路原理图):
附录2(主要程序):
assumecs:
code
codesegmentpublic
org100h
start:
movdx,04a6h;8255的状态控制字
moval,10001011b;8255的初始化
outdx,al
movdx,04a0h;8255的A口初始化,将所有灯都灭了
moval,11111111b
outdx,al
movbl,10100101b;东西绿灯亮,南北红灯亮
calljiance
again:
movdx,04a0h;8255的A口
moval,bl
outdx,al
callyanshi;调用延时子程序
calljiance;检测开关是否打开
;movdx,04a0h
notbl
;moval,bl;东西红灯亮,南北绿灯亮
;outdx,al
;calljiance;检测开关是否打开
;callyanshi;调用延时子程
jmpagain;重复
yanshi:
movdx,04b6h;延时子程序
moval,00110000b
outdx,al
movcx,200;重复200次,共延时20s
chong:
movax,37500;计数初值
movdx,04b0h
outdx,al
moval,ah
outdx,al
movdx,04a4h
next:
inal,dx
testal,80h
jznext;判断0.1s的延时时间是否到了
calljiance;检测开关是否打开了
loopchong;循环200次
ret
jiance:
pushax
pushdx
movdx,04a4h;检测开关是否打开
wait:
inal,dx
testal,01h
jzon
movdx,04a0h
moval,11111111b
outdx,al
movdx,04a4h
jmpwait
on:
movdx,04a0h
moval,bl
outdx,al
popdx
popax
ret
codeends
endstart
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 8086 红绿灯 系统 设计 详细