出租车自动计价器微机实验及课程设计报告.docx
《出租车自动计价器微机实验及课程设计报告.docx》由会员分享,可在线阅读,更多相关《出租车自动计价器微机实验及课程设计报告.docx(34页珍藏版)》请在冰豆网上搜索。
出租车自动计价器微机实验及课程设计报告
东南大学自动化学院
《微机实验及课程设计》
课程设计报告
综合测试题六:
出租车自动计价器
姓名:
学号:
专业:
自动化实验室:
运算机硬件技术
组别:
同组人员:
设计时刻:
2021年05月16日——2021年5月28日
评定成绩:
审阅教师:
一.课程设计目的与要求…………………………………………………………………..1
二.方案论证与原理设计……………………………………………………………………1
三.详细设计…………………………………………………………………………………2
四.方案实现与测试…………………………………………………………………………4
五.分析与总结………………………………………………………………………………5
一.课程设计目的与要求
一、课程设计目的
(1)巩固已学的微机原理与接口的大体知识;
(2)锻炼自己分析问题和解决问题的能力;
(3)为通过本课程设计让学生更好地将所学知识进行应用,更深刻地明白得微机原理与接口课程的知识。
二、大体要求
设计一个出租车自动计价器,计费包括起步价、行车里程计费、等待时刻计费三部份,用三只数码管
显示总金额,最大值为元,起步价元,3千米之内按起步价计费,超过3千米,来回双程可设每1千米元,单程每千米元,等待时刻每分钟元。
用两位数码管显示总里程数,最大值99km,
用两位数码管显示等待时刻(分钟),最大值99分钟。
用直流电机模拟出租车行驶,里程数与脉冲个数成
正比,每1km脉冲数100个(可设定),低于每小时5千米时作为等待状态。
(1)假设有计数比较器测定停车与行车状态,转换成开关信号。
开关输入行车状态,并用LED灯显示;同时有空车信号,可用于启动计价并用LED灯显示;
(2)记录里程数,等待时刻,计算总金额,并实时显示;
(3)模拟刹车和启动动作,动作后当即停车/行车;
(4)简单的标定和检错功能。
3、进一步设计要求
(1)打印输出功能,在屏幕上打印上下车时刻、里程、价钱;
(2)保留最近5次数据,可选择打印在屏幕上以便检查;
(3)有语音提示功能。
为实现课程设计中的要求,即完成一个出租车自动计价器,能够将出租车自动计价器系统分成5个模块:
操纵模块、计程、计时模块、计费模块和显示模块。
出租车自动计价器系统各模块如以下图所示:
显示模块
控制模块
计程模块
计费模块
计时模块
其中操纵模块用来输入出租车的行驶状态:
启动、行车、等待、停止;计程模块记录出租车行驶的路程;即便模块记录出租车等待时刻;计费模块实现出租车费用的计算;显示模块将总费用、行驶路程、等待时刻在屏幕和数码管上显示。
各个模块之间进行数据互换和处置,实现出租车自动计价器的功能。
三.详细设计
一、操纵模块
操纵模块要紧由逻辑电平操纵,将8255A口设置成输入方式,逻辑电平开关连接至8255A口,K1——K7依次如下表示:
K1:
K1=1表示出租车停止,退出系统;K1=0表示出租车处于计费状态
K2:
K2=0表示单程,每千米元;K2=1表示双程,每千米元
K3、K4、K5:
用于选择在数码管上显示何种数据,其中当K3=1时显示当前里程数;K3=0、K4=1时显示当前的等待时刻;K3=0,K4=0,K5=1时显示当前费用的高两位;K3=0,K4=0,K5=0时显示当前费用的低两位;
K7:
K7=1表示出租车启动开始计价;K7=0为空车信号
二、计程、计时模块
当直流电机1S输出的脉冲数大于50时,出租车处于行车状态,现在里程变量distance=distance+脉冲数/100。
当直流电机1S输出的脉冲数小于50时,出租车处于等待状态,此时等待时间变量waitTime加一。
3、计费模块
当计程模块或计时模块完成计数后,挪用计费模块,计算出当前的总费用。
计算公式如下:
若是是单程状态,那么
元distance<=3Km
总费用totalFee=
8+(distance-3)*+waitTime*distance>3Km
若是是双程状态,那么
元distance<=3Km
总费用totalFee=
8+(distance-3)*+waitTime*distance>3Km
4、显示模块
显示模块分为两部份,第一部份是屏幕显示,在屏幕上显示里程数、等待时刻和总费用,最近5次费用等等,这部份通过DOS中断将相关数据显示即可;第二部份是通过数码管显示,由于数码管只有两个,因此能够通过机械开关K3、K4、K5选择显示当前里程数、等待时刻和总费用的高低位,数码管的位选由8255芯片的C口PC0和PC1操纵,数码管的段选由8255芯片的B口操纵。
主程序流程图如下所示:
开始
从8255A口读入开关状态
是
否
单双程选择开关PA2=1?
3km以上的距按元/km收费
3km以上的距离按元/km收费
初始化程序
数值更新显示程序
数码管显示程序
是
PA1=1?
否
否
退出程序
1s定时信号PA0=1?
是
系统启动
调用显示程序
否
载客信号PA7=1?
是
计价更新程序
四.方案实现与测试
项目中利用到的芯片介绍如下:
一、8253芯片:
计数器0设置成方式3,计数器1设置成方式0,计数器0、1的计数初值均设置为1000,然后将两个计数器级联,计数器0输入1MHz的时钟信号,利用out1产生的1S的周期信号来产生1S的按时中断。
计数器2设置成方式0,将直流电机的脉冲输入到CLK2,用来计数直流电机的脉冲数。
8253连接方式如以下图所示:
二、8255芯片:
8255A口设置成输入,PA1-PA7接七位拨码开关用于输入开关状态,PA0接8253的OUT1,用来检测是不是有1s按时。
8255B口设置成输出,用于操纵八位数码管的段选。
8255C口设置为输出方式,用于操纵八位数码管的位选。
8255连接方式如下:
出租车自动计价器系统具体实现时以模块为单位进行编程、测试,共分为5个模块:
操纵模块、计程模块、计时模块、计费模块和显示模块。
其中操纵模块的测试即将开关量输入至8255A口,然后在debug状态下查看PA口的值或将其以ASCII码字符的形式输出到屏幕上显示查验,并观看程序是不是依照操纵要求进行跳转。
显示模块那么能够将屏幕显示的数值和数码管显示的数值进行对照,排除错误,其中屏幕显示程序和数码管动态显示程序能够别离独立进行调试;因为显示计程模块、计数模块和计费模块是直接的算数运算,因此能够直接通过屏幕显示或数码管显示的路程、等待时刻依据设定好的计算规那么进行计算,验证三个模块的数据处置是不是正确。
碰到的问题:
1、调试时发觉不能在软件中点击run运行,必需先点开始调试,再按F5,后来发觉点击run也是能够直接运行的,可是相当慢,调试时一样都采纳后一种方式进行了。
2、在实现数据的显示时一直只能显示16进制,显示和念书不方便,于是增加了二进制到BCD码再到十进制的转换。
3、直流电机脉冲检测不到,可能跟实验箱有关系,改换实验箱后取得了解决。
4、调速过快时状态改变不及时,计费显现错误,跟软件的延时有关,通过调整后取得了必然的好转,可是没能完全解决那个问题。
五.分析与总结
此课程设计验收时,我完成了5个大体要求和进一步设计要求
(1)、
(2)。
运行程序,通过机械开关操纵出租车的状态,LED灯L7显示行车状态:
L7灭表示空车,L7亮表示车里有人且自动计价器在计价。
能够通过调剂操纵直流电机的电位器来切换出租车的行驶状态。
在屏幕上将动态显示出当前的路程、等待时刻和费用,数码管的显示数据那么能够通过开关来切换。
通过量次查验和验证,本项目能正确地计算出租车行驶的费用,实现了出租车自动计价器的大体功能和部份扩展功能。
在这次课程设计中,先是进行了出租车自动计价器的系统设计,采纳化整为零的方式将其划分为5个子模块(操纵模块、计程模块、计时模块、计费模块和显示模块)来实现,参考了各类资料,当程序完成后,进行调试、排错。
在此进程中,我碰到了一些困难,当碰到这些问题时我一样是先用Debug进行断点、单步伐试,查找程序中的错误,假设并非程序问题,再进行硬件问题地排查。
比如数码管显示错误一样是程序问题,直流电机脉冲检测不到可能确实是硬件问题了。
在解决问题的进程中,我踊跃和同组同窗进行探讨、交流,相互学习,确保分工明确,显现错误明白问题在谁负责的部份,碰到不睬解的地址就一路查书查资料进行讨论,实在想不出来就去问教师。
我以为进行在课程设计中应注意一下几个方面:
(1)面对一个项目应该认真分析项目中的各类要求,然后进行系统设计,再化整为零,将其分为几个模块,进行模块化设计,如此有利于程序的编写与调试。
(2)能够采纳流程图的来理顺程序的运行进程,当画出流程图时,程序的思路就加倍清楚明了,也方便测试的时候理清跳转的关系,有利于测试的进行。
(3)当程序运行有错时应学会用Debug进行单步、断点调试,观看寄放器的值,观看程序是不是依照咱们所假想的一步步运行,若是排除软件问题,那么再进行硬件问题的检查。
(4)编程和测试需要耐心和细心。
咱们的计费程序到最后仍是有一些缺点,速度改变过快的时候程序反映不灵敏,有一定的延时,才能判定出当前状态是等待仍是行车,在编写和测试的进程中,咱们改动了数次的模块仍是常常显现问题,有时候修改事后终归成效加倍不行了,这时就需要咱们的耐心,不能急躁。
(5)应该踊跃和教师、同窗进行交流,在交流进程中将会收成颇丰。
(6)程序中注意加注释,如此便于他人明白得,也便于自己查错。
(7)注意版本信息,在代码中的提示信息显示时要写上自己的学号
(8)要有勇于质疑和认真试探的态度,设计要求中单程元/千米,双程元/千米,其实超级不符合实际,如此单程和双程岂不是总价一样了,固然咱们设计时并无多试探,仅仅是依照要求设置了参数,可是在验收时教师提出了那个问题,反映出来咱们还只是为了完成要求而做课程设计,并无对设计的题目进行认真的试探和研究。
微机实验课程到那个地址就接近尾声了,在这次课程设计中,除碰到上述技术问题,还有着很多麻烦,因为实验室的实验箱有一部份不大好,有时候咱们上一次已经实现了的功能,下次来换了一个实验箱就发觉又实现不了了。
咱们的那个项目的原理可能不是最难的,只是要连的线相对比较多,一旦测试不通过要换个箱子就要把线拆下来从头接线,实在费了很多功夫。
总的说来,这次课程设计专门好地锻炼了咱们分析问题、解决问题的能力,让咱们把握了一样项目地设计流程,使咱们学会如何对一个新项目进行分析、设计和实现的。
同时也让咱们对825五、8253等芯片有了更进一步地了解,将《微型运算机系统原理及应用》这门课程所学知识学以致用。
参考书目:
[1]东南大学《微机系统与接口》课程组,《微机实验及课程设计教程(试用版)》,2020年
[2]杨素行等,《微型运算机原理与应用(第2版)》,北京,清华大学出版社,2004年
附录:
附上代码
cursormacrorow,clm;***********移动光标位置到(row,clm)*******************io8255c第三口接LED灯用来表示行车等待
pushax
pushbx
pushdx
movah,2
movbh,0
movdh,row
movdl,clm
int10h
popdx
popbx
popax
endm
datasegment
ioportequ0ec00h-0280h
io8253aequioport+280h;8253计数器0地址
io8253bequioport+281h;8253计数器1地址
io8253cequioport+282h;8253计数器2地址
io8253dequioport+283h;8253控制寄存器地址
io8255aequioport+288h;8255A口地址
io8255cequioport+28ah;8255C口地址
io8255bequioport+289h;8255B口地址
io8255dequioport+28bh;8255控制寄存器地址
onekmequ100;一公里对应的脉冲数
waitnumequ50;参考脉冲数,小于此值即为等待
startpequ80;起步价8元
pricedb24;行车计费,元/公里
waitpequ2;等待计费,元/分钟
str0db'',0dh,0ah,'$';0DH,0AH,'$'中0DH和0AH别离是回车和换行的ASCII码,'$'是DOS功能挪用INT21H中9号功能要求的要显示字符串的终止标志。
str1db'****************Taxicalculatingfeemachine**************',0dh,0ah,'$'
str6db'***********************************************',0dh,0ah,'$'
str2db'*********PRICE:
yuan/kmyuan/min***************',0dh,0ah,'$'
str12db'*********PRICE:
yuan/kmyuan/min***************',0dh,0ah,'$'
str3db'TIME:
0(M)',0dh,0ah,'$'
str4db'DIST:
0(KM)',0dh,0ah,'$'
str5db'COST:
0(YUAN)',0dh,0ah,'$'
str7db'Fivecost:
',0dh,0ah,'$'
str11db'GETOFFTHETAXIend_time:
00:
00:
00',0dh,0ah,'$'
str14db'start_time:
00:
00:
00',0dh,0ah,'$'
pnumdw0;总脉冲数
distdb0;总里程
timedb0;等待时间
totaldw0000h;总费用
flagdb11h
xdkdb0
feeBufferdw0000h,0000h,0000h,0000h,0000h
feeCountdb0
leddb3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh;段码
buffer1db6,5h;寄存要显示的个位和十位
bzdw?
;位码
dataends
stackssegmentstack
db100dup(?
)
stacksends
codesegment
assumecs:
code,ds:
data,ss:
stacks
mainproc
start:
movax,data
movds,ax
movax,stacks
movss,ax
movdx,io8255a
inal,dx
testal,04h
jzbb
movbl,55h
movflag,bl
movbl,12;十进制的数字,表示来回双程能够设定为元/千米
movprice,bl
bb:
callini;调用初始化子程序
calldisp
begin1:
movdi,offsetbuffer1;设di为显示缓冲区
calllll;
movdx,io8255a
inal,dx
testal,02h
jnzexit;
testal,01h;判断是否有1秒钟定时中断信号,1为start启动
jzbegin1
callbegin
movbx,total
moval,bl
callextendBcd
movwordptr[buffer1],ax
movdx,io8255a
inal,dx
testal,00001000b
jzshowl1
moval,dist
callextendBcd
movwordptr[buffer1],ax
jmpshowl3
showl1:
movdx,io8255a
inal,dx
testal,00010000b
jzshowl2
moval,time
callextendBcd
movwordptr[buffer1],ax
jmpshowl3
showl2:
movdx,io8255a
inal,dx
testal,00100000b
jzshowl3
movbx,total
moval,bh
callextendBcd
movwordptr[buffer1],ax
showl3:
movdx,io8255a
inal,dx
andal,b;判断是否有1秒钟定时中断信号
jzbegin1
callgains
movbl,feeCount
cmpbl,9
jaaboveCount
jmpbelowCount
aboveCount:
movbl,0
belowCount:
movax,total
movbh,0
movfeeBuffer[bx],ax
incbl
incbl
movfeeCount,bl
jmpbegin1
exit:
calloff_texi
cursor11,0
movah,4ch;退出程序
int21h
mainendp
extendBcdproc
pushbx
pushcx
movbl,al
movcl,4
shral,cl
movah,al
andbl,00001111b
moval,bl
popcx
popbx
ret
extendBcdendp
lllproc
pushdi
pushbx
pushax
pushsi
movbh,2
ll:
movbyteptrbz,bh;数码管显示程序
pushdi
decdi
adddi,bz
movbl,[di];bl为要显示的数
popdi
moval,0
movdx,io8255c;消隐,全数关闭
outdx,al
movbh,0
movsi,offsetled;置led数码表偏移地址为SI
addsi,bx;求出对应的led数码
moval,byteptr[si]
movdx,io8255b;自8255B的口输出
outdx,al
moval,byteptrbz;使相应的数码管亮
oral,xdk;和0进行或运算
movdx,io8255c
outdx,al
movcx,3000
delay:
loopdelay;延时
movbh,byteptrbz
shrbh,1
jnzll
popsi
popax
popbx
popdi
ret
lllendp
gainsproc;计价更新程序
pushax
pushbx
pushcx
pushdx
movax,total
andax,ax
jzreturn2
movdx,io8253c;读取脉冲数
inal,dx
movbl,al
movdx,io8253a;计数器0重新计数
movax,1000
outdx,al
moval,ah
outdx,al
movdx,io8253b
movax,1000;计数器1重新计数
outdx,al
moval,ah
outdx,al
moval,0
movdx,io8253c;计数器2重新计数
outdx,al
moval,0ffh;计算脉冲数
subal,bl
incal
cmpal,waitnum;脉冲数小于参考值则为等待状态,否则为行车状态
jbwgain
movah,00000100b
movxdk,ah
movah,0
addpnum,ax
movax,pnum
movbl,100
divbl;用脉冲数除以100确实是千米数
callnum2bcds;计算行驶里程数并转化为2位压缩BCD码
movdist,al
jmpnewcost
wgain:
moval,0
movxdk,al
movdx,io8255c
moval,00100011b
outdx,al
moval,time;判断为等待状态,等待时间加1
callbcd2num
incal
callnum2bcds
movtime,al
jmpnewcost
return2:
jmpreturn
newcost:
moval,dist;计算当前总金额
callbcd2num
movtotal,startp
cmpal,3
jbecost2
subal,3
movbl,price;大于3千米的花费计算
mulbl
addtotal,ax
cost2:
moval,time;加上停车费的计算
callbcd2num
movah,0
movbl,waitp
mulbl
addax,total
callnum2bcdl
movtotal,ax
calldisp;数值更新
return:
popdx
popcx
popbx
popax
ret
gainsendp
;*********************2位紧缩BCD码转换为十进制数***************************
bcd2numproc
pushbx
pushcx
movbh,al
movcl,4
shral,cl
movbl,10
mulbl
andbh,00001111b
addal,bh
popbx
popcx
ret
bcd2numendp
commaproc
pushax
pushdx
movah,2
movdl,'.'
int21h
popdx
popax
ret
commaendp
;*********************************显示程序*******************************
showproc
callshow1
cmpdl,1