基于C语言的出租车计价器程序设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录
1 前言 (3)
2 系统设计方案 (4)
2.1 系统的设计需求 (4)
2.2 系统的工作原理 (4)
3 系统硬件设计 (5)
3.1 单片机介绍 (5)
3.2 硬件组成 (8)
4 系统软件设计 (12)
5 仿真调试 (14)
6 结论 (16)
7 参考文献 (178)
8 心得体会及致谢 (20)
附录A 设计总图 (224)
附录B 源程序 (235)
1 前言
随着生活水平的提高,人们已不再满足于衣食住的享受,出行的舒适已受到越来越多人的关注[1]。

相对于公共汽车拥挤与缓慢以及私家车高昂的费用,出租车无疑是一种低价高质的出行交通工具。

近年来越来越多的人为了出行方便舒适愿意选择使用出租车,出租车行业得以快速发展[2]。

出租车计价器是出租车营运收费的专用智能化仪表,随着电子技术的发展,出租车计价器的技术在不断进步和提高[3]。

最初的计价器计费模式较为单一,不便于在不同的运营环境下选取不同的计费模式。

考虑到出租车行驶可能会出现从市区行驶到郊区或者行驶到偏僻地区,郊区或偏僻区打车的人少的现象,司机空车行驶返回成本较高,这时需要乘客为空车返回的路程承担一定的费用,这就需要区分单程/往返不同计价模式。

“单程”模式是指目的地在郊区或者比较偏僻的地方,到达目的地后打车的人比较少,需要乘客乘客承担一定的空车返回的费用;“往返”模式是指目的地在市区,到达目的地后还会有乘客乘车返回,这种情况下司机不需要空车返回,乘客不需要承担回程费用。

考虑到夜晚时出租车的灯光需要消耗能源以及司机夜间服务比白天较为辛苦,所以一般夜晚出租车的价格需要比白天高一点。

早期的出租车计价器均采用模拟电路和数字电路设计。

计价器整体电路的规模较大,需要器件多,容易出故障,难调试。

和模拟电路和数字电路设计相比而言,基于单片机进行设计的计价器,用较少的硬件和适当的软件相互配合就可以很容易的实现设计需求,硬件电路简单,稳定性好,灵活性强[4],通过软件编程就可以实现计费模式的切换。

2 系统设计方案
2.1 系统的设计需求
1、用数码管实时显示里程数及金额数。

2、出租车计价器计价器具有多种计费模式,白天/夜晚模式及单程/往返模式。

3、设计出租车计价器白天模式下起步公里数为3Km,价格为8元;若实际里程大于3Km,大于3Km的部分单程价格为2.4元/Km,返价格为1.6元/Km。

4、设计出租车计价器夜晚模式下起步公里数为3Km,价格为10元;若实际里程大于3Km,大于3Km的部分单程价格为3元/Km,返价格为2元/Km。

5、具有工作模式指示灯,指示当前工作模式状态。

出租车价目表如表1所示:
2.2 系统的工作原理
出租车计价是根据出租车所行驶的路程以及乘客乘车的方式综合计算的。

出租车行驶路程在起步里程内按照起步价收费,超过起步里程时超出起步里程的路程按照相应模式下的单价收取附加费用,最后收取起步价及附加费用的总和。

出租车的行驶路程可以通过车轮的周长乘以车轮旋转圈数得到。

然后经过系统对相关数据的计算处理得出总的路程及计价金额,最后再通过显示电路将相关信息显示出来。

本设计采用AT89C51单片机作为系统核心处理器,以A44E霍尔传感器作为里程测量仪,设计控制按键以便选择相关的计费模式,并采用74HC138译码器进行地址译码为8位8段数码管提供片选码,采用8段数码显示出租车行驶的里程及应付总金额,通过LED指示灯指示出租车当前工作状态,便于乘客监督司机。

利用单片机灵活的编程设计和丰富的I/O 端口,及其控制的准确性[4],不仅能实现基本的计价功能,而且能在很大程度上扩展功能,方便以后对系统进行升级。

