出租车计费器设计-电子信息工程本科毕业论文_第1页
出租车计费器设计-电子信息工程本科毕业论文_第2页
出租车计费器设计-电子信息工程本科毕业论文_第3页
出租车计费器设计-电子信息工程本科毕业论文_第4页
出租车计费器设计-电子信息工程本科毕业论文_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 本科生毕业设计报告系(院) 物理与电子工程学院 专 业 电子信息工程 论文题目 出租车计费器的设计 学生姓名 指导教师 (姓名及职称)班 级 2012级电信4班 学 号 完成日期:2016年4月出租车计费器的设计xxx物理与电子工程学院 电子信息工程 xxxxx摘要本设计主要是针对城市出租车运营而设计的一款智能收费系统。是以单片机STC89C52RC为核心,通过光电传感器来累加车轮旋转的圈数和算法来计算出行驶的路程,并根据相应的收费标准计算出应当收取的费用;以LCD12864液晶显示屏来显示路程、单价、行驶的时间和消费金额等信息;利用SYN6288语音模块在一些特定的时候进行语音播报提示。本

2、设计还可以根据用户的自身情况对收费的标准进行调整。关键词出租车计费器 SYN6288 LCD12864 光电传感器 1 前言1.1 设计背景在国民经济的快速发展下,城市的交通治安逐渐变得整齐有序,出租车计价器在城市的交通中也得到广泛的使用。虽然私家车拥有的数量在逐渐的增长,但是出租车依然是城市交通运输乘客的重要角色。出租车计价器是出租车上统计路程及时间和通过收费标准计算消费金额的仪表仪器,是出租车上必不可少的部分,它是负责计算出租车营运收费的专用智能仪表。不管是消费的乘客还是出租车的司机都要求计价器在性能方面能够稳定、计价准确而且在它的功能方面也要求越来越高。有史以来,在城市出租车已经成为人们

3、工作、生活中不可缺少的交通工具。出租车计价器是一种能根据乘客乘坐出租车行驶的路程和收费的方式计算出乘客消费的金额并直接显示车费值的计量工具。出租车计价器是出租车上结算消费金额的计算工具,所以计价器计价准确与否,直接关系到双方的经济利益。1.2 设计目的和意义大力提高城市安全文明的建设是当前城市建设的主要内容之一,随着人们生活水平的不断提高,人们对各种工具的功能要求也越来越高。就出租车收费器而言,人们对它的功能要求也是逐渐的增加,虽然它的功能在趋于完善,但任然有很多可以改进的地方。本次的设计选用的主要元件是单片机,不仅是为了完成设计的要求和各功能的实现,更是为了检验我们对所学知识的应用能力以及我

4、们解决问题的能力。2 任务的提出与方案论证2.1 设计要求 1、能对出租车行驶的路程进行统计并显示; 2、能根据行驶的路程和相应的收费标准计算出消费的金额; 3、具有计时的功能; 4、在一些特定的时候,有语音提醒播报的功能; 5、有按键控制的功能。2.2 方案选择控制芯片的选择:方案一:采用单片机控制,利用单片机控制的灵活性以及丰富的IO端口,不仅能实现基本的计程和价格实现,还能实现计时、和语音提醒播报的功能。方案二:采用数字电路控制,通过传感器输出脉冲信号,进过放大整形作为位移寄存器的脉冲信号,实现计价,但这种电路能实现的功能比较单一、简单,已经不能满足现在出租车的使用。在上述两种方案中,很

5、明显方案一的适用能力要比方案二强,方案一能实现的功能也多余方案二,故选用第一种方案。传感器的选择:方案一:霍尔传感器,霍尔传感器的测速灵敏度比较高,有使用方便、价格便宜等优点,很适合汽车测速等应用场合。方案二:光电传感器,光电传感器工作比较稳定,使用方便、价格便宜,很适合用在统计数量、自动开关等方面。以上两种传感器都是汽车测速原件的很好选择,由于我对光电传感器工作原理的了解比较了解,而对霍尔传感器原件的工作原理不是很了解,所以本次我选择了光电传感器。显示电路的选择:方案一:采用数码管显示,采用数码管显示它需要几段才能显示一个信息,此次设计的显示信息量有点偏大,若采用数码管显示电路,则加大了硬件

