的士计价器java代码,出租车计价器代码表示

出租车计价器

一、题目:A题 设计并制作一个用于出租车的计费系统。

成都创新互联公司是一家专业提供广平企业网站建设,专注与网站设计、做网站、H5高端网站建设、小程序制作等业务。10年已为广平众多企业、政府机构等服务。创新互联专业网站制作公司优惠进行中。

二、设计要求

1、基本要求:

(1)制作一个模拟车轮用直流电动机(或步进电机)驱动,现场模拟以下运行情况的收费情况:

u 假设车轮的周长为一米。

u 起步价为三公里五元,白天每公里三元,晚上每公里四元。

u 运行五公里之后,停三分钟,再运行五公里之后乘客下车,由于演示的时间的需要,途中停车超过一分钟开始收费,超过的时间每分钟一元。

(2)能够手动修改单价。

(3)具有数据的复位功能。

(5)数据输出

u 单价输出 至少2位

u 路程输出 至少2位

u 总金额输出 至少3位

2、发挥部分:

(1)能够在掉电的情况下存储单价等数据。

(2)能够显示、调节当前的系统时间,并根据当前的系统时间进行计费(6时至18时为白天,18时至第二天6时为晚上)。

(3)有语音报价功能。

1.2 方案比较与论证

1.2.1控制器模块

方案一:采用可编程逻辑器件CPLD 作为控制器。CPLD可以实现各种复杂的逻辑功能、规模大、密度高、体积小、稳定性高、IO资源丰富、易于进行功能扩展。采用并行的输入输出方式,提高了系统的处理速度,适合作为大规模控制系统的控制核心。但本系统不需要复杂的逻辑功能,对数据的处理速度的要求也不是非常高。且从使用及经济的角度考虑我们放弃了此方案。

方案二:采用凌阳公司的16位单片机,它是16位控制器,具有体积小、驱动能力高、集成度高、易扩展、可靠性高、功耗低、结构简单、中断处理能力强等特点。处理速度高,尤其适用于语音处理和识别等领域,采用此单片机能够很方便的实现发挥部分的语音报价功能,但此单片机较难买到,而且价格稍贵,故放弃了此方案。

方案三:采用Atmel公司的AT89S52单片机作为主控制器,此单片机是51内核的CMOS 8位单片机,片内含8k空间的可反复擦些1000次的Flash读写存储器,具有256 bytes的随机存取数据存储器(RAM),32个IO口,你知道厂房装修合同样板。2个16位可编程定时计数器。其价格低廉,非常适合用于小系统的开发,开采用ISP在线编程,程序的下载和修改也很方便。题目所要求的系统对控制器的要求不高,我们综合多方面考虑选用了此方案。

1.2.2车轮转速探测模块

方案一:用光敏电阻组成光敏探测器。光敏电阻的阻值可以跟随周围环境光线的变化而变化。当光线照射到车轮码盘的白色部分时,光线发射强烈,光线照射到车轮码盘的黑色部分时,光线发射较弱。因此光敏电阻在白色部分和黑色部分上方时,阻值会发生明显的变化。将阻值的变化值经过比较器就可以输出高低电平。此方案易受外界光线的干扰。

方案二:采用霍尔传感器最为探测器件,霍尔传感器的两部分分别安装在车轮和固定电路板上,根据车轮转动时将变化的磁场强度转换为脉冲电信号,此方案能够使对车轮计数精确,工作稳定,但成本较高。

方案三:采用红外对管,当红外发射管发射出的红外线照到码盘的白色部分和黑色部分时,其反射的红外线强度不同,通过红外接收管接收后经电压比较器LM311比较后即可输出高低电平。此方案成本低,容易实现,且灵敏度较高。

根据本系统的设计要求,对车轮转速的探测受外界的干扰较小,而采用采用红外对管工作电路简单,调试方便,所以我们选择此方案。

1.2.3时钟控制模块

方案一:采用32.768MHz的晶振产生震荡后经多个74LS161进行15次2分频,产生精确的秒信号,自行搭建时间电路。此方案具有较好的原创性,但电路搭建起来较为复杂,工作不够稳定,也不方便调节。

方案二:直接采用单片机内部的时钟信号。这样能够大大简化硬件的设计,但断电后不能工作,而且大量占用单片机有限的内存资源。