系统设计框图如图1所示:
图1 系统设计框图
里程测量是通过安装在车轮上的霍尔传感器A44E检测到的信号[5],送到单片机,经过处理输送到显示电路。

车轮每转一圈,霍尔开关就检测并输出信号,引起单片机的中断,对脉冲计数[6]。

P3.4引脚作为信号的输入端,内部采用定时/计数器0计数[7],通过计算接收到的脉冲个数,计算出当前所行驶的路程。

根据不同的收费模式,选择相应的起步价、单价等收费标准进行计算得出乘客应付总金额。

假设出租车的车轮的周长是1m,那么出租车车轮旋转1000转,也就是行驶1Km(实际应用时以车轮实际周长计算,这里为了仿真方便假设车轮周长为1m)。

通过对定时/计数器0的TL0和TH0的初值设置使得定时/计数器计数一定数量的脉冲时计数器溢出产生中断,在中断服务程序中完成里程计算。

本设计为了仿真方便做如下设置TMOD=0x06,TL0=255 ,TH0=255;即单片机定时/计数器0工作于工作方式2,8位自动重装模式,作计数器使用,单片机收到一次脉冲触发一次中断,里程增加0.1Km。

通过按键能够实现启动、停止/结算以及选择不同的计费模式。

显示电路使用8位LED 数码管来显示,左边4位显示行车里程,小数点后面一位为百米位,右边4为显示应付金额,小数点后面一位为角位。

由于现实生活中一角使用的比较少,而五角钱使用的相对较多,为了司机与乘客之间交易方便,小数点后面的角位数字小于5的一律按5计算,大于5的一律向元位上进1。

由于8位数码管静态显示需要许多I/O端口,和静态显示相比动态显示仅需要少量I/O端口就可以实现,所以这里采用动态显示方式。

使用74HC138译码器对单片机输出的3位片选码进行译码并输送到8段LED片选端实现对8位LED的片选。

3 系统硬件设计
设计电路时,考虑到用霍尔传感器价格昂贵,且不便于试验检测仿真,在设计中采用一个模拟开关来代替。

模拟开关一端接在P3.4引脚,另一端接地,通过来回高低电平的变化,每按一次,对应的里程数加0.1Km。

通过程序计算出里程和金额的信息,再加上驱动电路的设计,就可以在数码管上分别显示总金额和总里程。

在显示方面,可以用液晶显示,也可以用数码管进行显示。

由于液晶显示在距离一米多远以外就不怎么能看清楚[8],而数码管能清晰的显示、经济适用并且在这次设计中只需要显示里程和金额信息,所以本设计采用数码管进行显示。

这样既节约了成本,又可以达到显示的目的。

为了减少硬件的复杂度,设计中采用了动态显示方式。

另外设计LED指示灯来实时指示各项状态,如出租车有客/待运状态,白天/夜晚状态,单程/往返状态,便于
乘客监督司机作弊。

设计中设计了控制按键,能够很好的对出租车计价器控制,如启动/停止按键,白天/夜晚按键,单程/往返按键,清零按键等。

3.1 单片机介绍
AT89C51是一种带4K字节FLASH存储器的低电压、高性能CMOS 8位微处理器,俗称单片机。

单片机的可擦除只读存储器可以反复擦除1000次。

该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器[9]。

3.2.1 AT89C51的特点
AT89C51具有以下几个特点:
·AT89C51与MCS-51系列的单片机在指令系统和引脚上完全兼容;
·全静态工作:0Hz~24MHz;
·三级程序存储器加密;
·数据保留时间:10年;
·片内有4k字节在线可重复编程快擦写程序存储器;
·128×8位内部RAM;
·32位双向输入输出线;
·五个中断源,两级中断优先级;
·两个十六位定时器/计数器;
·一个全双工的异步串行口;
·间歇和掉电两种工作方式。

3.2.2 AT89C51引脚功能
AT89C51单片机为40引脚芯片,其实物图与引脚图如图所示:
图2 AT89C51实物与引脚图
①.口线:P0、P1、P2、P3共四个八位口。

P0口是三态双向口,通称数据总线口,只有该口能直接用于对外部存储器的读/写操作。

P0口也用以输出外部存储器的低8位地址。