6、电路的连接。方案二:采用液晶LCD1602显示,LCD1602只能显示两行的信息,适用于信息量显示不大的场合,而且只能显示字符不能显示汉字,所以在此次设计中不易使用。方案三:采用液晶LCD12864显示,LCD12864可以显示四行信息,它不仅能显示字符,还能显示汉字。综合以上三种显示电路的特点和结合此次设计的需求,觉得LCD12864更能适用于本次设计,故选择方案三。2.3 总体方案设计此次设计的总体方案规划如下:在整个控制系统中以单片机STC89C52RC为核心。光电传感器在电机的作用下产生信号脉冲,并将脉冲信号传送给主控芯片单片机,单片机通过一系列的计算和处理后将要显示的信息送给液晶LC

7、D12864显示出来,将要播报的语音信号发送给SYN6288语音模块进行播报;此外,单片机还受按键的控制,其目的是方便人们对整个系统进行选择和操作控制。整个系统的电路框图如图2.1所示。图2.1 整个系统电路框图3 系统电路设计 3.1 主控模块电路本次的设计中单片机STC89C52RC为主控芯片,是整个设计中的核心元件。它在电子行业的市场上已成为大众化器件,它与51单片机完全兼容。我们在使用的时候可以多次下载修改的程序,大大的提高了芯片的使用率,所以在很多简单的设计中,人们都选择采用单片机。其目的就是价格便宜,使用灵活。STC89C52RC单片机同一般的单片机芯片一样,在工作和烧写程序的时候

8、必需要外接最小系统。最小系统包括晶振电路、复位电路和电源电路,它们是单片机能否正常工作的最基本条件。单片机最小系统电路图如图3.1所示。图3.1 单片机最小系统电路图3.2 光电传感器模块本次设计在测量路程的过程中选用的是光电测速传感器模块(宽槽板),它的外形如图3.2所示。图3.2 光电传感器模块外形用途:主要广泛的应用于电机转速检测、脉冲计数、位置闲位、开关控制等方面。工作原理:此次选用的光电传感器内部主要由指示灯电路、光耦传感器、宽电压LM393比较器输出电路组成。当光耦传感器槽中无遮挡时,接收管导通,模块OUT输出低电平(输出0状态),此时指示灯会处于点亮状态;当光耦传感器槽中有遮挡时

9、,接收管截止,模块OUT输出高电平(输出1状态),此时指示灯会处于熄灭状态。引脚连接:此模块有三个引脚,他们分别是VCC、GND、OUT,其连接方式是:VCC接电源正极3.35V;GND接电源的负极;OUT 为TTL开关输出端,本次我采用的是外部中断1的连接方式,因此我将OUT脚接到单片机的13脚(即P33/脚)。电路的连接方式如图3.3所示。图3.3 光电传感器工作原理图3.3 SYN6288语音模块SYN6288语音模块属于中文语音合成模块电路,是北京宇音天下科技公司于2010年初推出的一款性价比高、音质清晰、自然的语音合成芯片。它的外形如图3.4所示。图3.4 SYN6288语音模块外形

10、SYN6288语音模块的应用领域很广,其中在公交报站器、银行叫号机、自动售货机、语音电子书等方面得到广泛的应用。此模块采用的是串口通信接收数据的方式,支持三种通信波特率:9600bps、19200bps、38400bps。在使用SYN6288语音模块的时候,外部电路的连接方式很简单,它有两组端口,一组是外接喇叭负载的端口,接入的喇叭规格为8欧0.5瓦,在接线的时候没有正负之分,还有一组有5个引脚构成,分别是VDD、RXD、TXD、GND、BY,其中VDD和GND分别接电源的正极和负极;而RXD、TXD与单片机上的串口脚RXD(P3.0)和TXD(P3.1)交叉相连;最后的一个引脚BY为检测是否

11、为忙碌状态,当BY为低电平时,说明模块处于空闲状态、为高电平时模块处于忙碌状态,此引脚可以选择性的接单片机的IO口,也可以不接。此模块电路的电路连接图如图3.5所示。图3.5 语音模块电路连接图3.4 显示模块电路设计中采用的LCD12864有20个引脚,其中DB0DB7是接受数据的并口,我采用的是与单片机的P0口相接,但P0口的驱动能力不够强,所以必须外接上拉电阻;除此以外还有几个控制脚,它们的功能和作用分别是:RS:当液晶采用并行连接方式时为指令/数据选择信号,当液晶采用串行连接方式时为片选信号控制端。R/W:当液晶采用并行连接方式时为读写控制脚,即当R/W = 0时,液晶处于写状态,当R

