出租车自动计价器微机实验及课程设计报告.docx

上传人:b****3 文档编号:27382922 上传时间:2023-06-30 格式:DOCX 页数:34 大小:125.11KB
下载 相关 举报
出租车自动计价器微机实验及课程设计报告.docx_第1页
第1页 / 共34页
出租车自动计价器微机实验及课程设计报告.docx_第2页
第2页 / 共34页
出租车自动计价器微机实验及课程设计报告.docx_第3页
第3页 / 共34页
出租车自动计价器微机实验及课程设计报告.docx_第4页
第4页 / 共34页
出租车自动计价器微机实验及课程设计报告.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

出租车自动计价器微机实验及课程设计报告.docx

《出租车自动计价器微机实验及课程设计报告.docx》由会员分享,可在线阅读,更多相关《出租车自动计价器微机实验及课程设计报告.docx(34页珍藏版)》请在冰豆网上搜索。

出租车自动计价器微机实验及课程设计报告.docx

出租车自动计价器微机实验及课程设计报告

 

东南大学自动化学院

 

《微机实验及课程设计》

课程设计报告

 

综合测试题六:

 出租车自动计价器

 

姓名:

学号:

专业:

自动化实验室:

运算机硬件技术

组别:

同组人员:

设计时刻:

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 初中作文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1