由于是分时输出,故应在外部加锁存器将此地址数据锁存,地址锁存信号用ALE。

P1口是一个内部提供上拉电阻的8位专门供用户使用的I/O口,是准双向口。

P2口是系统扩展时作高8位地址线用。

不扩展外部存储器时,P2口也可以作为用户I/O 口线使用,P2口也是准双向口。

P3口是双功能口,该口的每一位均可独立地定义为第一I/O功能或第二I/O功能。

作为第一功能使用时操作同P1口。

②.控制口线:PSEN(片外选取控制)、ALE(地址锁存控制)、EA(片外存储器选择)、RESET(复位控制);
③.电源:
VCC:供电电压。

GND:接地
3.2.3 设计中使用的管脚
VCC:接+5V电源。

GND:接地。

时钟引脚:XTAL1和XTAL2两端接晶振和30PF的电容,构成时钟电路。

RST:复位信号输入端,高电平有效。

在此引脚加两个机器周期的高电平时,就可以完成复位操作。

P1.0:接启动/停止按键。

P1.1:接白天/夜晚按键。

P1.2:接单程/往返按键。

P1.3:接清零键。

P0口接数码管段选端,P2口接驱动芯片。

P3.4(T0):接模拟开关按键,替代了出租车计价器中的霍尔传感器。

3.2 硬件组成
硬件组成主要包括:时钟模块、复位模块、按键及指示模块、里程测量模块、显示驱动模块、显示模块。

3.2.1 时钟模块
单片机工作是以时钟控制信号为基准,内部电路在时钟信号的控制下,严格地按时序执行指令进行工作[10],为了保证系统内各部分稳定工作,系统需要一个稳定的时钟信号。

时钟电路产生振荡脉冲,经过二分频之后,为单片机提供时钟脉冲信号。

振荡频率取决于石英晶体的振荡频率,频率范围可取1.2MHz—12MHz。

C1、C2具有频率微调和稳定作用,电容值可取5~30pF。

单片机运行速度取决于晶体振荡频率,晶体振荡频率越高,系统的时钟频率越高,单片机运行速度越快。

本设计中使用的时钟电路,由两个约30PF的电容和12MHZ晶体振荡器组成,将晶体跨接在XTAL1和XTAL2两端。

在整个系统中为系统各个部分提供基准频率信号,以防因其工作频率不稳定而影响相关设备工作的稳定性,晶振可以在电路中产生振荡电流,发出时钟信号。

时钟模块的电路图如图所示。

图3 单片机时钟电路图
3.2.2 复位模块
单片机在启动时需要进行复位操作,使系统处于初始状态,并从这个状态开始工作。

单片机的复位是由外部的复位电路实现的, 复位电路通常有两种复位模式,一是采用上电自动复位,二是按键手动复位[11]。

上电自动复位是通过复位电路的电容充电来实现的。

按键手动复位有电平方式和脉冲方式两种。

复位信号是高电平有效,持续24个振荡脉冲周期(即二个机器周期)以上,即可完成复位操作。

本次设计中采用手动复位的电平复位。

图4 单片机复位电路
3.2.3按键及指示模块
本设计中设有按键控制电路及LED指示部分,通过按键可以控制启动/停止计价以及根据乘客使用出租车情况选择不同的计费模式。

LED指示模块可以实时的指示当前出租车所采用的计价模式状态,可以让乘客一目了然,监督司机,防止司机作弊。

按键控制电路中,单片机的P1.0引脚接启动/停止按键,通过软件编程,当按下按键计数器开始工作,开始计价,启动指示灯点亮,代表出租车出于有客状态;当弹起按键时,计数器停止工作,停止计价,结算路费,停止指示灯点亮,表示出租车出于待运状态。

按下启动按键,开关处于导通状态,这时给P1.0送低电平信号,这时TR0=1,计数器开始工作,计数器溢出时触发中断对里程进行计算,主程序中调用计价子程序开始计价。

为了方便乘客与司机结算,角位上不足5角的按照5角计算,大于5角的按照1元计算。