方案三:采用DS专用时钟芯片。DS是功能强大的实时时钟芯片,内置锂电池,内置晶振。提供二进制数和BCD码两种数据表示方式。可切换24小时制和12小时制时间表示。具有闹钟功能。可编程方波输出。提供114字节非易失存储空间,用于断电保存数据。

由于本系统的很多功能都是基于时间的基础上实现的,因此对时钟的要求较高,故我们选择方案三。

1.2.4显示模块

方案一:用数码管进行显示。数码管由于显示速度快,使用简单,显示效果简洁明了而得到了广泛应用,但显示的内容仅仅局限于数字,人机界面不够友好因此我们放弃了此方案。

方案二:用LCD液晶1602进行显示。LCD由于其显示清晰,显示内容丰富、清晰,显示信息量大,使用方便,显示快速而得到了广泛的应用。由于本此系统需要显示的内容较多,为达到较好的人机交互界面,我们选择了此方案。

1.3最终选择方案

u 采用AT89S52单片机作为主控制器。

u 采用红外对管+LM311作为车轮转速探测模块。

u 采用DS作为实时时钟控制芯片。

u 采用1602LCD液晶作为显示模块。

u 采用普通的直流电机和自制的车轮及码盘作为模拟车轮。

1.4系统结构图

按键:

红外感应模块

MCU

AT89S52

DS系统时间,断电保存数据

LCD液晶显示

模拟车轮

图1 系统结构框架

第二章:各部分电路原理与设计

2.1单片机主控模块的设计

Atmel公司的AT89S52是51内核的单片机。不用烧写器而只用串口或者并口就可以往单片机中下载程序。

我们所设计的单片机最小系统板采用的双龙公司的并口下载标准,且在板上留有下载线插座,这样可以非常方便的实现通过PC机的并口往单片机中下载程序。同时将稳压电源部分也附在其上,经过7805稳压后的+5V电源为除电机外的其他系统模块提供工作电源。

单片机控制模块的示意图如图9所示:

图2 单片机主控模块

单片机的I/O口分配如下:

P0,P2.5~P2.7 LCD模块

P1,P2.0~P2.3,P3.3 实时时钟模块

P3.0~P3.1,P3.5~P3.7 按键开关

P3.2 红外探测模块

2.2红外探测模块的设计

我们通过将红外接收二极管的不同压降与基准电压送入电压比较器LM311进行比较,输出对应的高低电平信号,送到单片机进行处理。其电路原理图如下:

图3 红外探测模块

在图3中,可调电阻RW可以调节比较器的门限电压,经示波器观察,输出波形相当规则,可以直接够单片机查询使用。

由于我们的码盘采用二分法进行设计,黑白两种颜色各占原周的一半,因此单片机每接收到一个高电平信号则模拟车轮转了一圈,通过计算每秒钟单片机接收到的高电平信号个数即可方便的计算出车轮的速度和所走的里程。

2.3模拟车轮的设计

小车的速度和里程的测量是通过光电对管检测码盘实现的。我们采用普通的直流电机和玩具车的车轮,自制码盘,做成模拟车轮,供测量用。

考虑到电机运行时对电压的干扰,电机的电源直接由输入的未经过稳压的电源提供,试用期解除劳动合同。并设立独立的开关,有人工控制,这样更符合实际的工作情况。

为防止光电管产生误动作,我们将光电码盘分为2份黑白相间的圆盘,每份各占圆周的一半,如图4:

图4 模拟车轮码盘

将其紧贴在车轮的内侧。在封装盒右侧打一个方孔,红外对管通过方孔对光电码盘进行检测就可以得到车轮转过的圈数。从而计算出小车前进的路程。

本系统假设车轮的周长为1米,假设单片机每秒检测到黑白信号的变化为n,共走了k秒则小车走过的路程为S=nk米。

2.4实时时钟控制模块的设计

我们采用的DS功能强大,内置锂电池,内置晶振,可以作为实时电子钟,为整个系统提供时钟,很好地解决了题目发挥部分“能够显示、调节当前的系统时间,并根据当前的系统时间进行计费(6时至18时为白天,18时至第二天6时为晚上)”的要求。同时利用其闹钟功能对探测信号进行采样,精确的计算出车速。由于芯片还提供114字节非易失存储空间,因此我们将题目要求的各种价格的设置方便的保存在里面,达到断电保存数据的功能。