12、/W = 1时,液晶处于读状态;当液晶采用串口连接方式时为数据传送口。E:当液晶采用并行连接方式时为使能控制端,当液晶采用串行连接方式时为同步时钟控制端。PSB:串并口方式控制,PSB = 0为串口方式,PSB = 1为并口方式。RST:复位端,低电平有效。BLA:背光源正极,可直接接+5V电源。BLK:背光源负极,可直接接地。VCC:电源正极,接+5V电源。GND:电源负极,接地。除此以外的其它三个引脚对本次的电路没有特别的影响,所以可以选择不接,根据以上对各引脚的了解和为了方便电路板布线,所以本次的显示电路的连接方式为如图3.6所示。图3.6 LCD12864显示电路连接图3.5 按键控制

13、电路任何一个系统电路都需要有按键控制电路,其主要目的是方便人们控制操作、修改设置等,此次在我的设计中,也需要有按键控制电路,方便出租车司机在使用的时候进行操作控制和一些简单的设置。在这次的电路中初步用六个按键(不包括电源按键),它们分别是开始按键、暂停按键、结束按键、设置按键、调节按键两个。电路的连接方式采用将每一个按钮开关与单片机的P1口的每一个引脚相连接,然后另一端公共接地。电路的连接如图3.7所示。图3.7 按键控制电路图3.6 系统的总体电路此次设计的电路总共分为5部分,它们分别是以上介绍的单片机最小系统、光电传感器测速电路、12864液晶信息显示电路、按键控制系统电路、SYN6288

14、语音播报电路。在整个系统电路中,这五部分电路是主要以单片机来协调、控制工作的,单片机也是整个电路的核心原件,整个硬件的系统电路如图3.8所示。图3.8 系统电路原理图4 系统程序设计硬件电路的连接是为了支持软件程序的运行,所以在编写软件程序的时候软件一般都要参照硬件电路编写,不能盲目的去写,如若不然我们编写的程序将无法在我们的电路板上运行;所以编写的程序必须与硬件电路相互兼容,才能实现出我们预期的效果。4.1 计时中断程序设计设计中的计时功能是采用的单片机内部的定时/计数器T0进行计数,当计数达到溢出时产生中断,通过执行中断函数而实现计时。要开启定时/计数器T0,首先要对与之相关的几个寄存器进

15、行设置。对寄存器的设置程序需要放在主程序的一开始,以便于程序在运行的时候一开始就可以开启中断,进行计时。开启定时/计数器T0主要涉及到以下几个寄存器的设置:方式寄存器TMOD的设置,它的格式如表4.1所示。定时/计数器T0只与TMOD寄存器的第四位有关,如果我们的设计与定时/计数器T1无关的话,我们可以忽略高四位。此次我选用的是方式1工作模式,所以我们要将M1、M0两位赋值为01;是定时或计数方式的选择位,这里选用的是定时方式,所以给位赋值0;对于GATE是启动方式位,直接赋值0,表示由软件启动定时器。表4.1 方式寄存器TMODD7D6D5D4D3D2D1D0-GATEM1M0定时/计数器T

16、0的初值设置,定时/计数器T0由特殊寄存器TH0和TL0组成,此次我们需要以1s为单位来计算时间,但是1s的时间太长,单片机的定时器采用方式1最长也只能定时65536us,所以采用定时50ms,中断20次来获得1s的时间;由此可以计算出初值为65536-50000=15536;所以给T0的初值应该为15536;TH0赋值高8位:15536右移8位,TL0赋值为低8位:15536与上255。由于T0工作在方式1,不具有自动重装初值的功能,所以在每次中断发生以后都需要在中断程序里利用程序给TH0和TL0重新赋初值。另外与T0中断有关的、需要设置的寄存器还有定时器控制寄存器TCON的TR0位和中断允