P1.1管脚接白天/夜晚按键,通过软件编程,当按下按键时执行白天模式计价标准,白天模式指示灯点亮,当弹起按键时,执行夜晚模式计价标准,夜晚指示灯点亮。

P1.2引脚接单程/往返按键,当按下按键时执行单程模式计价标准,相应的指示灯点亮,当弹起按键时执行往返模式计价标准,相应的往返指示灯点亮。

清零按键接单片机的P1.3引脚,按下清零按键,P1.3为低电平,调用清零子程序,用于将显示数据以及里程及计价金额清零,以达到清零的目的,方便下次计价。

图5 控制按键及指示灯图
3.2.4 里程测量模块
霍尔传感器是根据霍尔效应制作的一种磁场传感器。

霍尔效应是磁电效应的一种。


尔器件可以检测磁场及其变化,可在各种与磁场有关的场合中使用。

霍尔传感器分为线型霍尔传感器和开关型霍尔传感器两种,本设计采用开关型霍尔元件。

A44E 集成霍耳开关由稳压器、霍耳电势发生器(即硅霍耳片)、差分放大器、施密特触发器和OC 门输出五个基本部分组成。

在输入端输入电压Vcc ,经稳压器稳压后加在霍耳电势发生器的两端,根据霍耳效应原理,当霍耳片处在磁场中时,在垂直于磁场的方向通以电流,则与电流和磁场相垂直的方向上将会产生霍耳电势差VH 输出,该信号经放大器放大后送至施密特触发器整形,使其成为方波输送到OC 门输出[6]。

当施加的磁场达到BOP 时,触发器输出高电压(相对于低电位),使三极管导通,此时OC 门输出端输出低电压,通常称这种状态为“开”。

当施加的磁场达到“释放点”(即Brp )时,触发器输出低电压,三极管截止,使OC 门输出高电压,这种状态为“关”。

这样两次电压变换,使霍耳开关完成了一次开关动作。

将霍尔传感器的集成电路安装在车轮上放的铁板上,将小磁铁安装在车轮上,旋转的车轮将磁铁对准集成电路时,霍尔传感器会输出一个脉冲信号。

我们选择了P3.4引脚作为脉冲信号的输入端,单片机内部采用内部定时/计数器0计数触发中断。

车轮每转一次,霍尔开关就检测并输出一个脉冲信号。

单片机接收脉冲并对其计数,计数器溢出时产生中断,
通过处理中断服务程序计算出总路程及相应的应付金额。

霍尔传感器的测距示意图如图所示:
图6 霍尔传感器的测距示意图
图7 脉冲输入
由于仿真软件中没有霍尔元件,这里使用按键开关或者脉冲发生器来替代霍尔元件仿真,为了仿真方便,设定每向P3.4引脚输入一个低电平脉冲,单片机内部产生一个中断,里程计数器加一,每次脉冲表示出租车前进100m 。

3.2.5 显示驱动模块
74HC138是常用的译码器。

74HC138是一款高速CMOS器件,74HC138引脚兼容低功耗肖特基TTL系列。

74HC138译码器可接受3位二进制加权地址输入(A, B和C),并当使能时,提供8个互斥的低有效输出(Y0至Y7)[11]。

74HC138管脚图如图表所示:
图8 74HC138译器管脚图
通过74HC138译码器来给8位数码管提供片选码,使得8位数码管能够实现动态显示并且节约了I/O口资源。

为了提供P0口驱动能力,在P0口设计上拉电阻。

译码驱动电路如下图所示:
图9 译码驱动电路图
3.2.6 显示模块
现在很多的应用系统都需要配备输出外设,一般使用LED显示器或LCD显示器。

考虑到LCD显示在距离超过1m远的时候不容易看清楚且为了节约成本,本设计中选用了LED数码管显示器。

显示方式有两种:静态显示和动态显示。

静态显示亮度较高,接口编程容易[11],但是每位的段码线分别要与一个8位的锁存器输出相连,在显示位数较多的情况下,占用的I/O 口线比较多,所以这里不采用静态显示方式。

和静态显示方式相比动态显示可以节省很多I/O口资源。