图5 时钟模块电路图

2.5人机交互界面的设计

为使系统有更良好的人机交互界面,我们将LCD液晶显示模块,操作按键,系统复位开关和车轮控制开关集中于封装盒的面板上,方便用户操作,如下图:

图6 人机交互界面

2.6系统总体电路图

图7 系统总电路图

图8 系统装箱后的内部实物图

第三章:系统程序设计

3.1系统程序所实现的功能

u 实时显示总金额,总里程,车速,已走过时间,系统时间。

u 可在线修改系统时间。

u 可修改起步价及起步距离。

u 可修改每超过一公里加收费用。

u 可修改途中停车超过时间开始收费的时间及单价。

3.2程序任务分配

表1 程序任务分配

外部中断0(来自车轮)

外部中断1(来自时钟)

主函数

更新路程,加总价,复位计时器,如果显示屏使用权在INT0,就更新显示。

显示屏使用权用screen变量表示。

计算速度,计算行车时间,计时并在停车超时后加钱。根据显示屏使用权判断是否更新显示。

根据real_time变量的值决定是否把系统时间更新到屏幕上。

读取按键。决定控制逻辑。

3.3主程序流程图

开始

初始化LCD、实时时钟

从存储器读出单价等数据

显示logo

任意键

空闲状态,显示系统时间

有键按下

空闲状态

计费状态

设置键?

N

Y

设置

等待按键

是2键?

N

Y

初始化计费屏幕,进入计费状态

是3键

Y

查看系统时间,延时4秒

N

是4键?

Y

停止计费,进入空闲状态

N

按下2键复位

3.4各数据在中存储地址

表2 各数据在中存储地址

地址

变量

功能

0x0e

d

//起步价 d 公里 p 角

0x0f

p

0x10

day_price

//白天每公里价格,单位:角

0x11

night_price

//夜晚每公里价格,单位:角

0x12

x

//中途停车超过y分钟之后按x角每分钟计价

0x13

y

3.5中断服务0程序流程图

触发中断

路程加一米

允许使用显示屏?

计时器复位

路程==起步路程?

路程起步路程?

Y

N

Y

更新路程显示

向总金额加上公里价

N

更新总金额显示

Y

N

Y

公里计程器复位

中断2服务程序的timer_state和timer_count变量

counter_1000变量

公里计程器加1

公里计程器==1000?

结束

N

Y

向总金额加上公里价

允许使用显示屏?

更新总金额显示

Y

N

公里计程器复位

0号中断服务程序:

车轮转动一圈触发一次

3.6 中断服务2程序流程图

触发中断

系统在计费状态?

Y

N

需要同步时间?

Y

N

结束

速度=现在的路程—一秒之前的路程

行车时间加一秒

计时器加一秒

计时等于最大停车时间?

N

总金额加每分钟价

进入停车超时状态

Y

停车超时状态?

Y

每分钟加钱

N

将系统时间和日期同步到屏幕上

2号中断服务程序:

每秒钟触发一次

第四章:系统调试结果与分析

4.1调试方法与仪器

表3 测试仪器设备清单

仪器名称

型号

用途

数量

PC机

联想

调试及下载程序

1

数字万用表

UNI-T10A

测量各电路工作情况

1

秒表

记录时间

1

直流稳压电源

ALKIMIA

提供电源

1

4.2调试步骤与测试数据

4.2.1系统时间与秒表实际时间测量

开机后按“开始”键进入计时工作状态,同时启动秒表进行及时对比,分别对工作时间为1分钟,2分钟,3分钟,4分钟,5分钟进行测量比较,结果如表2

表4 系统时间测试比较

测试时间

系统显示时间

秒表测量时间

60s

60s

59.61s

120s

120s

121.02s

180s

180s

180.66s

240s

240s

238.58s

300s

300s

300.40s

4.2..2车轮转速测试

本系统的设计对探测信号的下降沿进行触发,因此当红外对管探测到的码盘从白色转为黑色时,单片机中断触发,计数器加一。

启动计费系统,同时手工转动车轮一周,显示屏上路程显示1m,在转动车轮几圈,LCD的显示数值均与实际相符。

4.2.3计费系统测试

表5 不同情况下的计费结果测试

计费时间段

行驶里程

行驶时间

中途停车时间

计费价格

白天

2781m

61s

5.0元

白天