17、许寄存器IE的EA位和ET0位,在这里,我们只需要将这些位设置为1就可以完成定时器0的初始化设置。T0中断源在C程序的中断号是interrupt 1,在编写中断程序的时候需要加上中断号。在中断程序中我们主要计算时间的时、分、秒,用于系统电路的计时功能,此中断程序只会在中断触发以后执行,程序的流程图如图4.1所示。图4.1 定时器T0中断程序流程图4.2 外部中断计程程序设计STC89C52RC单片机有两个外部中断源,本次的设计在计算路程的程序中就用到了一个外部中断源,选择的是外部中断1,它对应的是我们单片机的P3.3脚,它在C程序中的中断号是interrupt 2。外部中断1的设置主要是它的触

18、发方式,它的触发方式有两种:一是低电平触发方式、二是边沿触发方式;P3.3脚外接的光电传感器模块在没有遮挡时会长时间输入低电平,如果采用低电平触发方式有可能会出现一次中断请求而发生多次中断请求的情况,所以在这里选择边沿触发方式。选择边沿触发方式的设置只需要把定时控制寄存器TCON的IT1设置为1。中断允许寄存器IE的EA和EX1也与外部中断1有关,所以也要将其设置为1。在外部中断1的程序中我们只作统计发生外部中断1的次数的工作,其余计算路程和金额的程序放在主程序中进行计算,以便于缩短CPU执行中断程序的时间。 串口中断的初始化程序设计主要是对相关寄存器的设置和串口波特率的设置,需要设置的寄存器

19、主要有控制状态寄存器SCON、电源控制寄存器PCON的SMOD位、定时控制寄存器TCON的TR1位和T1定时/计数器。SCON寄存器的设置,主要用于定义串口通信口的工作方式和反映串行口状态,这次我们选用的是方式1的工作方式,表示8位UATR(串行异步通信接口);打开寄存器的REN位,所以给SCON寄存器赋值0X50。PCON寄存器与串口相关的只有SMOD位,它是波特率倍增位,当将该位设置位1的时候,表示串口波特率加倍。波特率的发生需要定时器产生时钟信号,由于在前面已经用了T0定时/计数器,所以这里只能用T1定时/计数器,这里T1定时/计数器选用方式2的工作模式,便于每次溢出后能够自动的重装初值

20、;串口语音信号发送的波特率选用的是9600;外部的石英晶振频率为11.0592MHz,根据公式1通过计算得出T1的初始值X为0xFA,即表示我们要给TH1和TH1都赋值为0xFA。 (公式1)当这些寄存器设置完毕以后将TCON寄存器的TR1置1即可运行T1定时/计算器。串口数据在发送前要根据通信协议设置TB8,然后将要发送的数据在主程序中直接写入发送缓冲器SBUF,便可自动启动发送过程。串行口能自动的把TB8取出,并装入到第九位的数据位的位置,再逐一发送出去1。在整个程序的设计中最重要的是主程序,它的主要任务是完成中断的初始化、液晶初始化及液晶信息显示、开关状态检测、模式的调节等。它的主要流程

21、图如下图4.2所示。在主程序中很多地方都采用了调用子函数的方法来缩短主函数代码,由于子函数封装得比较多,这里就不对他们做过多的说明。开始初始化液晶显示信息、设置中断否开始计费按钮是否按下是开启中断、液晶清屏、发送语音提示信息计算路程、计算消费金额、液晶显示信息否暂停计费按钮是否按下是关闭中断、发送语音提示信息否开始按钮是否按下是开启中断、发送语音提示信息否是否已刚好行驶2km是发送语音提示信息清出所有计费数据否消费金额是否为10的倍数是发送语音提示信息否结账按钮是否按下是发送语音提示信息、关闭中断是 返回主界面按钮是否按下否图4.2 主程序流程图5 硬件电路的制作与调试5.1 硬件电路的制作整

22、个硬件电路是在万能板上面焊接原件和连接焊点而组成的,在制作的时候首先是布局的问题,只有一开始布好局在走线的时候才不会显得那么乱,制作好以后才会显得美观,电路的性能才会可靠,不会出现接触不良等问题。这次在电路板上,为了担心元器件损坏,或者为了有些元器件能够再次利用,我都采用了焊接芯片座的方式将一些引脚比较多的原件直接插在座子上面实验。硬件电路的实物图如图5.1所示。此电路板上加了一个电机,其目的是方便演示和调试。图 5.1 电路实物图5.2 硬件调试的结果在经过多次的程序修改和硬件电路的改进后,整个硬件电路的调试结果已经能够达到预期设想的效果了,图5.2和5.3是最终调试成功后在某个时候的显示结

