出租车计价器系统完整版
- 格式:doc
- 大小:658.50 KB
- 文档页数:17
摘要本毕业设计说明书针对用单片机AT89C51完成的出租车计价系统。
随着经济的发展,带动汽车行业快速发展,出租车日益普遍,了解在出租车上应用的计费系统,对我们日常生活也有帮助。
而使用单片机实现该系统,是深化单片机应用的良好途径。
本系统由单片机AT89C51和一些外围原件组成,具有操作简单,显示明了,功能强大的特点。
整个系统只有两个按键,一个“启动/停止”,一个“复位”;使用六个七段数码管作为显示器,可以显示数字、字母使系统信息一目了然;本系统除了里程统计和费用计算以外,还具有万年历和语音播报功能。
万年历由时钟芯片DS1302实时提供时钟信号,再由单片机调用显示;语音播报由语音芯片ISD1420提供语音信息,语音信息放在不同的地址里,由单片机从这些地址中调用合适的语音进行播放。
本方案充分发挥人性化的特点,利用ISD1420的语音功能,模拟实现带语音提示的出租车计价系统。
比较真实地模拟出租车的空车、载客、到站及对各状况的费率的计算、统计、显示和语音播报等功能。
本系统涉及到的理论知识有: AT89C51单片机知识、ISD1420语音芯片的可擦、写的语音芯片的工作原理及应用、实时时钟芯片的工作原理及应用、出租车计费系统的原理和实现方法。
关键词:时钟芯片DS1302 语音芯片ISD1420 单片机AT89C51 掉电保护芯片24C02ABSTRACTThe abstract this graduation project instruction booklet in view of the rental car which completes with monolithic integrated circuit AT89C51 counts the price system. Along with the economical development, leads the automobile profession fast development, the rental car is day by day common, understood on the rental car the application cost system, also has the help to our daily life.But uses the monolithic integrated circuit to realize this system, is deepens the monolithic integrated circuit application the good way. This system is composed by monolithic integrated circuit AT89C51 and some periphery original part, has the operation to be simple, demonstration perspicuity, function formidable characteristic. Overall system only then two pressed keys, “start/stop”, “replacement”; Uses six seven section of nixietubes to take the monitor, may demonstrate the numeral, the letter cause the system information to be clear; This system besides course statistics and calculation of charge, but also has ten thousand calendars and the pronunciation disseminates news the function. Ten thousand calendars real-time provide the clock signal by clock chip DS1302, again transfers the demonstration by the monolithic integrated circuit; The pronunciation disseminates news by pronunciation chip ISD1420 provides the pronunciation information, the pronunciation information places in the different address, transfers the appropriate pronunciation by the monolithic integrated circuit from these addresses to carry on the broadcast. This plan full display user friendly characteristic, uses ISD1420 the pronunciation function, the simulation realization belt voice prompt rental car counts the price pared with really simulates the rental car the spatial vehicle, carries passengers, to station of arrival and to various conditions tariff computation, the statistics, the demonstration and the pronunciation disseminates news and so on the functions. This system involves the theory knowledge includes: The AT89C51 monolithic integrated circuit knowledge, the ISD1420 pronunciation chip may scratch the pronunciation chip principle of work and the application, the real-time clock chip principle of work and the application, the rental car cost system principle and the realization method which, write.Key word: Clock chip DS1302 P onunciation chip ISD1420 M nolithic integrated circuit AT89C51 F lls electricity protection chip 24C02目录第1章前言----------------------------------------------(5)1.1 出租车计费器概述------------------------------------------------------(5)1.2单片机发展前景概述----------------------------------(6)1.3单片机的应用范围------------------------------------(7)第2章方案论证比较与选择------------------------------(8)2.1方案一(数字电路方案)------------------------------(8)2.2 方案二(单片机电路方案)------------------------------------------(8)第3章系统总体介绍------------------------------------------------(9)3.1 系统组成-------------------------------------------(9)3.2 里程计量及费用计算功能-----------------------------(9)3.3 语音播放功能---------------------------------------(10)3.4 实时时钟功能---------------------------------------(10)3.5按键功能-------------------------------------------(10)3.6 555功能-------------------------------------------(11)3.6电路设计原理图-------------------------------------(12)3.7 电路设计PCB图-------------------------------------------------------(13)第4章硬件设计-----------------------------------------------------------(14)4.1 主程序/CPU模块 ------------------------------------------------------(14)4.2 语音播放模块-----------------------------------------------------------(17)4.3脉冲发生器模块------------------------------------------------------(26)4.4时钟模块--------------------------------------------(27)4.5按键扫描模块------------------------------------------------------------(29)4.6掉电保护模块----------------------------------------(30)4.7显示模块--------------------------------------------------------------------(31)第5章系统程序设计------------------------------------(33)5.1系统主程序流程框图-----------------------------------(34)5.2 里程和费率计算程序流程图-----------------------------(35)5. 3 程序设计------------------------------------------------------------------(36)第6章设计心得---------------------------------(41)致谢---------------------------------------------(42)参考文献 ----------------------------------------------------------------------------(43)附录----------------------------------------------------(44)1.1元件清单----------------------------------------------------------------------(44)1.2时序图-------------------------------------------------------------------------(48)第1章前言1.1出租车计费器概述出租车计费器是乘客与司机双方的交易准则,它是出租车行业发展的重要标志,是出租车中最重要的工具。
出租车计价器系统设计一、引言二、系统需求1.实时计算乘客的费用,包括起步价、里程费和时间费。
2.支持现金和电子支付两种支付方式。
3.集成GPS导航功能,方便司机找到目的地。
4.提供乘客和司机的行程记录,以便后续查询和管理。
5.具备车辆运营数据统计和分析功能,方便管理者监控业务运营情况。
6.界面友好,操作简单方便。
三、系统设计1.架构设计出租车计价器系统可以采用分布式架构,主要由计价器终端设备、服务器和后台管理系统组成。
计价器终端设备负责实时计算费用,接收用户支付信息并提供导航功能。
服务器将终端设备上的数据上传到后台管理系统,并处理支付信息。
后台管理系统负责行程记录的存储和查询,车辆运营数据统计等功能。
2.功能设计计价器终端设备的主要功能包括:-实时显示乘客的费用,包括起步费、里程费和时间费。
-支持现金和电子支付两种支付方式。
对于现金支付,可以提供找零功能。
-集成GPS导航功能,显示乘客的目的地并为司机提供导航指引。
-提供乘客和司机的行程记录,包括乘车地点、目的地、起步时间、到达时间等信息。
后台管理系统的主要功能包括:-存储和查询行程记录,方便乘客和司机进行查询,也方便管理者进行统计和分析。
-处理支付信息,包括验证支付的有效性和进行支付结果的记录。
-根据行程记录和支付信息生成报表,进行车辆运营数据的统计和分析。
3.数据库设计系统需要至少设计以下几个数据库表:-行程记录表,包含乘车地点、目的地、起步时间、到达时间等信息。
-支付记录表,包含支付方式、支付金额、支付结果等信息。
-车辆表,包含车辆的基本信息,如车牌号、品牌、颜色等。
-用户表,包含乘客的基本信息,如姓名、手机号等。
四、系统流程1.乘客叫车并上车后,司机启动计价器终端设备。
2.计价器显示乘客的起步费和当前费用,并启动计时和记录起步时间。
3.计价器终端设备显示乘客的目的地,并提供导航指引。
4.司机按照导航指引将乘客送到目的地。
5.到达目的地后,计价器停止计时,显示乘客的总费用。
课程设计东北石油大学课程设计任务书课程EDA技术课程设计题目出租车自动计费系统专业电子信息工程姓名邵文瀚学号080901140717主要内容、基本要求、主要参考资料等主要内容:设计一个最大量程为99.99元的出租车自动计费,计费器具有行车里程计费、等候时间计费及起价三部分功能,并用数码管显示车费的数目。
基本要求:1、设计一个出租车自动计费器,具有行车里程计费、等候时间计费、及起价三部分,用四位数码管显示总金额,最大值为99.99元;2、行车里程单价1元/公里,等候时间单价0.5元/10分钟,起价3元(3公里起价)均能通过人工输入。
3、行车里程的计费电路将汽车行驶的里程数转换成与之成正比的脉冲数,然后由计数译码电路转换成收费金额,实验中以一个脉冲模拟汽车前进十米,则每100个脉冲表示1公里,然后用BCD码比例乘法器将里程脉冲乘以每公里单价的比例系数,比例系数可由开关预置。
例如单价是1.0元/公里,则脉冲当量为0.01元/脉冲。
4、用LED显示行驶公里数,两个数码管显示收费金额。
主要参考资料:[1] 潘松著.EDA技术实用教程(第二版). 北京:科学出版社,2005.[2] 康华光主编.电子技术基础模拟部分. 北京:高教出版社,2006.[3] 阎石主编.数字电子技术基础. 北京:高教出版社,2003.完成期限2011.3.11指导教师专业负责人2011年3月7日一、总体设计思想1.基本原理随着出租车行业的发展,出租车已经是城市交通的重要组成部分,从加强行业管理以及减少司机与乘客的纠纷出发,具有良好性能的计价器对出租车司机和乘客来说都是很必要的。
而采用模拟电路和数字电路设计的计价器整体电路的规模较大,用到的器件多,造成故障率高,难调试。
而采用单片机进行的设计,相对来说功能强大,用较少的硬件和适当的软件相互配合可以很容易地实现设计要求,且灵活性强,可以通过软件编程来完成更多的附加功能。
本设计采用AT89S52单片机为主控器,以A44E霍尔传感器测距,实现对出租车的多功能的计价设计,输出采用8段数码显示管。
出租汽车计价器检定管理操作系统刘伟彧(哈尔滨市计量检定测试所,哈尔滨市150036)摘要计算机的应用现以遍及到社会生产和生活中的各个领域,本文则是关于出租汽车计价器检定管理操作系统的应用论文。
关键词操作系统数据库模糊查询热键一、概述出租汽车计价器检定管理操作系统采用FOXPRO2.6数据库系统,通过4个数据库文件(SWPG.DBF编辑数据库,WCNG.DBF公司库,SYS.DBF系统库,TEMP.DBF缓冲库)设计编制完成的。
本系统具有良好的用户界面,并提供简明必要的汉字提示,操作简单,用户通过人机交互式的使用方式,可方便地完成特定的功能。
此系统除具备JJG517—88出租汽车计价器检定规程中检定记录所具有的全部功能外,还具有众多的如根据输入的数据自动计算合格范围、自动判断其是否合格、自动计算合格率、受检率及模糊查找等特殊的功能。
二、系统运行的环境1.硬件运行环境:(1)主机:386以上各种兼容机,(2)内存:640KB基本内存;(3)打印机:各种打印机。
2.软件环境:PC-DOS和MS-DOS3.3以上版本的磁盘操作系统与UCDOS5.0以上版本汉字操作系统支持。
三、系统程序文件(见系统功能图)1.JJO MAIN.prg(主程序)功能:列出管理软件主菜单,供操作人员选择调用,同时列出已在案的所在地区出租汽车车辆总数、总受检率、总合格率、总的停运、报废车辆数及系统信息,其中包含了5个子菜单。
输入完毕,系统自动按顺序建立公司代码。
3.CHA.prg(公司代码浏览)功能:列出已登记的公司代码,以及该公司已检计价器的合格数量以备单车数据输入所用。
该子程序模块又包含了:(1)CHANGE.prg修改子程序,用于数据的修改,热键F1:(2)DELE.prg删除子程序,用于数据的删除,热键F3。
4.BIANJL.prg(编辑子程序)功能:输入欲编辑的公司代码后,以滚动屏方式随机将所有属于该公司的注册检定车辆按车牌号升序列出,并可随时进入单个车辆的数据输入。
本计价器的主要功能包括:计时功能;计费功能;计程功能;LCD显示;功能:1)启动计费器,里程计数器和时间计数器从零开始,费用计费器从10元开始计算;2)根据出租车行驶的里程数和时间(包括停车等待时间)进行计费,当出租车启动在3公里以内,且在等待累计2分钟内时费用计数器复位为起步价10元;3)当出租车在行驶状态下超过3公里时,每满1公里时,费用计数器加1元;4)当出租车等待时间累计超过2分钟时以每分钟1元计费。
整体设计方案:Clk 输入 C9;Sw1输入 L14;TXD 输出 u8;Flash_ce 输出 k18;Lcd_e 输出 M18;LCD_RW 输出 L17;LCD_RS 输出 L18;LCD_d[3:0] 输出 R15 R16 P17 M15;模块划分1.分频电路模块:2. 时间计算模块:start:启动信号,当start为高电平时出租车开动,选择以公里计费;当start为低电平时出租车等待;选择以时间计费m:输出的时间分信号s: 输出的时间秒信号Time_enable:控制计费的时间信号,当其为高电平时控制计数器按时间数计数3. 计程功能“distance_enable:控制计费的公里信号,当其为高电平时控制计数器按路程计数distance:输出的公里信号4.判断控制模块;select_clk:输出选择的时钟信号5.计费模块:fee: 输出的费用信号6.显示模块:分频程序:module div(clk_50M,clk,reset);input clk_50M;input reset;output clk;wire clk_50M;wire reset;reg clk;reg [7:0] count;always@ (posedge clk_50M or negedge reset)beginif(!reset)begincount<=0;clk<=0;endelseif(count==8'd100)begincount<=8'd0;clk<=~clk;endelsecount<=count+1'd1;endendmodulemodule test;reg clk_50M;reg reset;wire clk;div u1(.clk_50M(clk_50M),.reset(reset),.clk(clk));initial#0 clk_50M=1'b0;always #5 clk_50M=~clk_50M;initialbegin#0 reset=1'b0;#100 reset=1'b1;endendmodule计时激励:module timemokuai(clk,reset,start,s,m,time_enable);// 端口的定义input clk,reset,start;output [7:0] s;//输出的秒output [7:0] m;//输出的分output time_enable;//输出的控制计费的信号reg [7:0] s;reg [7:0] m;wire time_enable;always@(posedge clk or negedge reset)//异步复位beginif(!reset)//低电平有效begin //复位s<=8'd0;m<=8'd0;endelse if(!start)//start 信号低电平有效beginif(s[3:0]==9)// 秒的低四位是9begins[3:0]<=4'd0;//清零if(s[7:4]==5) // 秒的高四位是5begins[7:4]<=4'd0; //清零if(m[3:0]==9) // 分的低奈皇?beginm[3:0]<=4'd0; //清零if(m[7:4]==9) // 分的高四位是9m[7:4]<=4'd0; //清零else m[7:4]<=m[7:4]+1'd1; // 分的高四位不是9加一endelse m[3:0]<=m[3:0]+1'd1; //分的低四位不是9加一endelse s[7:4]<=s[7:4]+1'd1; // 秒的高四位不是5加一endelse s[3:0]<=s[3:0]+1'd1; //秒的低四位不是9加一end//end alwaysendassign time_enable=((m[7:0]>8'd2)&&(s[7:0]==8'd0))?1'd1:1'd0; //产生time_enable信号。
一、基本功能1、显示:可以显示里程、金额、等待时间、速度。
2、计费功能:起步公里数为2公里,价格为6元;若实际运行大于2公里,按单程价格为1.6元/公里,往返则价格为1.6元/公里。
3、按键功能:单程/往返分别由“单程”按键和“往返”按键设定;按“暂停”键,计价器可暂停计价;按“清除”键,计价器能将记录数据(里程、等待时间与金额等)自动清0;按“查询”键,能自动显示总等待时间;按“返回”键,仍然显示里程和金额。
二、系统的组成及工作原理计价器的单片机控制方案图如图1 单片机控制方案图所示。
利用单片机丰富的IO端口,及其控制的灵活性,实现基本的里程计价功能和价格选择、时间显示控制等功能。
不但能实现所要求的功能而且能在很大的程度上扩展功能,而且还可以方便的对系统进行升级图1 单片机控制方案图三、总体设计电路图总体电路图如图2所示图2 总体电路图四、硬件电路设计1、里程计算,计价单元设计里程计算是通过安装在车轮上的霍尔传感器A44E检测到的信号,在该系统中用两种脉冲发生器进行模拟,送到单片机,经处理计算,送给显示单元的。
其原理如图3所示。
图3 模拟测距示意图555电路来产生一个脉冲来模拟霍尔传感器输出的里程脉冲,选择P1.0口作为信号的输入端,内部采用外部中断0,555脉冲产生电路输出一个脉冲信号直接加到IO口P1.0上(产生的频率F=1/T=1.414/[(R1+2R2)C1]),由单片机的内部算法对脉冲计数,通过计算将脉冲增加体现在金额和里程上。
具体电路如图4所示。
图4 555脉冲产生电路图光耦电路是以光为媒介传输电信号的一种光一电转换器件,是另一种模拟将出租车行驶时车轮所转的圈数转换成脉冲信号送入数据处理电路。
H92B4是光偶电路的基本元件,它由发光源和受光器两部分组成,发光源为发光二极管,受光器为光敏三极管。
当发光源与受光器之间存在光线阻挡时,输出端由高电平变为低电平,恢复光通路又变为高电平,就这样形成一个个的高低电平脉冲。
出租车计费器设计要求计费标准为武汉起步3元,1公里后为4元/公里,1.5公里后为5元/公里,2公里后为6元/公里,2.5公里后为7元/公里,3公里后为8元/公里,以后1.4元/公里。
当计费达到20元后,每公里加收50%的车费,车停止每3分钟增加0.7元。
车费显示出来,有一位小数。
1、 设计原理及方法如图1所示,包含运算控制模块、分频器、显示模块这三大部分。
图1系统框图运算控制器模块将其他两个进行连接,是本次设计的核心。
它包含计程器、计时器、计价器,同时还有读取外部的拨码开关控制信号,提供当前显示信号与显示位选信号,从而周期性交替显示计价/计时信息、等时信息。
计程器、计时器、计价器根据位选信号,输出相应数据的当前选中数字,由顶层模块根据显示数据类型变换信号进行选择,传输给显示模块。
实验箱的时钟信号为20MHz方波,由分频器分为10Hz的计时信号(一个周期代表现实中的1s)、10Hz的计程信号(一个周期代表现实中的10m)、500Hz的数码管扫描信号(扫描频率62.5Hz)、0.2Hz的显示数据类型变换信号(变化周期5s)。
显示模块由实验箱上的3/8译码器、五个LED灯构成状态的指示灯、程序编写的一个七段数码管译码器。
2、主要模块设计2.1、速度模块速度模块首先根据start信号判断是否开始计费,然后根据输入的速度档位sp[2..0]的判断,确定行驶100m所需要的时钟数,每前进100m,输出一个clkout 信号。
同时由cnt对clk进行计数,当cnt等于kinside时,把clkout信号置1,cnt清0。
其模块框图如图2图2速度模块框图2.1.1、速度模块仿真速度模块的仿真波形图如图3示。
该模块根据出租车所处的运行状态和不同的形式速度,对相应数目的时钟周期进行计数,车每行驶100m时输出信号clkout 输出高电平。
图3速度模块仿真波形图2.2、计程模块主要用于记录行进的距离,其模块框图如图4所示。
出租车计价器程序的设计(完整)出租车计价器程序是一个在出租车里程查询和费用计算的应用程序。
它能够简化出租车司机的工作,节省出租车乘客的时间,确保费用的准确计算。
以下是一份关于出租车计价器程序的完整设计,包括需求分析、功能设计、数据结构与算法设计以及界面设计。
需求分析:出租车计价器程序主要面向出租车司机和乘客,满足以下基本需求:对于司机:1. 可以输入起点和终点的地址或位置信息。
2. 可以自动计算车程里程和费用,并将结果显示出来。
3. 可以存储以前的乘车记录,以便统计业绩和分析乘客需求。
4. 可以提供多种语言和计费标准的选择。
对于乘客:1. 可以查询最合适的出租车车辆,方便的下单和乘车。
2. 可以清楚的了解费用计算和支付方式。
3. 可以评价司机和服务质量,提供建议和反馈。
功能设计:根据上述需求,出租车计价器程序的主要功能包括:1. 地址输入功能:允许用户输入起点和终点的地址或位置信息,包括街道、城市、州或国家等信息。
2. 路程计算功能:通过使用谷歌地图或其他地图服务的API,计算车程里程和估算费用。
该功能支持使用不同的度量标准,例如英里、千米或小时费率等。
3. 乘车记录存储功能:存储每位乘客的信息及计费历史,用于分析和管理出租车运营。
4. 多语言支持功能:支持使用多种语言的用户,例如英文、中文、西班牙语、法语等,方便全球用户使用。
5. 流程优化功能:在操作过程中自动提示并引导用户,并根据用户信息进行推荐,简化用户体验。
数据结构与算法设计:出租车计价器程序的核心算法是基于Google Maps API 和其他地图服务API的距离计算和费率计算,使用常见的计费方式,如按里程计费、按时间计费、按时速计费等。
此外,应当使用数据库,来储存乘客和司机的个人信息和历史计费信息。
数据库应该使用关系型数据库的设计,并具有高性能和高可扩展性。
界面设计:出租车计价器程序的界面设计应该是简洁、直观和易于使用的。
在程序的主界面上,必须让用户能够输入起点和终点的地址信息,提供多种语言和计费标准的选择。
出租车计价器程序出租车计价器是一种在计算乘客乘坐出租车费用时使用的设备。
它通过收集乘客的乘车距离、时间和其他因素来计算费用。
在过去的几十年里,出租车计价器一直是出租车行业的重要工具之一,它能够确保乘客和司机之间的费用计算公平和准确。
出租车计价器通常安装在出租车的车内,它的外观和功能可能因不同地区和车辆而有所不同。
但是,无论其外观如何,计价器的基本原理都是相同的。
当乘客上车时,司机会启动计价器,它会记录下乘客上车的时间和位置。
当乘客下车时,计价器会停止计时并计算出费用。
计价器的计费方式可以根据不同地区和乘车服务的类型而有所不同。
例如,一些地区使用按里程计费的方式,计价器会根据乘客乘车的距离来计算费用。
其他地区可能使用按时间计费的方式,计价器会根据乘客乘坐的时间来计算费用。
还有一些地区则会同时考虑里程和时间来计算费用。
除了里程和时间,计价器还可以考虑其他因素来计算费用。
例如,一些计价器会考虑交通拥堵的程度和使用的车型来调整费用。
这些因素可以确保乘客在不同的交通条件下能够获得公平的费用。
出租车计价器的使用可以带来一些好处。
首先,它能够为乘客提供方便和透明的费用计算方式。
乘客只需看着计价器上显示的费用就能知道自己需要支付的金额,避免了对费用的猜测和争议。
其次,计价器的使用可以提高司机和乘客之间的信任和合作。
乘客知道他们支付的费用是根据公正的标准计算出来的,司机也能够遵守计价器所规定的计费方式。
然而,出租车计价器也存在一些问题和挑战。
首先,计价器的准确性可能会受到影响。
例如,如果计价器的时间或里程计算不准确,那么乘客可能需要支付比实际乘车费用更多的费用。
这对于乘客来说是不公平的,并且可能会影响他们对出租车服务的信任。
其次,计价器的使用也可能会面临技术问题。
例如,计价器可能会出现故障或需要定期维护和检修。
这些问题可能会导致计价器不能正常工作,给乘客和司机带来不便。
为了解决上述问题,出租车行业需要不断改进和升级计价器技术。
该系统利用VHDL语言、PLD设计出租车计费系统,以MAX+PLUSⅡ软件作为开发平台,设计了出租车计费器系统程序并进行了程序仿真。
使其实现计费以及预置和模拟汽车启动、停止、暂停等功能,并动态扫描显示车费数目。
关键词: 出租车计费器;计数器;VHDL语言;MAX+PLUSⅡ;一、实验任务及要求1.能实现计费功能,计费标准为:按行驶里程收费,起步费为10.00元,并在车行3公里后再按2元/公里,当计费器计费达到或超过一定收费(如20元)时,每公里加收50%的车费,车停止不计费。
2. 实现预置功能:能预置起步费、每公里收费、车行加费里程。
3. 实现模拟功能:能模拟汽车启动、停止、暂停、车速等状态。
4. 设计动态扫描电路:将车费显示出来,有两位小数。
5. 用VHDL语言设计符合上述功能要求的出租车计费器,并用层次化设计方法设计该电路。
6. 各计数器的计数状态用功能仿真的方法验证,并通过有关波形确认电路设计是否正确。
7. 完成电路全部设计后,通过系统实验箱下载验证设计的正确性。
二、实验原理系统顶层框图:计费器按里程收费,每100米开始一次计费。
各模块功能如下:(1) 车速控制模块当起停键为启动状态时(高电平),模块根据车速选择和基本车速发出响应频率的脉冲驱动计费器和里程显示模块进行计数;当处于停止状态时暂停发出脉冲,此时计费器和里程显示模块相应的停止计数。
(2) 里程动态显示模块其包括计数车速控制模块发出的脉冲以及将计数显示动态显示出来,每来一个脉冲里程值加0.1(控制器每发一个脉冲代表运行了0.1公里)。
(3) 计费动态显示模块其初值为10元,当里程超过3公里后才接受计数车速控制模块发出的脉冲的驱动,并且计数显示动态显示出来,每来一个脉冲(代表运行了0.5公里)其数值加1元,当收费超过20时数值加1.5元。
三、出租车计费系统的实现3.1系统的总体模块图:3.2系统各功能模块的实现:(1)模块MS的实现模块MS,输入端口CK0、CK1为两个不同的时钟信号,来模拟汽车的加速和匀速,JS加速按键。
摘要现在各大中城市出租车行业都已普及自动计价器,所以计价器技术的发展已成定局,预计未来计价器市场很有前景。
计价器作为出租车的一个重要组成部分,关系着出租车司机和乘客双方利益,起着重要的作用,因此,具有良好性能的计价器对广大出租车司机朋友和乘客来说是很必要的。
但是现阶段出租车的计费系统功能有时候并不能满足出租车司机的意愿。
本课题是出租车计价器系统的设计。
重点是设计出租车计价器的实用性,并尽量使最后的成品接近于商品。
整个系统是以89S51单片机为中心,采用A44E霍尔传感器对轮胎转数进行计数,实现对出租车里程的测量,并最终计算出结果。
其中采用掉电存储芯片AT24C02使系统在掉电的时候对单价、里程等信息进行存储,人机交换界面采用的是LCD1602液晶屏显示,并且通过语音芯片进行播报。
本电路设计的出租车计价器不但能实现计价的功能,同时还能实现根据时钟芯片自动调整白天、黑天计价模式,能自动处理中途等待等功能。
关键词:单片机AT89S51;LCD1602;出租车计价器;霍尔传感器;AT24C02ABSTRACTAutomatic taximeter has been universal among Cities for now. The taximeter technology is a foregone conclusion already. So taximeter of cars is still potential at next generation. As an important component taximeter is not only the interests of taxi drivers but also the passengers, so it has played an important role. The good performed taximeter is necessary for the public. The current taxi billing systems don’t meet the wishes of people. In this article we talk about various designs of taximeter system.The point is to design the practicality of the taximeter and as far as possible to make the final finished product close to commodities. The whole system is based on single-chip 89S51 and use a hall-sensor A44E to count the number of revolutions. In this way we can achieve the statistics of the taxi mileage and give out the final results. In this design we use AT24C02 to store the price, mileage and other information when the power is down. The man-machine interface of the exchange is LCD1602 screen, and through the voice chip broadcasts. This circuit design can not only realize the meter taxi valuation function, but also can realize the automatic adjustment according to the clock chips during the day, dark pricing mode, it can automatic processing midway waiting for function. Keywords: single-chip AT89S51; LCD1602; Taximeter; Hall sensor; AT24C02目录摘要 (I)ABSTRACT ....................................................................................... I I 1 绪论. (1)1.1 国内外出租车计价器的研究现状 (1)1.2 国内外出租车计价器的发展趋势 (2)1.3 本课题的研究目的及意义 (2)2 出租车计价器的方案论证 (4)2.1 出租车计价器的功能要求 (4)2.2 方案论证与比较 (5)3 出租车计价器的硬件设计 (7)3.1 单片机的介绍 (7)3.2 单片机最小系统 (11)3.3 里程计算模块的设计 (13)3.4 显示模块设计 (16)3.5 语音模块的设计 (18)3.6 掉电存储电路的设计 (21)3.7 按键电路的设计 (23)3.8 时钟电路的设计 (24)4 出租车计价器的软件设计 (27)4.1 模块介绍 (27)4.2 主程序模块 (27)4.3 里程计数中断程序 (28)4.3 定时中断服务程序 (29)4.4 中途等待服务程序 (30)4.5 显示服务子程序 (31)4.6 键盘服务程序 (33)5 系统调试 (34)5.1 软件调试 (34)5.2 里程计价测试 (35)5.2 掉电存储测试 (37)结论与展望 (38)可行性分析报告 (39)参考文献 (40)致谢 (41)附录一 (42)附录二 (43)附录三 (76)1 绪论出租车计价器是出租车营运收费的专用智能化仪表,随着电子技术的发展,出租车计价器技术也在不断进步和提高。
课程设计报告项目名称:出租车计价器设计与制作课程名称:单片机技术二级学院:电气与电子工程学院系:电气工程系班级: 14电气4班学号: 2014010143409 学生姓名:黄凌周小组成员:刘智超黄凌周指导教师:钟立华成绩:报告完成日期2016 年12 月20 日目录摘要 (2)1 课程设计任务书 (3)1.1 课程设计任务 (3)1.2 课程设计方案 (3)2硬件电路设计 (4)2.1 振荡电路 (4)2.2 复位电路设计 (5)2.3 键盘接口电路 (5)2.4 显示电路 (6)2.4.1 1602LCD的基本参数及引脚功能 (6)2.4.2 显示模块采用1602液晶显示接口电路 (7)2.5 单片机各引脚功能说明 (7)3 软件设计 (10)3.1 单片机资源使用 (10)3.2 单片机软件模块设计 (10)3.2.1 中断子函数 (10)3.2.2 判键子函数 (11)3.2.3 显示子程序 (11)3.3 总程序流程框图 (13)总结 (14)参考文献 (15)附录1 元件件清单 (16)附录2 原理图 (17)附录3 程序清单 (18)摘要本设计的是一个基于单片机STC89C52的出租车自动计费设计,附有复位电路,时钟电路,键盘电路等。
复位电路是单片机的初始化操作,除了正常的初始化外,为摆脱困境,通过复位电路可以重新开始。
时钟电路采用12MHz的晶振,作为系统的时钟源,具有较高的准确性。
在上电时字符型液晶1602显示最初的起步价,里程收费,等待时间收费三种收费,通过按键可以调整起步价,里程收费,等待时间收费。
通过按键模拟出租车的运行,暂停,停止。
在1602液晶上可以显示运行的时间,运行时暂停的时间,通过计算可以得出总共的费用和总的路程。
在这里主要是以STC89C52单片机为核心控制器,P1口接1602液晶显示模块。
关键字STC89C52;1602液晶;出租车计费器1 课程设计任务书1.1 课程设计任务基于单片机出租车模拟计价器,采用at24c02存储芯片+LCD1602液晶显示等设计而成。
出租车计价器系统-完整版⽬录毕业设计任务书...................................... 错误!未定义书签。
毕业设计成绩评定表.................................. 错误!未定义书签。
毕业(论⽂)设计答辩申请书............................ 错误!未定义书签。
正⽂.. (1)中⽂摘要及关键词 (1)引⾔ (2)第⼀章出租车计价器系统功能描述 (3)1.1 计价器整体功能描述结构 (3)1.2 各部分电路功能描述 (3)第⼆章⽅案论证 (4)2.1 主控电路选择 (4)2.2 显⽰电路选择 (4)第三章计价器系统电路功能单元设计 (5)3.1 电源模块设计 (5)3.2 ⾥程、计价单元的设计 (5)3.3 数据显⽰单元的设计 (7)3.4 按键及数据显⽰单元的设计 (7)第四章主要元器件选择及介绍 (8)4.1 单⽚机选择 (8)4.2 MCS-51系列单⽚机内部结构及功能部件 (8)4.2.1 MCS-51系列单⽚机的内部结构框图 (8)4.2.2 单⽚机外部引脚说明 (9)4.2.3 并⾏输⼊/输出接⼝ (11)4.3 1602字符液晶显⽰简介 (12)第五章程序设计 (15)5.1 系统主程序设计 (15)5.2 定时中断服务程序 (15)5.3 ⾥程计数中断服务程序 (15)5.4 中途等待中断服务程序 (15)5.5 显⽰⼦程序服务程序 (15)5.6 键盘服务程序 (16)5.7 程序流程图 (16)第六章设计总结及致谢 (18)6.1 设计总结 (18)6.2 致谢 (18)参考⽂献 (19)附件 (20)附录1 (20)附录2 (20)毕业论⽂答辩委员会表决意见.......................... 错误!未定义书签。
毕业论⽂答辩过程记录表.............................. 错误!未定义书签。
出租车计价器系统设计
1.系统架构:出租车计价器系统的架构应该分为前端和后端两个部分。
前端负责收集乘客相关的信息,如起始时间、终止时间、起点和终点的位
置等,而后端负责根据这些信息进行计算并返回车费结果。
2.数据采集:为了实现计价器的功能,需要采集乘客乘车时的时间和
地理位置信息。
可以使用全球定位系统(GPS)来获取车辆的位置信息,
并通过系统的时钟记录乘车开始和结束的时间。
3.价格计算规则:出租车计价器系统的价格计算规则应该根据当地的
出租车定价政策来确定。
一般情况下,车费的计算会根据乘车的时间和距
离进行,同时还可能考虑其他因素,如车辆类型、夜间加价等。
4.数据存储和管理:为了实现出租车计价器系统的正常运行,需要将
乘车相关的数据进行存储和管理。
可以使用数据库来存储乘客和乘车信息,并使用相关的查询和更新操作进行数据的管理。
5.界面设计:出租车计价器系统的界面应该简洁、易用,方便乘客进
行操作。
可以使用图形用户界面(GUI)来实现用户与系统的交互,并提
供必要的输入和输出界面。
6.维护和升级:出租车计价器系统的维护和升级是保证系统稳定运行
的重要环节。
需要定期检查系统的硬件和软件设备,对系统进行故障排除
和性能优化,并根据出租车定价政策的更新进行相应的系统升级。
综上所述,出租车计价器系统应该具备数据采集、价格计算规则、数
据存储和管理、界面设计以及维护和升级等关键功能。
通过合理的系统架
构和设计,可以实现对出租车乘客车费的准确计算和及时反馈,提升乘客
的满意度和司机的收益。
#include <reg52.h>#include <absacc.h>#define uint unsigned int#define uchar unsigned char#define DISPON 0x3f //显示开#define DISPOFF 0x3e //显示关#define FIRSTROW 0xc0 //显示起始行设置1 1 L5 L4 L3 L2 L1 L0,在0到63行间选择#define SETY 0xb8 //Y方向,8页64行,1 0 1 1 1 P2 P1 P0,0到8页选择#define SETX 0x40 //X方向,半屏64列,0 1 C5 C4 C3 C2 C1 C0 ,0到63列选择/*P2+P0口16位编址,有效位是P2.3~P2.0,无关位用“1”表示P2.0--RS,P2.1--RW,P2.2--CS2,P2.3--CS1右屏命令和数据读写编址 CS2 CS1 RW RS*/#define LLCD_CMD_WR XBYTE[0xf4ff] //0 1 0 0#define LLCD_DAT_WR XBYTE[0xf5ff] //0 1 0 1#define LLCD_CMD_RD XBYTE[0xf6ff] //0 1 1 0#define LLCD_DAT_RD XBYTE[0xf7ff] //0 1 1 1/*左屏命令和数据读写编址*/#define RLCD_CMD_WR XBYTE[0xf8ff] //1 0 0 0#define RLCD_DAT_WR XBYTE[0xf9ff] //1 0 0 1#define RLCD_CMD_RD XBYTE[0xfaff] //1 0 1 0#define RLCD_DAT_RD XBYTE[0xfbff] //1 0 1 1/**********************数据坐标记录**************************左-路程:整数部分 x=9,y=1,小数部分 x=31,y=1左-路程费用:整数部分 x=9,y=3,小数部分 x=31,y=3总费用:整数部分-左:x=45,y=5路程单价:x=34,y=7右-时间:整数部分 x=20,y=1右-时间费用:整数部分 x=10,y=3,小数部分 x=32,y=3总费用:小数部分-右:x=2,y=5时间单价:x=44,y=7*************************************************************/#define L_Mile_X_Z 9#define L_Mile_X_D 30#define L_Mile_Y 1#define L_Cost_X_Z 9#define L_Cost_X_D 30#define L_Cost_Y 3#define L_Total_X 45#define L_Total_Y 5#define L_Unit_X 34#define L_Unit_Y 7#define R_Time_X 20#define R_Time_Y 1#define R_Cost_X_Z 10#define R_Cost_X_D 31#define R_Cost_Y 3#define R_Total_X 2#define R_Total_Y 5#define R_Unit_X 44#define R_Unit_Y 7sbit LED=P2^7 ;sbit START=P1^0;sbit STOP=P1^1;sbit CLEAR=P1^2;sbit MUINT_UP=P1^4;sbit MUINT_D=P1^5;sbit TUINT_UP=P1^6;sbit TUINT_D=P1^7;uchar Mile_Unit=4,Time_Unit=2;long time_cost,time_cost_Z,time_cost_D,time_con_s,time_con_m;long mile_cost,mile_cost_Z,mile_cost_D,mile_con_m,mile_con_km;long speed_con,speed_con_m,speed,speed_flag,cost_flag;long total_z=5,total_d;code char shu[10][6]={0x3E,0x41,0x41,0x41,0x3E,0x00, //00x00,0x42,0x7F,0x40,0x00,0x00, //10x42,0x61,0x51,0x49,0x46,0x00, //20x22,0x41,0x49,0x49,0x36,0x00, //30x38,0x24,0x22,0x7F,0x20,0x00, //40x27,0x45,0x45,0x45,0x39,0x00, //50x3E,0x45,0x45,0x45,0x38,0x00, //60x01,0x01,0x79,0x05,0x03,0x00, //70x36,0x49,0x49,0x49,0x36,0x00, //80x0E,0x51,0x51,0x51,0x3E,0x00, //9};/*************************初始化界面*****************************/code uchar logo[]={0xFF,0x07,0x03,0xE1,0x11,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09, 0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09, 0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09, 0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x09,0x09,0x11,0xE1,0x03,0x07,0xFF,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09, 0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09, 0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x09,0x09,0x11,0xE1,0x03,0x07,0xFF, 0xFE,0x00,0x00,0xFF,0x00,0x7E,0x3C,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xFE,0x10,0x28,0x44,0x82,0x00,0xF8,0x08,0xF8,0x08,0xF8,0x00,0xFF,0x00,0x00,0xFF, 0xFF,0x00,0x00,0xFF,0x00,0x7E,0x3C,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x04, 0xF8,0x04,0xFE,0x00,0xF4,0x00,0xF8,0x08,0xF8,0x08,0xF8,0x00,0xFF,0x00,0x00,0xFE, 0xFE,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x00,0x02, 0x02,0x02,0x02,0x02,0x00,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x02,0x02, 0x02,0x02,0x02,0x00,0x02,0x02,0x02,0x02,0x02,0x00,0x02,0x02,0x02,0x02,0x02,0x00, 0x00,0x00,0x40,0x80,0x00,0x00,0x00,0x80,0x40,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF, 0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x00,0x02,0x02,0x02,0x02,0x02,0x00, 0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x80,0x00,0x00,0x00,0x80,0x40,0x00,0x00,0x00,0xFF,0x00,0x00,0xFE, 0xFE,0x00,0x00,0xFF,0x00,0xFC,0x78,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x12,0x12,0x13,0x7E,0x13,0x12,0x12,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF, 0xFF,0x00,0x00,0xFF,0x00,0xFC,0x78,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x12,0x12,0x13,0x7E,0x13,0x12,0x12,0x00,0x00,0x00,0xFF,0x00,0x00,0xFE, 0xFE,0x00,0x00,0x01,0x02,0x04,0x04,0x04,0x04,0x05,0x05,0x05,0x05,0x05,0x04,0x05, 0x05,0x05,0x05,0x05,0x04,0x05,0x05,0x05,0x05,0xC5,0x24,0x14,0x14,0x14,0x15,0x15, 0x15,0x15,0x15,0x14,0x15,0x15,0x15,0x15,0x15,0x14,0x15,0x15,0x15,0x15,0x15,0x14, 0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x12,0x11,0x10,0x10,0x1F, 0x1F,0x10,0x10,0x11,0x12,0x14,0x14,0x14,0x14,0x14,0x15,0x15,0x15,0x15,0x15,0x14, 0x15,0x15,0x15,0x15,0x15,0x14,0x15,0x15,0x15,0x15,0x15,0x14,0x14,0x14,0x14,0x15, 0x15,0x15,0x15,0x15,0x14,0x15,0x25,0xC5,0x05,0x05,0x04,0x05,0x05,0x05,0x05,0x05, 0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x02,0x01,0x00,0x00,0xFE, 0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x7E,0x3C, 0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60, 0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x4A,0x4C, 0xF8,0x4C,0x4A,0x49,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x04,0x04,0x04,0x04,0x04, 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x05, 0x05,0x05,0x04,0x05,0x05,0x05,0x05,0x05,0x04,0x05,0x05,0x05,0x05,0x05,0x04,0xFC, 0xFC,0x04,0x05,0x05,0x05,0x05,0x05,0x04,0x05,0x05,0x05,0x05,0x05,0x04,0x05,0x05, 0x05,0x05,0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04, 0x05,0x04,0x04,0x04,0x04,0x04,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE, 0xFE,0xE0,0xC0,0x80,0x80,0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x80,0x80,0x9E,0xA0, 0x20,0x9E,0x80,0xBC,0x82,0x82,0xBC,0x80,0x3D,0x80,0x84,0x9E,0xA4,0xA4,0x80,0xB6, 0x36,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x3E,0x41,0x41,0x41, 0x3E,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x80,0xC0,0xE0,0xFF, 0xFF,0xE0,0xC0,0x80,0x80,0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x80,0x80,0x9E,0xA0, 0x20,0x9E,0x80,0xBC,0x82,0x82,0xBC,0x80,0x3D,0x80,0x84,0x9E,0xA4,0xA4,0x80,0xB6, 0x36,0x80,0x80,0x3E,0x41,0x41,0x41,0x3E,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x80,0xC0,0xE0,0xFE, };/*************************************************************写命令*************************************************************/void lcd_cmd_wr(uchar cmdcode,uchar right){if(right)RLCD_CMD_WR=cmdcode;elseLLCD_CMD_WR=cmdcode;}/*************************************************************写数据*************************************************************/void lcd_data_wr(uchar dispdata,uchar right){if(right)RLCD_DAT_WR=dispdata;elseLLCD_DAT_WR=dispdata;}/*************************************************************数据清屏*************************************************************/void lcd_clr(void){uchar i,j;for(i=0;i<8;i++)lcd_cmd_wr(SETY+i,0);lcd_cmd_wr(SETX,0);lcd_cmd_wr(SETY+i,1);lcd_cmd_wr(SETX,1);for(j=0;j<64;j++){lcd_data_wr(0,0);lcd_data_wr(0,1);}}}/************************************************************* 写一个数字*************************************************************/ void lcd_shu_wr(uchar w,uchar x,uchar y,uchar shu_1){uchar i;lcd_cmd_wr(SETY+y,w);lcd_cmd_wr(SETX+x,w);for(i=0;i<6;i++)lcd_data_wr(shu[shu_1][i],w);}/************************************************************* 写一个三个数字*************************************************************/ void lcd_sanshu_wr(uchar w,uchar x,uchar y,uint str){uint bai,shi,ge;bai=str/100;shi=(str%100)/10;ge=str%10;lcd_shu_wr(w,x,y,bai);lcd_shu_wr(w,x+6,y,shi);lcd_shu_wr(w,x+12,y,ge);}/************************************************************* 写一贞128X64点的图片显示*************************************************************/ void lcd_bmp_wr(uchar *bmp){uchar i,j;for(i=0;i<8;i++)lcd_cmd_wr(SETY+i,0);lcd_cmd_wr(SETX,0);lcd_cmd_wr(SETY+i,1);lcd_cmd_wr(SETX,1);for(j=0;j<64;j++){lcd_data_wr(bmp[128*i+j],0);lcd_data_wr(bmp[128*i+j+64],1);}}}/************************************************************* 延时函数*************************************************************/ DelayNms(uint y){uint x;for(;y>0;y--)for(x=113;x>0;x--);}/************************************************************* LCD初始化*************************************************************/ void lcd_init(void){lcd_cmd_wr(DISPON,0);lcd_cmd_wr(FIRSTROW,0);lcd_cmd_wr(SETY,0);lcd_cmd_wr(SETX,0);lcd_cmd_wr(DISPON,1);lcd_cmd_wr(FIRSTROW,1);lcd_cmd_wr(SETY,1);lcd_cmd_wr(SETX,1);lcd_clr();DelayNms(500);lcd_bmp_wr(logo);//welcome_init();}/************************************************************** 初始化中断,定时器等**************************************************************/void interrput_init(){IT0=1; //外部中断0触发方式:边沿触发EX0=1; //开外部中断0ET0=1; //开定时器中断0ET1=1; //开定时器中断1//EA=1; //开部中断TMOD=0x11; //00010001TH0=(65535-50000)/256;TL0=(65535-50000)%256;TR0=1;TH1=(65535-50000)/256;TL1=(65535-50000)%256;TR1=0;}/**************************************************************显示数据**************************************************************/void display(){lcd_sanshu_wr(0,L_Mile_X_Z,L_Mile_Y,mile_con_km); //写行驶路程lcd_sanshu_wr(0,L_Mile_X_D,L_Mile_Y,mile_con_m);lcd_sanshu_wr(0,L_Cost_X_Z,L_Cost_Y,mile_cost_Z); //写路程费用lcd_sanshu_wr(0,L_Cost_X_D,L_Cost_Y,mile_cost_D);lcd_sanshu_wr(0,L_Total_X,L_Total_Y,total_z); //写总费用整数部分lcd_shu_wr(0,L_Unit_X,L_Unit_Y,Mile_Unit); //写路程单价lcd_sanshu_wr(1,R_Time_X,R_Time_Y,time_con_m); //写行驶时间lcd_sanshu_wr(1,R_Cost_X_Z,R_Cost_Y,time_cost_Z); //写时间费用lcd_shu_wr(1,R_Cost_X_D,R_Cost_Y,time_cost_D);lcd_sanshu_wr(1,R_Total_X,R_Total_Y,total_d); //写总费用小数部分lcd_shu_wr(1,R_Unit_X,R_Unit_Y,Time_Unit); //写时间单价}/*************************************************************键盘输入**************************************************************/void keyboard(){P1=0xff;if(P1!=0xff){DelayNms(1);if(P1!=0xff){if(!START) EA=1;if(!STOP) EA=0;if(!CLEAR){mile_con_km=0;mile_con_m=0;mile_cost_Z=0;mile_cost_D=0;total_z=5;time_con_m=0;time_cost_Z=0;time_cost_D=0;total_d=0;display();}if(!MUINT_UP){Mile_Unit++;while(!MUINT_UP);lcd_shu_wr(0,L_Unit_X,L_Unit_Y,Mile_Unit);//写路程单价}if(!MUINT_D){Mile_Unit--;while(!MUINT_D);lcd_shu_wr(0,L_Unit_X,L_Unit_Y,Mile_Unit);//写路程单价}if(!TUINT_UP){Time_Unit++;while(!TUINT_UP);lcd_shu_wr(1,R_Unit_X,R_Unit_Y,Time_Unit);//写时间单价}if(!TUINT_D){Time_Unit--;while(!TUINT_D);lcd_shu_wr(1,R_Unit_X,R_Unit_Y,Time_Unit);//写时间单价}}}}/**************************************************************测速**************************************************************/ void testspeed(){if(speed>=18){speed_flag=1;TR1=0;}else{speed_flag=0;TR1=1;}}/************************************************************** 主函数**************************************************************/ void main(){lcd_init();interrput_init();display();while(1){keyboard();testspeed();}}/************************************************************* 外部中断0服务程序测所走过的路程,并且测车速*************************************************************/ void Int0() interrupt 0{LED=!LED;speed_con_m++;if(speed_flag){mile_con_m++;if(mile_con_m==1000){mile_con_m=0;mile_con_km++;if(mile_con_km==1)cost_flag=1;}}}/************************************************************定时器0中断服务程序测速计时器*************************************************************/void timer0() interrupt 1{TH0=(65535-50000)/256; //50msTL0=(65535-50000)%256;speed_con++;if(speed_con%5==0) //0.25s测速一次{speed=speed_con_m*2;speed_con_m=0;}if(speed_con==20) ////1s刷新显示一次{speed_con=0;if(cost_flag){mile_cost_D=(mile_con_m*Mile_Unit)%1000; //计算路费用mile_cost_Z=(mile_con_km-1)*Mile_Unit;mile_cost_Z=mile_cost_Z+(mile_con_m*Mile_Unit)/1000;total_z=mile_cost_Z+time_cost_Z; //计算总费用total_z+=5;total_d=mile_cost_D+time_cost_D*100;total_z=total_z+total_d/1000;total_d=total_d%1000;}display();}}/*************************************************************定时器1中断服务程序按时间计费计时器*************************************************************/void timer1() interrupt 3{.TH1=(65535-50000)/256; //50ms计时TL1=(65535-50000)%256;time_con_s++;if(time_con_s==1200) //一分钟{time_con_s=0;time_con_m++;time_cost=time_con_m*Time_Unit; //计算时间费用time_cost_Z=time_cost/10;time_cost_D=time_cost%10;}}11 / 11。
目录中文摘要 (2)ABSTRACT (3)引言 (4)第1章系统总体介绍 (6)1.1系统组成及功能框图 (6)1.2系统各部分功能: (6)1.2.1.里程计量功能 (6)1.2.2.费用计算功能(参照周口市出租车收费标准) (6)1.2.3.语音播放功能 (7)1.2.4.中文菜单显示功能 (7)1.2.5.实时时钟功能 (9)1.2.6.本系统设置4个按键,各个按键的功能如下 (9)1.2.7.系统电路设计原理图 (9)第2章硬件设计 (9)2.1.主程序/CPU模块 (9)2.2语音播放模块 (12)2.3液晶显示驱动模块 (13)2. 4脉冲发生器模块 (15)2. 5时钟模块 (15)2. 6按键扫描模块: (18)第3章系统程序设计 (20)3.1系统主程序流程框图(含程序) (20)3.2里程和费率计算程序流程图(含程序): (24)3.3键盘处理程序流程图 (25)结论................................................ 错误!未定义书签。
致谢................................................ 错误!未定义书签。
参考文献............................................ 错误!未定义书签。
摘要随着经济的发展,带动汽车行业快速发展,出租车日益普遍,了解在出租车上应用的计费系统,对我们日常生活也有帮助。
而使用单片机实现该系统,是深化单片机应用的良好途径。
本方案充分发挥人性化的特点,利用ISD1420的语音功能,配合TG12864液晶模组,模拟实现带语音提示的出租车计价系统。
比较真实地模拟出租车的空车、载客、到站及对各状况的费率的计算、统计、显示和语音播报等功能。
本系统提高同学们用C语言编写程序的能力、单片机应用系统设计综合能力的训练、培养同学们分析问题和解决问题的能力、对同学们的招聘以及参加工作均有帮助。
目录摘要 (Ⅰ)第1章引言 (1)1. 1 出租车计价器概述 (1)1. 2 本设计任务 (1)1.2.1 设计任务 (1)1.2.2 设计要求 (1)1. 3 系统主要功能 (2)第2章出租车计价器硬件设计 (3)2.1 系统的硬件构成及功能 (3)2. 2 AT89S51单片机及其引脚说明 (4)2.3 AT24C02引脚图及其引脚功能 (6)2. 4 AT24C02 掉电存储单元的设计 (6)2.5 里程计算、计价单元的设计 (7)2.6 数据显示单元设计 (8)第3章系统软件设计 (10)3. 1 系统主程序设计 (10)3. 2 定时中断程序设计 (12)3. 3 里程计数中断服务程序设计 (12)3.4 中途等待中断服务程序设计 (12)3. 5 键盘服务程序设计 (12)3. 6 显示子程序服务程序设计 (12)第4章系统调试与测试结果分析 (13)4. 1 使用的仪器仪表 (13)4.2 系统调试 (13)第1章引言本次课程设计利用单片机技术来实现一台多功能出租车计价器,具有性能可靠、电路简单、成本低等特点。
1.1 出租车计价器概述计价器显示的营运金额是营运里程与价格的函数(等候时间一般折算成一定比例的里程来计算)。
出租车计价器通过传感器与行驶车辆连接。
出租汽车的实际里程通过传感器的脉冲信号在计价器里折算成一定的计价营运里程。
目前市场上出租车计价器功能主要有具有数据的复位功能、白天/晚上转换功能、数据输出功能、计时计价功能等等,但能够进行语音播报数据信息的出租车计价器还是比较少见的,针对这一点我们来设计一款多功能出租车计价器,在原有功能的基础上增加单价输出、单价调整、路程输出、显示当前的系统时间、语音播报数据信息等功能。
1.2 本设计任务1.2.1 设计任务设计一款基于AT89S51单片机的出租车计价器。
1.2.2 设计要求1.基本要求(1)不同情况具有不同的收费标准。
● 白天● 晚上● 途中等待(>10min 开始收费)(2)能进行手动修改单价。
智能电子产品设计与制作课程设计(论文)题目: 《出租车计价器系统设计》学院:电气与电子信息工程学院专业名称:学号:学生姓名:同组成员:指导教师:课设时间:2011年5月23日—2011年6月10日目录一.设计目的 (2)二.设计要求 (2)三.系统结构 (2)四.功能模块设计 (3)五.软件设计 (5)六.电路组装与调试 (6)七.电路仿真 (7)八.总结 (8)八.附录 (9)出租车计价器课程设计一、设计目的随着出租车行业的发展,出租车已经是城市交通的重要组成部分,从加强行业管理以及减少司机与乘客的纠纷出发,具有良好性能的计价器对出租车司机和乘客来说都是很必要的。
而采用模拟电路和数字电路设计的计价器整体电路的规模较大,用到的器件多,造成故障率高,难调试。
而采用单片机进行的设计,相对来说功能强大,用较少的硬件和适当的软件相互配合可以很容易地实现设计要求,且灵活性强,可以通过软件编程来完成更多的附加功能。
本设计采用AT89S52单片机为主控器,以红外对管测转速,对实际里程的模拟,实现对出租车的多功能的计价设计,并采用AT24C01实现在系统掉电的时候保存单价等信息,输出采用8段数码显示管。
本电路设计的计价器不但能实现基本的计价,而且还能根据白天,黑夜和中途等待来调节单价。
二、设计要求出租车计价器根据乘客乘坐汽车行驶距离和等候时间的多少进行计价,并在行程中同步显示车费值。
从起步价开始,当汽车程行驶未满3公里时,均按起步价计算。
过3公里后,实现每1公里单价收费,中间遇暂停时,计程数不再增加,开始计时收费,测距收费和测时收费的和便构成了一位乘客的车费。
同时,白天和夜晚价格不同,可以进行切换。
白天单价、夜晚单价、等待单价和起步价格都可通过独立键盘进行调节。
(默认起步价为5元/3公里,里程单价白天为1.5元/公里,夜晚为1.8元/公里,等待计时单价为0.5元/5分钟)三、系统结构根据设计的要求选择实验的方案:采用单片机进行的设计,相对来说功能强大,用较少的硬件和适当的软件相互配合可以很容易地实现设计要求,且灵活性强,可以通过软件编程来完成更多的附加功能。
设计采用AT89S51单片机为主控器,以红外对管和电机测转速(按键替代),实现对出租车的基本的计价设计,并采用AT24C02实现在系统掉电的时候保存单价等信息,输出采用8段数码显示管,相对液晶显示价格便宜,利用单片机丰富的I/O端口,及其控制的灵活性,实现基本的计价功能。
器系统结构图如下:四、功能模块1、单片机模块Flash 存储器。
使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89S52具有以下标准功能: 8k字节Flash,256字节RAM, 32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,AT89S52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
2、模拟里程原理图测转速原理图红外对管测转速的电路图采用外部中断进行计数,红外对接管每受到一次发射管发来的红外,就产生一次中断,计数器加1,计数超过1000次时,里程加1,计数清零,从新开始计数.3、掉电保护模块AT24C02存储单元AT24C02是一个2K位串行CMOS E2PROM,内部含有256个8位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗。
AT24C02有一个16字节页写缓冲器。
该器件通过IIC总线接口进行操作,有一个专门的写保护功能。
功能简介AT24C02支持IC,总线数据传送协议IC,总线协议规定任何将数据传送到总线的器件作为发送器。
任何从总线接收数据的器件为接收器。
数据传送是由产生串行时钟和所有起始停止信号的主器件控制的。
主器件和从器件都可以作为发送器或接收器,但由主器件控制传送数据(发送或接收)的模式,通过器件地址输入端A0、A1和A2可以实现将最多8个AT24C02器件连接到总线上。
只有一片时,A0\A1\A2要接地。
工作参数工作温度工业级-55℃ +125℃ 商业级0 ℃+75℃贮存温度-65℃ +150℃ 各管脚承受电压-2.0 Vcc+2.0VVcc管脚承受电压-2.0 +7.0V 封装功率损耗(Ta=25℃) 1.0W焊接温度(10 秒) 300℃ 输出短路电流100mA芯片图封装图和引脚功能存储单元电路原理图4、键盘调整单元当单价等信息需要进行修改时,就要用到键盘进行修改。
由于调节信息不多,故采用4个独立键盘即可,分别实现清零、切换、增大、减小和功能等作用。
S1:接P1.0口,对上一次的计费进行清零,为下次载客准备S2:接P1.1口,实现白天和夜晚单价的切换;当功能键S4按下时,S2可对数据进行增大。
S3:接P1.2口,当功能键S4按下时,S3可对数据进行减小。
S4:接P1.3口,按1次,进入调整白天单价;按2次,进入调整夜晚单价;按3次,进入调整等待单价;按4次,进入调整起步价;按5次,返回。
5、显示单元显示单元由7个8段共阳数码管组成,采用动态扫描进行显示。
前三个数码管分别接P3.0、P3.1和P3.2,用于显示总金额;中间两个分别接P3.4和P3.5,用于显示里程;后边两个分别接P3.6和P3.7,用于显示单价。
数码管显示图五、软件设计(1)系统主程序在主程序模块中,需要完成对各参量和接口的初始化、出租车起价和单价的初始化以及中断、计算、循环等工作。
另外,在主程序模块中还需要设置启动/清除标志寄存器、里程寄存器和价格寄存器,并对它们进行初始化。
然后,主程序将根据各标志寄存器的内容,分别完成启动、清除、计程和计价等不同的操作。
当电机运行起来时,就启动计价,根据里程寄存器中的内容计算和判断行驶里程是否已超过起步价公里数。
若已超过,则根据里程值、每公里的单价数和起步价数来计算出当前的总金额,并将结果存于总金额寄存器中;中途等待时,无脉冲输入,不产生中断,当时间超过等待设定值时,开始进行计时,并把等待价格加到总金额里,然后将总金额、里程和单价送数码管显示出来。
程序流程如图(2)里程计数中断程序每当红外接收端输出一个低电平信号就使单片机中断一次,当里程计数器对里程脉冲计满1000次时,进入里程计数中断服务程序中,里程变量加一。
主函数中总金额也相应地变化。
(3)中途等待中断程序在中途等待中断程序中,每1ms产生一次中断,将当前里程值送入某个缓存变量,每5分钟将缓存变量中的值和当前里程值比较,当汽车停止,霍尔传感器5分钟没有输出信号,当前里程值和缓存变量内的值相同,则进入等待计时,每5分钟记一次价格。
(4)计算程序计算程序根据里程数分别进入不同的计算公式。
如果里程大于3公里,则执行公式:总金额=起步价+(里程-3)*单价+等待时间*等待单价;否则,执行公式:总金额=起步价+等待时间*等待单价。
(5)显示程序显示程序利用定时器每1ms产生一次中断,相应变量置位,点亮一个数码管,显示一位数据,利用主函数内的循环,实现动态扫描显示,同时根据数码管余辉和人眼暂留现象,即可实现显示。
(6)键盘程序键盘采用查询的方式,放在主程序中,当没有按键按下的时候,单片机循环主程序,一旦右按键按下,便转向相应的子程序处理,处理结束再返回。
流程图如图键盘程序流程图六、电路的组装与调试先按照电路图从小而且低的元器件开始安装,然后焊接然后依次焊接其他由小到大,由低到高的元器件,直到全部安装完毕再次进行电路检测和调试调试时按照以下步骤进行调试:1、调试动态显示电路。
查看数码管是否显示正常。
2、调试AT24C02存储单元。
尝试写入读出指定数据看是否符合要求。
3、调试键盘控制电路。
结合程序调试按键抖动,查看是否符合程序要求。
4、整体调试。
结合实际效果对程序进行优化七、电路的仿真八、总结这次课程设计给我最大的启迪就是,一定要对知识点熟悉并且十分熟练才有可能完全正确的做出自己的产品。
协同工作很重要,一个人不可能很好的完成完整的项目。
对于这次出租车计价器的,使我更加清晰的掌握单片机的各种功能,特别是外部中断的应用,还有就是单片机对I/O口对数码管的控制功能,通过对数码管的动态扫描和键盘的防抖的综合编程,能过很好的实现数据的动态显示。
在实际的操作过程中还是遇到和很多问题,主要体现在对单片机外部中断的的应用理解的不够深刻,以及在程序调用方面的欠缺,而导致功能不能完全实现;还有是关于默写硬件应用不够了解,而在编程中出现了很大麻烦。
通过最终的调试和苦想,以及同学的帮助下,还是解决了问题。
通过这次课程设计,我最大的收获就是自己的动手能力和独立解决问题的能力得到了很大的提高,也充分体会到了自己设计东西的乐趣、学会查阅资料和对别人的东西融会变通的重要性,也明白了很多知识光靠趴在书本上学是学不到其中的精髓的,必须亲自去试着实践,亲自去经历才能对它们真正的掌握,凡事都要自己去动下手,去实践一下,遇到困难,永远不要沮丧气馁。
在动手的过程中,不仅能增强实践能力,而且在理论上可以有更深的认识;这次设计给了我极大的鼓舞和信心,相信在以后的学习中可以通过不断的摸索和实践来提高其他方面的知识。
九、附录附录1附录2:原理图附录三PCB和源程序实物图附件3实物图 模拟计程车起步:实物图: 单价 里程 金额模拟行驶3km 内: 模拟行驶4km 后附件 五 系统源程序Include<reg52.h> #include<instrins.h>#define uchar unsigned char #define uint unsigned int#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();_nop_();};uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; sbit exter=P3^3; //外部中断 sbit key0=P1^0; //清零sbit key1=P1^1; //切换/+sbit key2=P1^2; //-sbit key3=P1^3; //功能键sbit P3_0=P3^0; //数码管各位控制sbit P3_1=P3^1;sbit P3_2=P3^2;sbit P3_4=P3^4;sbit P3_5=P3^5;sbit P3_6=P3^6;sbit P3_7=P3^7;sbit SDA=P2^3; //IIC引脚sbit SCL=P2^2;uint inter,aa,bb,temp,temp1; //变量的定义uint zongjine,licheng,dengdai;uint key3num,qiehuantemp,delaytemp;uchar danjia1,danjia2,danjia3,danjia,qibu;void delay(unsigned char t){unsigned char j,i;for(i=0;i<t;i++)for(j=0;j<255;j++);}void start() //IIC开始位{SDA = 1;SCL = 1;delayNOP();SDA = 0;delayNOP();SCL = 0;}void stop() // IIC停止位{SDA = 0;delayNOP();SCL = 1;delayNOP();SDA = 1;}void respons() //IIC应答位{uchar i;SCL=1;delayNOP();while((SDA==1)&&(i<250))i++;SCL=0;delayNOP();}uchar read_byte() // 从EEPROM读到MCU {uchar i,j;for(i=0;i<8;i++){SCL=1;j<<=1;j|=SDA;SCL=0;}return(j);}void write_byte(uchar date) // 从MCU写到EEPROM{uchar i,temp;temp=date;for(i=0;i<8;i++){temp=temp<<1;SCL=0;delayNOP();SDA=CY;delayNOP();SCL=1;delayNOP();}SCL=0;delayNOP();SDA=1;delayNOP();}void write_data(uchar addr, uchar date) // 在指定地址addr处写入数据date {start();write_byte(0xa0);respons();write_byte(addr);respons();write_byte(date);respons();stop();}uchar read_data(uchar addr) // 在指定地址addr读取数据{uchar date;start();write_byte(0xa0);respons();write_byte(addr);respons();start();write_byte(0xa1);respons();date=read_byte();stop();return date;}void display(uint zongjine0,uint licheng0,uint danjia0){uchar z;uint jbai,jshi,jge,lshi,lge,dshi,dge;jbai=zongjine0/100;jshi=zongjine0%100/10;jge=zongjine0%100%10;lshi=licheng0/10;lge=licheng0%10;dshi=danjia0/10;dge=danjia0%10;for(z=0;z<7;z++){P3=0xff;switch(z){case 0:P3_0=0;P0=table[jbai];break;case 1:P3_1=0;P0=table[jshi]&0x7f;break;case 2:P3_2=0;P0=table[jge];break;case 3:P3_4=0;P0=table[lshi];break;case 4:P3_5=0;P0=table[lge];break;case 5:P3_6=0;P0=table[dshi]&0x7f;break;case 6:P3_7=0;P0=table[dge];break;}delay(3);}}void keyscan() //键盘扫描{if(key3==0) //功能键调节{delay(5);if(key3==0){key3num=1;while(!key3);delay(5);while(!key3);while(key3num){if(key3num==1) //调白天单价{if(key1==0){delay(5);if(key1==0){danjia1++;if(danjia1==100)danjia1=0;while(!key1);delay(5);while(!key1);}}if(key2==0){delay(5);if(key2==0){danjia1--;if(danjia1==-1)danjia1=99;while(!key2);delay(5);while(!key2);}}display(1,0,danjia1);}if(key3num==2) //调夜晚单价{write_data(1,danjia1);if(key1==0){delay(5);if(key1==0){danjia2++;if(danjia2==100)danjia2=0;while(!key1);delay(5);while(!key1);}}if(key2==0){delay(5);if(key2==0){danjia2--;if(danjia2==-1)danjia2=99;while(!key2);delay(5);while(!key2);}}display(2,0,danjia2);}if(key3num==3) //调等待单价{write_data(2,danjia2);if(key1==0){delay(5);if(key1==0){danjia3++;if(danjia3==100)danjia3=0;while(!key1);delay(5);while(!key1);}}if(key2==0){delay(5);if(key2==0){danjia3--;if(danjia3==-1)danjia3=99;while(!key2);delay(5);while(!key2);}}display(3,0,danjia3);}if(key3num==4) //调起步价{write_data(3,danjia3);if(key1==0){delay(5);if(key1==0){qibu++;if(qibu==100)qibu=0;while(!key1);delay(5);while(!key1);}}if(key2==0){delay(5);if(key2==0){qibu--;if(qibu==-1)qibu=99;while(!key2);delay(5);while(!key2);}}display(4,0,qibu);}if(key3num==5) //退出功能键{write_data(4,qibu);key3num=0;}if(key3==0){delay(5);if(key3==0){key3num++;while(!key3);delay(5);while(!key3);}}}}}}void init(){SDA=1;SCL=1;zongjine=0;licheng=0;dengdai=0;danjia1=read_data(1);danjia2=read_data(2);danjia3=read_data(3);qibu=read_data(4);aa=0; //数码管动态扫描的定时器时基个数bb=0; //判断是否等待的时基个数inter=0;EA=1; //开总中断EX1=1; //开外部中断1IT1=1; //触发方式下降沿TMOD=0x01;TH0=(65536-1000)/256;TL0=(65536-1000)%256;ET0=1; //开定时器T0中断TR0=1; //开定时器T0P3=0x08;P0=table[0];}void jisuan(){if(licheng>3)zongjine=qibu+(licheng-3)*danjia+dengdai*danjia3; //金额计算elsezongjine=qibu+dengdai*danjia3; //起步公里内金额计算}void qiehuan(){if(key1==0) //白天夜晚切换{delay(5); //键盘防抖if(key1==0)qiehuantemp=!qiehuantemp;while(!key1);delay(5);while(!key1);}if(qiehuantemp==0)danjia=danjia2;if(qiehuantemp==1)danjia=danjia1;}void main(){init();qiehuantemp=1;key3num=0;while(1){qiehuan(); //切换白天夜晚单价jisuan(); //计算总金额display(zongjine,licheng,danjia);keyscan();if(key0==0) //清零键init();}}void inter1() interrupt 2 //脉冲中断{delay(5); //if(exter==0) //{ //IT1=1;inter++;if(inter==5){inter=0;licheng++;}} //while(!exter); //delay(5); //while(!exter); //}void timer0() interrupt 1{TH0=(65536-1000)/256;TL0=(65536-1000)%256;aa++;bb++;temp1=licheng; //测试是否进入等待if(bb==10000) //10s无反应进入等待计费{bb=0;if(temp=temp&temp1)dengdai++;temp=licheng;}}。