9532m

198s

26.0元

晚上

9682m

202s

33.0元

晚上

9529m

385s

182s

36.0元

4.2.4数据设定及断电储存功能

在待机状态下按“设置”键,分别修改起步价4km内8元,白天每公里5元,晚上每公里7元,修改系统时间,然后保存,关机,断开电源,等待5分钟之后重新开机,发现数据为修改后的数据,即数据的设定及断电储存功能有效。

4.3测试结果分析

通过调试和系统测试,发现系统能很好地实现预期的目的,实现了除语音功能外的其他所有功能,工作性能稳定,计费精确。系统时间实时运行,准确,里程的显示误差在1m以内。很好的完成了赛题的要求。

第五章:系统性能总结及特点

5.1 实现基本要求功能

表4 基本功能的实现情况

基本要求功能

功能实现情况

基本要求第(1)项

实现

基本要求第(2)项

实现

基本要求第(3)项

实现

基本要求第(4)项

实现

基本要求第(5)项

实现

5.2 实现发挥部分功能

表5 发挥功能的实现情况

发挥要求功能

功能实现情况

发挥要求第(1)项

实现

发挥要求第(2)项

实现

发挥要求第(3)项

未实现

5.3 增加的其他功能

u 与计费系统相关的所有参数用户均可修改并储存。

u 兼有万年历和数字电子钟功能。

u 一体化人机交互界面控制面板,硬件系装箱,提高机械强度,安全性能和美观度。

第六章:附录

附录一 系统程序源代码

/******************************************************************************/

// 华南理工大学自动控制大赛高级组A题:出租车计费系统

// 参赛队:Dragonfly

// 成员:翁新钎

// 曾 泽

// 罗桂波

// 文件名称:main.c

// 文件功能:提供包括主函数、中断服务、LCD显示及按键操作等功能函数,

// 实现对红外探测到的信号进行处理、显示功能和系统设置。

// 建立时间:2008.4.28

// 更新时间:2008.5.10

// 文件版本:V1.5

/******************************************************************************/

#include"test_.c"

#define SYSTEM_STATE_IDLE 0

#define SYSTEM_STATE_RUN 1

#define INT0 1

#define INT1 2

#define MAIN 4

/***** 按键定义 *****/

sbit Key1=P3^5;

sbit Key2=P3^6;

sbit Key3=P3^7;

sbit Key4=P3^0;

sbit Key5=P3^1;

/*** 全局变量 ***/

char code *day[]={"Sun","Mon","Tue","Wen","Thu","Fri","Sat"}; //显示星期几对应的字符串

int distance=0,min_distance=3000;

char min_price=50; //3000m,50角

char price=30; //角/km

int sum=0; //分

char speed; //(m/s)

int counter_1000=0;

int last_distance=0;

char max_stop_time=1; //minute

char price_per_minute=10; //角

char hh,mm,ss; //time

bit timer_state=0; //Free

int timer_count=0;

char system_state=SYSTEM_STATE_IDLE; //系统状态

char screen=MAIN; //把LCD显示屏的使用权分配给MAIN

bit real_time=0; //控制外部中断2是否要把系统时间和日期

//更新到LCD屏幕上

/* 函数声明 */

char getkey(); //等待一个按键按下,返回键码

void logo(); //开机logo

void init_prices(); //从的数据存储区读出数据

void update_distance(); //计价过程中负责更新屏幕上显示的路程

void LCD_write_int(int i); //向LCD写一个整数

void update_time(); //计价过程中负责更新屏幕上显示的行车时间

void update_speed(); //计价过程中负责更新屏幕上显示的速度

void update_sum(); //计价过程中负责更新屏幕上显示的总金额

void set(); //设置

void display_time(); //显示系统时间 hh:mm:ss

void display_date(); //显示日期 20xx-xx-xx

void idle_state_screen_init(); //进入空闲状态屏幕初始化

void run_screen_init(); //进入计费状态屏幕初始化

void set_time(); //设置系统时间

void set_start_price(); //设置起步价

void set_price(); //设置行车价格

void set_wait_price(); //设置中途停车的价钱

附录二 系统说明书

一、 人机交互界面

图9 人机交互界面

LCD显示屏

2 4

1 3 5

二、按键功能

2:开始计费,停止计费后用来复位。

4:停止计费。

1:进入设置界面。