23、果图。电路能够正常的通过光电传感器计算行驶的路程;在开关的控制下能够正常的运行;液晶能正常的把信息显示出来;也能在特殊的时候进行语音提示播报。图 5.2 硬件的初始显示界面图图 5.3 硬件的行程信息显示图5.3 PCB板的绘制硬件电路的调试成功,说明电路的可行性。为了便于生产与使用,我将电路绘制成PCB板。本次绘制PCB板选用的是protel 99 se软件。在前面我们已将电路的原理图绘制成功了,所以在现在只需要将原有的电路添加到PCB板界面进行绘制就可以完成制作了。完成的结果如图5.4所示;进过3D视图看到的效果如图5.5所示。 图5.4 PCB板图图5.5 PCB板3D视图6 总结思考本

24、次的毕业设计虽然顺利的完成了,但是并不能完全的投入到实际中去使用,其原因是存在计算精度和功能方面的缺陷问题。在计算精度方面存在的主要问题就是计算路程并没有以实际的车轮周长去计算,而是为了方便演示随便给了一个比实际值要大的值,这就造成了计算的路程和费用出现严重的误差,但这个问题可以通过修改调试程序解决;在功能方面的主要缺陷问题就是时间和计费方式方面,因为电路不能自动的去获取当前的时间,就没有办法去区分晚上和白天,而且也没有掉电保护功能,在异常掉电的情况下,所有的计算数据就清零了,这是电路存在的两大缺陷问题,这两个问题就需要在单片机外围加上一些辅助电路和配合单片机的程序去解决,这是此次电路设计的主

25、要缺陷问题。在经过了长达一个月的努力后,毕业设计已经完成得差不多了,虽然还有许多需要改进和不足的地方,但是大部分的功能已经完整的实现了。在这期间经历了选题、查资料、选材料、电路板焊接、程序的编写、论文的撰写等过程。其实最让我痛苦的是选题的阶段;在后期的制作与调试阶段虽然也遇到过很多困难,但在指导老师和一些同学们的帮助或建议下顺利地度过了难关。本次的毕业设计不但强化了我所学过的专业基础知识,而且还学到了很多新的知识,更让我们懂得了如何将所学到的知识应用于实际的生活中;让我收获最大的就是懂得了如何客服困难,这在以后的生活和工作中都是最宝贵的财富。参考文献1周国运. 单片机原理及应用 C语言版. 北

26、京:中国水利水电出版社, 2009.02. 2王柏盛.C 程序设计M.高等教育出版社. 2004.3杨志忠主编. 数字电子技术基础. 北京:高等教育出版社, 2004.01.4杨居义编著. 单片机案例教程. 北京:清华大学出版社, 2015.01.5杨庚辰.自动控制原理M.西安:电子科技大学出版社,2011.4.6代万辉,陈松方编著. 全国电子设计大赛培训宝典. 北京:北京航空航天大学出版社, 2012.05. 7张义和等编著. 例说51单片机 C语言版. 北京:人民邮电出版社, 2008.04.8侯殿有主编. 单片机C语言程序设计. 北京:人民邮电出版社, 2010.11. 9孙少文,陆中宏

27、主编. 传感器. 北京:中央广播电视大学出版社, 2014.01. 10丁继斌编著. 传感器. 北京:化学工业出版社, 2010.03. 11张玉莲.传感器与自动检测技术J.北京:机械工业出版社,2007.9:4-8.12王英主编. 电子技术实验教程 电工学 2 模电实验 数电实验 综合设计与仿真实验. 成都:西南交通大学出版社, 2015.03. 13胡新宇.传感器与自动检测技术M.北京:高等教育出版社,2006.14邓兴成.单片机原理与实践指导M.北京:机械工业出版社,2010.2.15刘向宇.单片机C语言程序设计实例精粹J.北京:电子工业出版社,2010,2:12-21.16夏路易,石宗