利用动态显示的方法,由于LED显示器的余辉和人眼的视觉暂留现象,只要每位数码管显示的时间间隔足够短,就能使人感觉到所有的数码管都在显示。

通常将所有位的段码线相应段并联在一起,由一个8位I/O口控制,在同一时刻,只让一位选通,如此循环,就可以使各位显示出将要显示的内容。

LED数码管及集成数码管如图所示:
图10 LED数码管图11 集成数码管本设计中使用的是8个一组的共阳8段数码管。

左边4个用来显示里程,小数点后面
一位表示百米位,右边4位表示金额,小数点后面一位表示角位。

如下图所示:
图12 本设计中的数码管显示
4 系统软件设计
51单片机的程序设计语言主要有两种:一是汇编程序设计;二是C语言编程设计。

两种程序设计语言都有各自的优点。

和C语言相比而言汇编语言比较节省空间,但使用C语言编写的程序简单易行,通俗易懂。

C语言作为编译型程序设计语言,它兼顾了多种高级语言的特点,并且具备汇编语言的功能。

不仅如此,C语言程序还具有完善的模块化程序设计结构,从而为软件开发中采用模块化程序设计方法提供了有力的保障[12]。

本设计采用C语言编写的,采用模块化编程,程序在修改,执行的过程中比较方便易行。

利用各个模块之间的相互联系,在设计中采用主程序调用各个子程序的方法,使程序通俗易懂。

main函数编写开始,进行初始化,使硬件处于就绪状态。

主程序模块中,主要完成定时/计数器0的设置、开中断、开闭计数器、调用子程序以及循环等工作。

主程序运行中通过对各个按键的判断决定是否计费,结算,清零等,分别调用不同的子程序。

当检测到启动按键key1按键被按下去时,打开计数器0,并调用计价程序计价。

通过检测key2(白天/夜晚按键)、key3(单程/往返按键)的程序执行不同的计价标准。

Key1键被弹起时,关闭计数器0,恢复计数器0 的初值,并结算应付总金额。

每当P3.4口收到一个低电平信号,单片机计数器0就对其计数一次,当计数器溢出时触发中断,进入里程计数中断服务程序,里程变量加1,总金额根据此时所设单价做出相应的变化。

图13 系统软件设计流程图
图14 计价子程序设计流程图
5 仿真调试
1.在Keil μVision 软件中使用C语言编写程序,经过编译生成hex文件。

2.在Proteus软件中按照设计的原理图绘制出各种元器件并连接好电路。

3.将用keil编译产生的hex文件下载到单片机中:双击51单片机,在对话框中把保存过的hex文件打开,再单击确定。

如图:
图15 加载HEX文件到单片机中
4.单击左下角运行按钮,进行软件仿真调试。

软件的仿真窗口如图:
图16 出租车计价器仿真图
根据设计需求规定出租车白天模式下起步公里数为3Km,价格为8元;若实际里程大于3Km,大于3Km的部分单程价格为2.4元/Km,返价格为1.6元/Km;夜晚模式下起步公里数为3Km,价格为10元;若实际里程大于3Km,大于3Km的部分单程价格为3元/Km,返价格为2元/Km。

下面通过随机选取几个点进行仿真验证,超过起步里程计费价目表如下表所示:
图17 白天单程模式下计价仿真图图18 白天往返模式下计价仿真图
图19 夜晚单程模式下计价仿真图图20 夜晚往返模式下计价仿真图通过对以上几种模式下的仿真结果与理论结果比较发现仿真结果与实际理论计算值相符,仿真成功。

6结论
本次设计采用AT89C51单片机为核心处理器,设计出具有多种模式计价的出租车计价器,能够实现通过按键控制,按照不同的计价模式执行计价,显示里程和金额以及状态指示。

通过Proteus调试仿真,达到了设计目的。

这次课程设计设计完成后,有许多体会,在学与做的过程中,取长补短,不断学习新的知识,吸取经验。

通过自身的努力以及与同学的探讨研究,逐渐熟悉了Keil uVision3、设计软件Altium Deginer、PROTEUS和C语言等软件的使用。