3:设置过程中用来切换设置项,计费过程中查看系统时间和日期。

5:改变数字大小。

三、系统描述:

1、开机首先显示LOGO,如图10。按任意键继续。

图10 开机Logo

2、系统空闲,显示时间、日期和星期几。

图11 空闲时显示电子钟

3、按2键开始计费。或者按1键进入设置。

4、计费:界面显示总金额,路程,速度,行车时间。

图12 开始计费界面

按3查看系统时间,4秒钟后自动返回计费界面。

按1进入设置界面。

四、系统设置:

无论系统工作状态,按下1键进入设置界面。设置界面有4个。

a. 设置系统时间和日期。(SET-T)用3键移动闪烁的光标到要进行设置的位,按5键改变数值大小。按1转入下一个设置界面。

图13设置系统时间和日期

b. 设置起步价。(SET START PRICE)操作同a。

图14设置起步价

c. 设置价格。(SET PRICE)包括白天的价格和夜晚的价格。操作同a。

图15设置价格

java写出租车计费

//如果s(10,20]超出10 的部分,每公里收2元

tot=(s-10)*2; // 假设公里数刚才是整数。。。。。。。。。

别的,照样 。。。。。

java超市计价系统代码

package entity;

public class Market {

private int id;//id

private int num;//数量

private String goods;//商品

private double price;//价格

public Market(int id, int num, String goods, double price) {

super();

this.id = id;

this.num = num;

this.goods = goods;

this.price = price;

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public int getNum() {

return num;

}

public void setNum(int num) {

this.num = num;

}

public String getGoods() {

return goods;

}

public void setGoods(String goods) {

this.goods = goods;

}

public double getPrice() {

return price;

}

public void setPrice(double price) {

this.price = price;

}

public double calc( ){

double sum=price*num;

System.out.println("您消费共计:"+sum+"¥");

return sum;

}

}

package test;

import java.util.HashMap;

import java.util.Map;

import java.util.Scanner;

import entity.Market;

public class Test {

private static MapInteger,Market goods=new HashMapInteger, Market();

public static void main(String[] args) {

System.out.println("-------超市计价系统-------");

String goods1="可口可乐";

String goods2="爆米花";

String goods3="益达";

printTable("编号","商品","价格");

printTable("1",goods1,"3.0¥");

printTable("2",goods2,"5.0¥");

printTable("3",goods3,"10.0¥");

goods.put(1, new Market(1, 1, goods1, 3.0));

goods.put(2, new Market(2, 1,  goods2, 5.0));

goods.put(3, new Market(3, 1, goods3, 10.0));

Scanner input = new Scanner(System.in);

System.out.println("请输入商品的编号:");

int num = input.nextInt();

System.out.println("请输入商品的数量");

int amount = input.nextInt();

Market market = goods.get(num);

market.setNum(amount);

market.calc();

}

private static void printTable(String row1,String row2,String row3 ) {

System.out.print(row1);

int times=12;

if (row2!="商品") {

times=5;

}

for (int i = 0; i  times; i++) {

System.out.print(" ");

}

System.out.print(row2);

for (int i = 0; i  10; i++) {

System.out.print(" ");

}

System.out.print(row3);

System.out.println("\n");

}

}

//测试结果:

-------超市计价系统-------

编号            商品          价格

1     可口可乐          3.0¥

2     爆米花          5.0¥

3     益达          10.0¥

请输入商品的编号:

3

请输入商品的数量

5

您消费共计:50.0¥

用java编程:某市不同车牌的出租车3公里的起步价和计费分别为:夏利7元,3公里以外,2

public static void main(String[] args){

System.out.println("输入两个整数:");

Scanner sc = new Scanner(System.in);

String n = sc.next();

double m = sc.nextDouble();

System.out.println(payFor(n,m));

}

public static double payFor(String name,double m){

double money=0;

if(name.equals("夏利")){

if(m3){

money=7;

}else{

money=7+(m-3)*2.1;

}

}else if(name.equals("富康")){

if(m3){

money=8;

}else{

money=8+(m-3)*2.4;

}

}else if(name.equals("桑塔纳")){

if(m3){

money=9;

}else{

money=9+(m-3)*2.7;

}

}

return money;

}


本文题目:的士计价器java代码,出租车计价器代码表示
网页链接:http://ybzwz.com/article/hopchd.html