28、义编著. 电路原理图与电路板设计教程 Protel 99SE. 北京:北京希望电子出版社, 2002.06. 17姚年春编著. Protel 99SE基础教程. 北京:人民邮电出版社, 2009.04. 18童诗白,华成英主编.模拟电子技术基础(第四版)M.北京:高等教育出版社,2007.9.19SYN6288中文语音合成芯片数据手册J.The Design Of Taxi MeterXxxInstitute of physics and electronic engineeri Electronic information engineering 1230xxxxxAbstract The

29、design is a shart changing system which mainly for the arban taxi operation.and it core for the single chip processor STC89C52RC. Through the photoelectric sensor to accumulate the number of turns of the rotation of the wheels and algorithms to calculate the driving distance. And according to the co

30、rresponding fee standards to get the charge should be. Through the LCD12864 to show the distance, unit price, the information of the time and the amount of consumption and so on. In certain time there is speech hint by using voice module of SYN6288. This design can also adjust the charge standard ac

31、cording to the user's own situation.Key words Taxi meter, SYN6288, LCD12864, Photoelectric sensor.附录系统源代码main.h文件源代码:#ifndef _main_h_#define _main_h_#include "12864.h"#include <string.h>sbit begin_key = P10;/开始计费按钮sbit pause_key = P11;/暂停计费按钮sbit end_key = P12;/结算费用按钮sbit mface_k

32、ey = P13;/返回主界面按钮sbit nigday_key = P16;/晚上白天切换按钮unsigned short degree = 0; /统计T0发生中断的次数,满20次清零,时间加1sunsigned short flag1 = 0; /协助语音发送,以免重复unsigned short flag2 = 0; /协助语音发送,以免重复unsigned short flag3 = 0; /判断当前是白天状态还是晚上状态float runs = 2.5; /路程的比较值,当路程大于runs则加上单价unsigned short hour = 0; /时unsigned short

33、minutes = 0; /分unsigned short seconds = 0; /秒unsigned short value = 0;unsigned int run_int = 0; / 路程的整数部分unsigned int run_fac = 0; /路程的小数部分unsigned int money_int = 5; /金额的整数部分unsigned int money_fac = 0; /金额的小数部分unsigned char time10; /要显示的时间字符串unsigned char money_str10; /要显示的金钱字符串unsigned char voice4

34、0; /要发送的语音字符串unsigned char run_str10; /要显示的路程字符串unsigned char* time_string(); /将时、分、秒转换成一个字符串unsigned char* run_string(); /将路程转换成一个字符串unsigned char* money_string(); /将金额转换成一个字符串void send(char *text,char length);/发送一个要播放的语音信号void interrupt_set(); /中断相关寄存器设置void count_run(); /路程算法函数 void count_money()

35、; /金额算法函数void Init_show(); /液晶初始显示信息void mess_show(); /计费时动态显示信息void init_data(); /还原所有的数据#endifmain.c文件源代码:#include "main.h"int main()while(1) Init_show(); interrupt_set(); /设置中断strcpy(voice,"计费开始起步价五元"); send(voice,strlen(voice);LcdInit(); /初始化液晶while(1)count_run();count_money(