在设计过程中难免存在一些问题,功能还不是很全面,主要是因为现在个人能力有限考虑问题还不周全,缺乏设计经验,恳请老师批评指正,以使我在以后的学习和实践中加以改进和提高自我。

7参考文献
[1] 舒涛,伍远超,李明.基于AT89S51单片机的出租车计价器系统设计[J].现代电子技
术,2010,33(22):57-59.
[2] 张颖.多功能出租车计价器的设计[J].广西轻工业,2009,25(9):96-97.
[3] 肖卫初,陈伟宏,杨明.基于单片机的多功能出租车计价器的设计[J].广现代电子技
术,2008,31(16):180-188.
[4] 陈爱华.基于AT89C51单片机的多功能出租车计价器[J].机电工程技术,2008,37(11):67-68.
[5] 王华祥,张淑英.传感器原来及应用(修订版)[M].天津:天津大学出版社,1999.
[6] 黄代福.出租车计价器传感器原理及检测[J].计量与测试技术,2006(8):20-21.
[7] 潘永雄.新编单片机原理与应用[M].西安电子科技大学出版社,2003.
[8] 戴佳,陈斌,苗龙.51单片机应用系统开发典型实例[M]中国电力出版社,2005.
[9] 余发山,王福忠.单片机原理及应用技术[M].中国矿业大学出版社,2008.6.
[10] 侯玉宝,陈忠平,李成群.基于Proteus的51系列单片机设计与仿真[M].电子工业出版
社,2008.
[11] 边春元,李文涛,江杰.C51单片机典型模块设计与应用[M].机械工业出版社,2008.
[12] 马忠梅.单片机的C语言应用程序设计(第三版)[M].北京航空航天大学出版社,2004.
8心得体会及致谢

在本次设计中,我们采用AT89C51芯片为核心器件,设计出了简单的出租车计价器,能够实现显示总金额和总里程,按键控制清零复位,选择四种计价模式。

我是我们组的主力,选题后,我便开始复习单片机方面的知识,也查阅、搜索了很多相关资料,进行总体设计与具体设计,同时也学习仿真软件Protues、设计软件Altium Deginer和编程软件KeiC。

由于以前都采用汇编语言实现编程,对用C语言来实现单片机的编程不太习惯,花费了一些时间来熟悉C语言的编程。

在设计开始,要形成流程图,它可以使设计有一定的逻辑性与严密性,使得设计思路明确。

采用模块化的设计思想很重要,它方便编写、修改与调试,另外加上必要的注释,便于交流与理解。

在这次实训中,我们出现了不少错误,大都因为对实际操作能力太差和专业知识不够,例如,在画原理图和PCB的时候没有认真查阅数据手册,以致将其画错,导致最后不得不用导线连接;还有就是焊接之前没有认真熟悉器件测其参数,导致有的器件焊反…种种错误的出现与我这个主力不称职有很大的关系,一个好的团队,需要团结,更需要相互信任。

这次课程设计完成后,体会颇多,在学与做的过程中,取长补短,不断学习新的知识,吸取经验,达到进步的目的。

通过自身的努力以及相关图书资料的帮助,逐渐熟悉了KEIL、PROTEUS和C语言等软件的使用以及硬件焊接与检测过程中的一些小技巧。

本次设计我学习到不少单片机的知识,但由于自己的理论知识水平有限,实践知识和设计经验不足,在设计过程中难免存在一些问题。

所焊实物尚有许多不足,虽然预期功能都已实现,但实物却并没有因为用了PCB板而更美观,主要原因是考虑问题不周全,电路设计经验少,实际动手能力不足。

恳请各位老师批评指正,以使我在以后的学习和实践中加以改进和提高。

经过这学期的努力,本次课程设计已经接近尾声。

作为一个本科生的设计,由于没有足够的经验,难免有诸多考虑不周的地方,好在有导师的指导和同学们的帮助,我才能按时完成任务。

感谢我的指导老师,从课题的选择到设计的最终完成,老师都给予了我们细心的指导和不懈的支持。

他严谨细致、一丝不苟的作风一直是我们学习中的榜样,并将继续影响我今后的学习和工作。

在此向老师致以诚挚的感谢。

二。

相关文档
最新文档