微机课程设计停车场出入管理系统.docx
《微机课程设计停车场出入管理系统.docx》由会员分享,可在线阅读,更多相关《微机课程设计停车场出入管理系统.docx(26页珍藏版)》请在冰豆网上搜索。
微机课程设计停车场出入管理系统
微机课程设计—停车场出入管理系统
东南大学吴键雄学院
《微机实验及课程设计》
课程设计报告
停车场出入管理系统
姓名:
学号:
61011108
专业:
电类强化班实验室:
组别:
同组人员:
郑夏雯
设计时间:
2013年5月28日——2013年6月4日
评定成绩:
审阅教师:
一.课程设计目的与要求……………………………………………………………………2
二.方案论证与原理设计………………………………………………………………………2
三.详细(机理)设计………………………………………………………………………3
四.方案实现与测试(或调试)……………………………………………………………7
五.分析与总结………………………………………………………………………………8
一.课程设计目的与要求(含设计指标)
1、设计项目名称:
停车场出入管理系统
2、目的:
1 巩固已学的微机原理与接口的基本知识;
2 加强个人编程能力,学会用汇编语言编写简单使用的系统
3 学会对8086,8253,8255等芯片的综合应用,实现对停车场的出入进行智能管理。
3、基本要求:
设计实现一停车场实时管理系统。
要求实时显示车位空闲情况(初值可修改,最多99辆),并分别控制A、B两个出入口。
每个出入口需要控制进出栏杆,并检测车辆进出,修改统计、显示车位空闲情况,并根据空闲情况控制进入。
用2*2个开关模拟两个出入口的车辆进出光电信号,2个LED灯模拟栏杆输出控制(亮代表有效,禁止出入)。
允许A口进B口出,反之亦是。
4、设计指标
1 要求用两个数码管实时显示车位空闲数目(00~99);
2 当有空位时,如有车辆到来,则在检测到信号(有效)后2秒钟打开进入栏杆,待车进入(信号
无效)后1秒钟放下栏杆,空车位数减1修改;若无空位,则车辆等待,直至有车位空出;
3 当有车出停车场时则在检测到信号后2秒钟打开出车栏杆,带车离开3秒钟放下栏杆,空车位数
加1修改;
4 车位发生变化时,PC上同步显示记录。
5、拓展功能
1 8*8点阵显示进出箭头,有车辆进出空时绿色,满时红色;
2 自动记录车将进出时间和属性;
3 考虑A、B、C、D四个出入口同时控制的情况,自动显示空位数,控制车辆
二.方案论证与原理设计(或基本原理)
对上述基本要求和设计指标进行需求分析,并基于所有的硬件资源,我们可以采用如下办法进行实现:
对于光电信号的采集(开关模拟)可以通过8255C口输入并进行判断,对于栏杆的控制同样可
通过8255C口进行输出控制;对于双数码管的显示,可以采用动态显示的方法,利用8255A口输出数
码管的七段译码,B口输出数码管的动态片选信号。
实时的空车位保存于通用寄存器中(如BX,BH
表示十位,BL表示个位);对于等待时间的控制,可以通过微机内部的延迟得到,但若想要得到精确
地时间,则可以利用8253定时器实现,具体做法是利用双通道计数器的级联实现对1MHz时钟信号的
1000*1000分频,得到1HZ的信号,即可得到1s精确延迟。
程序的基本框架如下:
1、对系统进行初始化,显示当前空车位数;
2、利用输入指令从8255C口低四位输出光电信号。
若检测到有效信号,则对其判断端口和进出性质;若无有效信号,则继续检测信号;
3、对有效信号的性质进行判定:
若为出信号,则执行出车程序(跳转指令实现);若为进信号,则先判断是否有空位(判断BX是否为0),若有空位,则执行进车程序,否则等待并检测是否有出车信号,至有空位出现;
4、出车时首先需要一定得延迟,然后输出控制打开栅栏信号,经过一定的延迟之后,检测出车信号是否无效(表明车已经出去),无效则输出关闭栅栏信号,修改计数值并显示,否则继续等待,重复检测。
进车和出车的流程差不多。
三.详细(机理)设计
1、系统工作流程图(如下所示)
2、关键部分程序片段
①端口信号的检测和判断控制
movbh,a[0];数码管的高位
movbl,a[1];数码管的低位
cmpbx,0000h;如果没有空车位就转向b
jzb
testal,08h;00001000
jzgoon1
calltesta1;a口开关1拨上,监测a口状态
goon1:
testal,04h;00000100
jzgoon2
calltesta2
goon2:
calltesta3
movbh,a[0]
movbl,a[1]
cmpbx,0909h
jzloops
b:
testal,02h;00000010
jzgoon3
calltestb1;b口开关1拨上,监测a口状态
goon3:
testal,01h;00000001
jzgoon4
calltestb2
goon4:
calltestb3
jmploops
exit:
movah,4ch
int21h
②入车程序控制,以A口为例
testa1procnear
pushax
pushdx;a口开关1拨上,监测a口状态
cmpstate_a,00h;空闲
jzstate_a1
cmpstate_a,01h;a口状态前
jztimecheck_a2s
jmpexit1
state_a1:
movdx,offsetmess8;提示有车准备进入
movah,09h
int21h
movstate_a,01h
movdx,io8253b;计数器通道1地址,计数器赋2s
moval,00h
outdx,al
moval,08h;clk1接的是out0,经过两次分频,得出两秒
outdx,al
jmpexit1
timecheck_a2s:
movdx,io8255d;8255B口地址
inal,dx
andal,02h;00000010b
jzexit1
movdx,offsetmess3
movah,09h
int21h
movstate_a,02h
movdx,io8255b;开灯(栏杆打开)
moval,0bh;00001011(C的5号口对应于栏杆信号)
outdx,al
exit1:
popdx
popax
ret
testa1endp
③出车程序控制,以A口为例
testb1procnear;b口开关1拨上,监测a口状态
pushax
pushdx
cmpstate_b,00h
jzstate_b1
cmpstate_b,01h
jztimecheck_b2s
jmpexit4
state_b1:
movdx,offsetmess9;提示有车准备离开
movah,09h
int21h
movstate_b,01h
movdx,io8253c;计数器赋2s
moval,00h
outdx,al
moval,08h
outdx,al
jmpexit4
timecheck_b2s:
movdx,io8255d
inal,dx
andal,01h
jzexit4
movdx,offsetmess4
movah,09h
int21h
movstate_b,02h
movdx,io8255b;开灯(栏杆打开)
moval,09h
outdx,al
exit4:
popdx
popax
ret
testb1endp
④两位数码管动态显示程序
dispprocnear;显示子程序
pushdx
movdi,offsetled
movbyteptrbz,bl
adddi,bz
moval,00
movdx,ioporta
outdx,al
moval,2;选择数码管,低位
movdx,ioportb
outdx,al
moval,byteptr[di];LED显示数字
movdx,ioporta
outdx,al
movcx,3000
delay2:
loopdelay2
movdi,offsetled
movbyteptrbz,bh
adddi,bz
moval,00
movdx,ioporta
outdx,al
moval,4;选择数码管,高位
movdx,ioportb
outdx,al
moval,byteptr[di];LED显示数字
movdx,ioporta
outdx,al
movcx,3000
delay3:
loopdelay3
popdx
ret
dispendp
四.方案实现与测试(或调试)
1、用TD调试工具对每个子程序模块进行单步断点测试,观察各寄存器,标志寄存器的状态是否正确,重点关注跳转指令处是否跳转正确。
对中断服务子程序模块的调试重点检查断点的现场保护和现场的恢复,观察堆栈段的压栈和出栈的情况。
2、整个程序连接起来,系统调试,对照流程图,确定各子程序的相互调用正确,条件转移正确,数码管的显示是否正确,是否能正常进入中断服务子程序和返回中断程序。
一切正常后,对系统的功能逐一验证,检测每一项功能是否能正确执行。
3、在程序的调试过程中,发现了原始程序中的一些小问题(如条件转移指令的跳转范围和修改计数值程序段等)并进行了更正。
单步调试时程序很好的按照设计要求运行,各项要求均符合(除了精确延迟,因为是单步调试),实现了预定的功能。
但是在动态运行时却出现了问题,主要表现在计数值不稳定,实际进出一次车却出现了进出几次的记录等等。
经过仔细分析发现可能是由于拨码开关存在抖动现象,而CPU的运行频率很高,因此微机实际捕捉到的开关状态跳转不止一次,这就导致了计数值的不稳定和记录的多次显示。
为此改用脉冲信号代替拨码开关进行光电信号的模拟(脉冲信号进行了消抖处理),动态运行程序后发现实验现象正常,各个功能均按要求得以实现。
每产生一次脉冲信号,空位数都会相应的减一或加一,同时PC机上显示相应的记录。
当按住脉冲开关不放时,对应的栅栏控制灯始终为暗(表示打开),同时计数值保持不变,PC机上不显示记录,这就表明车正在进入(或驶出)中,直至其完全进入(或离开)才进行相关操作,符合设计者的意图。
硬件实物图:
Pc显示:
五.分析与总结
该系统已经能够基本完成所有的需求功能,且运行稳定,因此具有一定的价值。
当然,程序中仍
然有待改进的地方。
主要如下:
原来的基本要求是需要2s和3s的精确延迟。
预先的设计也是如此。
原本是想通过8253定时器产生精确地1s定时,具体的实现办法是通过双通道计数器的级联对1MHz的输入信号进行1000*1000分频,得到1Hz的信号,如此便可得到1s的精确定时。
定时的结束不是通过中断处理,而是在计数过程中不断地对通道1的计数值进行检测,当其减小到0时表明一个周期结束。
但在实际运行过程中却出现问题,PC机警告程序中有无效的指令。
在和辅导老师讨论了之后觉得可能是由于通道1计数值处于0的时间太短(实际差不多应为1ms,按理应该足够了),于是又将其out1端接至通道2计数器的时钟端,这样只要通道2的计数减一(可以再每次计数前对其赋值为1,则只需判断其是否为0即可),就表明一个周期结束,且由于通道2计数的保持时间有1s,CPU有足够的时间进行判断。
但是在实际运行中PC机仍然是警告有无效指令。
无奈之下只能利用指令的延迟来进行模拟(loop指令)。
1 对于数码管的动态显示,由于需要不停地刷新数码管的片选信号,所以disp(显示)子程序就需
要不停执行。
但是程序中具有延迟片段(例如车进出时受到了延误,程序则要不停地进行判断),若时间过长则动态显示就会被中断,只会显示一位。
因此需要在程序段中不停地调用显示子程序(从源程序中可以看出)。
这方面有待改进。
2 对于系统的拓展功能,由于要求提的有点令人费解(如要求1、2),我没能理解,因此无法实现。
另外,对于拓展功能3,将两个出入口改为四个出入口,其他要求不变,因此只需在程序中添加四出入口的控制转移程序(安排原理和双口差不多)和对应的进出控制程序(这个可以复制双出口程序的代码,只需稍加改动即可)。
这里只需要注意一点,那就是C口8位需要全部用来作为输入,输入8个拨码开关的信号,因此8255的控制字要做对应的改变。
这里可以改用B口的高四位作栅栏的控制信号。
参考书目:
[1]杨素行,微型计算机系统及应用,清华大学出版社,北京,2007年11月
[2]东南大学《微机系统与接口》课程组,微机实验及课程设计教程(试用版2.0),东南大学初出版社,南京,2009年2月
附录:
datasegment
ioportequ0ec00h-280h;tpc卡中设备的io地址
io8253aequioport+280h;计数器通道0地址
io8253bequioport+281h;计数器通道1地址
io8253cequioport+282h;计数器通道2地址
io8253dequioport+283h;8253控制寄存器地址
io8255aequioport+288h;8255A口地址
io8255bequioport+28bh;8255控制寄存器端口地址
io8255cequioport+28ah;8255C口地址
io8255dequioport+289h;8255B口地址
prothequioport+290h;行选
protlrequioport+298h;红选
protlyequioport+2a0h;黄选
numdb3,4dup(0)
adb00h,00h;用于存放空闲车位的十位和个位
state_adb00h;标志a口状态,0表示空闲,1表示状态前,2标志状态中,3标志状态后
state_bdb00h;标志b口状态,0表示空闲,1表示状态前,2标志状态中,3标志状态后
leddb3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh;八段LED
copyrightDB'*******************************************************',0DH,0AH
DB'*southeastuniversity*',0DH,0AH
DB'*----------------------------------------------------*',0DH,0AH
DB'*systemonparkinglotmanagement*',0DH,0AH
DB'*version:
2013-06-02*',0DH,0AH
DB'*----------------------------------------------------*',0DH,0AH
DB'*YangyangZhengxiawen*',0DH,0AH
DB'*6101110861011308*',0Dh,0Ah
DB'*******************************************************',0Dh,0Ah,'$'
mess1db'Pleasedecidetheparksscalewithinputnum(00~99):
',0dh,0ah,'$'
mess2db'Illegalinput!
',0dh,0ah,'$'
mess3db'Thecarisentering...',0dh,0ah,'$'
mess4db'Thecarisleaving...',0dh,0ah,'$'
mess5db'Spaceavailable:
',0dh,0ah,'$'
mess6db'Sorry,theparkhasnospace!
',0dh,0ah,'$'
mess7db'Nocar',0dh,0ah,'$'
mess8db'Acarwantstoenter',0dh,0ah,'$'
mess9db'Acarwantstoleave',0dh,0ah,'$'
mess10db'errorinputsignals,pleasecheck8255inport',0dh,0ah,'$'
led_indb00h,18h,30h,7fh,7fh,30h,18h,00h;箭头进
led_outdb00h,18h,0ch,0feh,0feh,0ch,18h,00h;箭头出
led_nodb00h,03ch,5ah,99h,99h,5ah,3ch,00h;禁止
dataends
stackssegmentstack
db100dup(?
)
stacksends
codesegment
assumecs:
code,ds:
data,ss:
stacks
start:
movax,data;初始化寄存器
movds,ax
movax,stacks
movss,ax
movdx,io8253d;计数器0工作方式3
moval,36h;00110110,先写低字节再写高字节,方式3(方波发生器),二进制
outdx,al
moval,70h;01110000,计数器1,工作方式0
outdx,al
moval,0b0h;10110000,计数器2,工作方式0
outdx,al
movdx,io8253a;计数器0初值1024(第一次分频)
moval,00h
outdx,al
moval,04h
outdx,al
movdx,io8255b;8255设置为A口及C口高四位输出,B口及C口低四位出入
moval,83h;10000011设置A口及C口高四位输出,B口及C口低四位出入
outdx,al
movdx,offsetcopyright
movah,09h
int21h
again:
movdx,offsetmess1;提示信息
movah,09h;系统调用,在电脑屏幕上显示mess1
int21h
movdx,offsetnum;系统调用,从键盘输入初始的"空车位数"到缓冲区
movah,0ah
int21h
moval,num[2];判断输入数值是否符合条件
cmpal,30h
jberror
cmpal,39h
jaerror
moval,num[3]
cmpal,30h;小于0的话就转移到error
jberror
cmpal,39h;大于9的话就转移到error
jaerror
subal,36h;将ASCII码转换为数字
mova[1],al
moval,num[2]
subal,36h
mova[0],al
jmploops
error:
movdx,offsetmess2
movah,09h
int21h
jmpagain
error2:
movdx,offsetmess10
movah,09h
int21h
jmpagain
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
loops:
;主循环
callshow;调用数码管显示
calldisp_mat;点阵显示相关图示
movah,01;系统调用
int16h
jnzexit
movdx,io8255c;从8255C口读入数据
inal,dx
;------------------------------
cmpal,0fh;排除不可能输入的干扰,增加健壮性
jzerror2
;-------------------------------
movbh,a[0];数码管的高位
movbl,a[1];数码管的低位
cmpbx,0000h;如果没有空车位就转向b
jzb
testal,08h;00001000
jzgoon1
calltesta1;a口开关1拨上,监测a口状态
goon1:
testal,04h;00000100
jzgoon2
calltesta2
goon2:
calltesta3
movbh,a[0]
movbl,a[1]
cmpbx,0909h
jzloops
b:
testal,02h;00000010
jzgoon3
calltestb1;b口开关1拨上,监测a口状态
goon3:
testal,01h;00000001
jzgoon4
calltestb2
goon4:
calltestb3
jmploops
exit:
movah,4ch
int21h
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
testa1procnear
pushax
pushdx;a口开关1拨上,监测a口状态
cmpstate_a,00h;空闲
jzstate_a1
cmpstate_a,01h;a口状态前
jztimecheck_a2s
jmpexit1
state_a1:
movdx,offsetmess8;提示有车准备进入
movah,09h
int21h
movstate_a,01h
movdx,io8253b;计数器通道1地址,计数器赋2s
moval,00h
outdx,al
moval,08h;clk1接的是out0,经过两次分频,得出两秒
outdx,al
jmpexit1
timecheck_a2s:
movdx,io8255d;8255B口地址
inal,dx
andal,02h;00000010b
jzexit1
movdx,offsetmess3
m