36、);mess_show();if(nigday_key = 0) if(flag3 = 0)flag3 = 1;else flag3 = 0; if(pause_key = 0) /暂停开关按下执行 EA = 0;strcpy(voice,"计费暂停"); send(voice,strlen(voice);while(1)if(begin_key = 0)/开始开关按下执行并跳出循环EA = 1;strcpy(voice,"计费开始"); send(voice,strlen(voice);break;if(end_key = 0) strcpy(voic

37、e, "您本次消费");strcat(voice, money_str);strcat(voice,"元");send(voice,strlen(voice);while(1)if(mface_key = 0)break;init_data();break; if(run_int = 2) && (flag1 = 0)/如果行驶路程超过2KM,则播放语音if(flag3 = 0)strcpy(voice,"您已行驶两公里现在以1.6元一公里计费"); elsestrcpy(voice,"您已行驶两公里现在以1

38、.8元一公里计费");send(voice,strlen(voice);flag1 = 1;if(money_int-9)%10 = 0)flag2 = 0;if(money_int % 10 = 0) && (flag2 = 0) /如果消费金额满10元则播放此语音strcpy(voice,"您已消费");money_str3 = '0'money_str4 = '0'strcat(voice, money_str);strcat(voice,"元"); send(voice,strlen(vo

39、ice);flag2 = 1;/*恢复变量函数,以便对下次收费进行计费*/void init_data()hour = 0; minutes = 0; seconds = 0;run_int = 0;run_fac = 0;runs = 2.5;value = 0;flag1 = 0;flag2 = 0;money_int = 5;money_fac = 0;EA = 0; /*LCD初始化显示*/void Init_show()begin_key = 1;pause_key = 1;end_key = 1;mface_key = 1;nigday_key = 1;LcdInit();Loca

40、tion(1,0);Print("欢迎乘坐出租车");Location(2,0);Print("起步价¥5");Location(3,0);Print("单价:白天¥1.6");Location(4,3);Print("晚上¥1.8");while(1)if(begin_key = 0)break;return;/*显示信息*/void mess_show() Location(1,0);if(flag3 = 0)Print("单价:¥1.6 ");else Print("单价:¥1.

41、8 ");Location(2,0);Print("计时:");Print(time_string();Location(3,0);Print("计程:");Print(run_string();Location(4,0);Print("消费金额:");Print(money_string();DelayMs(10);/*中断设置函数*/void interrupt_set() EA = 1; /开中断允许请求总开关 ET0 = 1; /开T0中断请求EX1 = 1; /允许外部中断1请求IT1 = 1; /采用下降沿触发T

42、MOD = 0x21; /选择方式0计数方式TH0 = (65536 - 50000) >> 8; TL0 = (65536 - 50000) & 255;TR0 = 1; /开启中断TL1 = 0xFA;TH1 = 0xFA;SCON = 0x50;PCON = 0x80;REN = 1;RI = 0;TI = 0;TR1 = 1;/*发送语音信号函数*/void send(char *text,char length)unsigned int i = 0;unsigned char det = 0;char set5 = 0xfd,0x00,0,0x01,0x01;se

43、t2 = length + 3;for(i=0; i<5; i+)det = seti;SBUF = seti;while(TI = 0);TI = 0;for(i = 0; i<length; i+)det = texti;SBUF = texti;while(TI = 0);TI = 0;SBUF = det;while(TI=0);TI=0; /*=计程中断 X1中断=-*/void optoelectronic_switch() interrupt 2 EX1 = 0;value+;EX1 = 1;/*=中断计时函数 ,interrupt 1表示第一个中断源 =*/void

44、 timing() interrupt 1 TH0 = (65536 - 50000) >> 8; TL0 = (65536 - 50000) & 255;degree+;if(degree = 20) degree = 0; seconds+;if(seconds >= 60)seconds = 0;minutes+;if(minutes >= 60)minutes = 0; hour+;/*计算总价的函数*/void count_money()float run = run_int + 0.1 * run_fac;if(run >= runs)runs

45、 += 0.5;if(flag3 = 0)money_fac += 8;else money_fac += 9;if(money_fac >= 10)money_int+;money_fac = money_fac % 10 ;/*将消费金额转换成一个字符串*/unsigned char* money_string() int i = 0;if(money_int < 10)money_stri+ = money_int + '0'else if(money_int >= 10 && money_int < 100) money_stri

46、+ = money_int / 10 + '0'money_stri+ = money_int % 10 + '0' else money_stri+ = money_int / 100 + '0'money_stri+ = (money_int % 100) / 10 + '0'money_stri+ = money_int % 10 + '0'money_stri+ = '.'money_stri+ = money_fac + '0'money_stri = '0'

47、;return money_str;/*计算路程的函数*/void count_run()if(value >= 100)run_fac+;value = 0;if(run_fac >= 10)run_fac = 0;run_int+;/*将路程的整数和小数部分转换成字符串*/unsigned char* run_string()int i = 0;if(run_int < 10)run_stri+ = run_int + '0'else if(run_int >= 10 && run_int < 100) run_stri+ =

48、run_int / 10 + '0'run_stri+ = run_int % 10 + '0' else run_stri+ = run_int / 100 + '0'run_stri+ = (run_int % 100) / 10 + '0'run_stri+ = run_int % 10 + '0'run_stri+ = '.'run_stri+ = run_fac + '0'run_stri+ = 'k'run_stri+ = 'm'run_stri = '0'return run_str;/*将一个时间转换成字符串*/unsigned char* time_string() *(time + 0) = hour / 10 + '0'*(time

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论