c语言出租车计费
- 格式:doc
- 大小:13.00 KB
- 文档页数:1
目录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],通过软件编程就可以实现计费模式的切换。
LIBRARY IEEE;USE IEEE.std_logic_1164.all;USE IEEE.std_logic_unsigned.all;USE IEEE.std_logic_arith.all;ENTITY taxi isport( c lk_390 :in std_logic;start:in std_logic;stop:in std_logic;fin:in std_logic;cha3,cha2,cha1,cha0:out std_logic_vector(3 downto 0);km1,km0:out std_logic_vector(3 downto 0);min1,min0:out std_logic_vector(3 downto 0);dp:out std_logic);end taxi;architecture behav of taxi issignal f_13,f_15,f_1:std_logic;signal q_13:integer range 0 to 19;signal q_15:integer range 0 to 16;signal q_1:integer range 0 to 255;signal c3,c2,c1,c0:std_logic_vector(3 downto 0);signal k1,k0:std_logic_vector(3 downto 0);signal m1:std_logic_vector(3 downto 0);signal m0:std_logic_vector(3 downto 0);signal en1,en0,f:std_logic;beginfeipin:process(clk_390,start)beginif clk_390'event and clk_390='1'thenif start='0' then q_13<=0;q_15<=0;f_13<='0';f_15<='0';f_1<='0';f<='0';elseif q_13=19 then q_13<=0;f_13<='1';else q_13<= q_13+1;f_13<='0';end if;if q_15=16 then q_15<=0;f_15<='1';else q_15<=q_15+1;f_15<='0';end if;if q_1=255 then q_1<=0;f_1<='1';else q_1<=q_1+1;f_1<='0';end if;if en1='1' then f<=f_15;elsif en0='1' then f<=f_13;else f<='0';end if;end if;end if;end process;main:process(f_1)beginif f_1'event and f_1='1' thenif start='0' thenen1<='0';en0<='0';m1<="0000";m0<="0000";k1<="0000";k0<="0000";elsif stop='1' thenif m0="1001" then m0<="0000";if m1="0101" then m1<="0000";else m1<=m1+1;end if;else m0<=m0+1;end if;if m1&m0>"00000001" then en1<='1';en0<='0';else en1<='0';en0<='0';end if;elsif fin='1' thenif k0="1001" then k0<="0000";if k1="1001" then k1<="0000";else k1<=k1+1;end if;else k0<=k0+1;end if;if k1&k0>"00000010" then en0<='1';en1<='0';else en0<='0';en1<='0';end if;else en1<='0';en0<='0';end if;cha3<=c3;cha2<=c2;cha1<=c1;cha0<=c0;km1<=k1;km0<=k0;min1<=m1;min0<=m0;end if;end process main;jifei:process(f,start)beginif start='0' then c3<="0000";c2<="0000";c1<="0101";c0<="0000";elsif f'event and f='1' thenif c0="1001" then c0<="0000";if c1="1001" then c1<="0000";if c2="1001" then c2<="0000";if c3="1001" then c3<="0000";else c3<=c3+1;end if;else c2<=c2+1;end if;else c1<=c1+1;end if;else c0<=c0+1;end if;end if;end process jifei;end behav;LIBRARY IEEE;USE IEEE.std_logic_1164.all;USE IEEE.std_logic_unsigned.all;USE IEEE.std_logic_arith.all;ENTITY taxi isport( c lk_390 :in std_logic;clk_1 :in std_logic;start:in std_logic;stop:in std_logic;fin:in std_logic;cha3,cha2,cha1,cha0:out std_logic_vector(3 downto 0);km1,km0:out std_logic_vector(3 downto 0);min1,min0:out std_logic_vector(3 downto 0);dp:out std_logic);end taxi;architecture behav of taxi issignal f_13,f_15,f_1:std_logic;signal q_13:integer range 0 to 19;signal q_15:integer range 0 to 16;signal q_1:integer range 0 to 255;signal c3,c2,c1,c0:std_logic_vector(3 downto 0);signal k1,k0:std_logic_vector(3 downto 0);signal m1:std_logic_vector(3 downto 0);signal m0:std_logic_vector(3 downto 0);signal en1,en0,f:std_logic;beginfeipin:process(clk_390,start)beginif clk_390'event and clk_390='1'thenif start='0' then q_13<=0;q_15<=0;f_13<='0';f_15<='0';f_1<='0';f<='0';elseif q_13=19 then q_13<=0;f_13<='1';else q_13<= q_13+1;f_13<='0';end if;if q_15=16 then q_15<=0;f_15<='1';else q_15<=q_15+1;f_15<='0';end if;if q_1=255 then q_1<=0;f_1<='1';else q_1<=q_1+1;f_1<='0';end if;if en1='1' then f<=f_15;elsif en0='1' then f<=f_13;else f<='0';end if;end if;end if;end process;main:process(clk_1)beginif clk_1'event and clk_1='1' thenif start='0' thenen1<='0';en0<='0';m1<="0000";m0<="0000";k1<="0000";k0<="0000";elsif stop='1' thenif m0="1001" then m0<="0000";if m1="0101" then m1<="0000";else m1<=m1+1;end if;else m0<=m0+1;end if;if m1&m0>"00000001" then en1<='1';en0<='0';else en1<='0';en0<='0';end if;elsif fin='1' thenif k0="1001" then k0<="0000";if k1="1001" then k1<="0000";else k1<=k1+1;end if;else k0<=k0+1;end if;if k1&k0>"00000010" then en0<='1';en1<='0';else en0<='0';en1<='0';end if;else en1<='0';en0<='0';end if;cha3<=c3;cha2<=c2;cha1<=c1;cha0<=c0;km1<=k1;km0<=k0;min1<=m1;min0<=m0;end if;end process main;jifei:process(f,start)beginif start='0' then c3<="0000";c2<="0000";c1<="0101";c0<="0000";elsif f'event and f='1' thenif c0="1001" then c0<="0000";if c1="1001" then c1<="0000";if c2="1001" then c2<="0000";if c3="1001" then c3<="0000";else c3<=c3+1;end if;else c2<=c2+1;end if;else c1<=c1+1;end if;else c0<=c0+1;end if;end if;end process jifei;end behav;。
c语言出租车计费c语言出租车计费已知某城市普通出租车收费标准为:起步里程为3公里,起步费为8元,10公里以内超过起步里程的部分,每公里加收2元,超过10公里以上的部分加收50%的回空补贴费,即每公里3元。
出租车营运过程中,因堵车和乘客要求临时停车等客的,按每5分钟加收2元计算,不足5分钟的不计费。
从键盘任意输入行驶里程(精确到0.1公里)和等待时间(精确到分钟),请编程计算并输出乘客应支付的车费,对结果进行四舍五入,精确到元。
输入提示信息:"Input distance and time:"输入格式:用逗号分隔的两个数字,第一个表示距离、第二个表示时间:"%f,%d"输出格式:"fee = %.0f\n" (注意:等号的两边各有一个空格)#includeint main(void){int start_money = 8, less_than_10_km_per_money = 2, beyond_10_km_extra_money = 1, wait_5_min_money = 2,real_wait_time;float start_distense = 3, real_distense ,real_money=0;printf("Input distance and time(eg.3.5,15):");scanf("%f,%d",ℜ_distense,ℜ_wait_time);real_money = start_money;real_money += real_distense > start_distense ? (real_distense - start_distense) * less_than_10_km_per_money : 0 ;real_money += real_distense > 10 ? (real_distense - 10) * beyond_10_km_extra_money : 0 ;real_money += real_wait_time / 5 > 0 ? real_wait_time / 5 *wait_5_min_money : 0 ;real_money = (int)(real_money + 0.5);printf("fee = %.0f\n",real_money);return 0;}。
分类号编号毕业设计题目:基于单片机的出租车计价器的设计——电子设计系别信息工程学院专业电子信息工程姓名学号2010年6月1 日学院毕业设计任务书设计题目:基于单片机的出租车计价器的设计——硬件部分专业:电子信息工程班级学号:姓名:指导教师:设计期限:2011年3月1日开始2011年6月1日结束院、系:北京信息工程学院2011年3 月1 日一、设计目的通过毕业设计使学生了解和掌握单片机应用技术;了解和掌握C语言的程序设计同硬件电路的结合;熟练运用proteus,keilC等软件的操作;了解和掌握单片机硬件电路的焊接和调试;了解和掌握掉电存储芯片AT24C02、霍尔传感器A44E、数码管、驱动芯片74LS245等外部接口芯片器件的应用。
二、主要设计内容实现出租车行驶里程和总金额的显示,预设起步价和起步公里数;实现清零、复位和掉电保护功能;实现对单价的调整。
三、重点研究问题(1)按下启动按键,显示起步里程与起步价。
(2)按模拟传感器信号的按键,显示行驶里程与总金额。
(3)按键控制清零、复位、掉电保护、调整预设单价。
(4)在软件中实现起步价,单价。
四、主要技术指标(1)数码管显示起步里程、单价,总里程、总金额。
(2)用按键控制清零、复位、掉电保护、调整预设单价。
五、设计成果要求(1)源程序通过编译、运行(2)软件烧录单片机硬件进行调试,运行(3)实现所述功能(4)电路板焊接、检测(5)最终提交软硬件、设计说明书、外文翻译、毕业设计说明书等六、其它参考文献:[1] 谭浩强.C程序设计(第二版).清华大学出版社.2003[2]潘永雄.新编单片机原理与应用.西安电子科技大学出版社.2003设计开题报告2011年3 月15日摘要现在各大中城市出租车行业都已普及自动计价器,所以计价器技术的发展已成定局。
而部分小城市尚未普及,但随着城市建设日益加快,象征着城市面貌的出租车行业也将加速发展,计价器的普及也是毫无疑问的,所以未来汽车计价器的市场还是十分有潜力的。
单片机系统课程设计报告完成日期:2010年12月28日系:电子信息工程系专业:通信工程班级:071班设计题目:出租车计价器学生姓名:谢明七王勉指导教师:董玉华、许爽目录一、设计任务和性能指标 (2)1.1设计任务 (2)1.2性能指标 (2)二、设计方案 (3)2.1任务分析 (3)2.2系统设计 (4)三系统硬件设计 (6)3.1电源电路 (6)3.2单片机的最小系统 (7)3.3 DS1302时钟电路 (8)3.4显示电路的设计 (9)3.5按键控制的设计 (10)3.7复位电路 (12)四、系统软件设计 (13)4.1主程序设计 (13)4.2 子程序设计 (14)4.2.1 DS1302子程序 (14)4.2.1 DS1302子程序流程图 (14)4.2.2 显示子程序 (16)4.2.2 显示子程序流程图 (18)4.3 修改时间子程序 (19)五、调试及性能分析 (20)5.1调试步骤 (20)5.1.1硬件调试 (20)5.1.2软件调试: (20)5.2性能分析 (20)六、心得体会 (22)七、参考文献 (23)八、附录 (24)附录1、程序清单 (24)附录2 系统硬件电路图 (34)一、设计任务和性能指标1.1设计任务出租车计价器是乘客与司机双方的交易准则,它是出租车行业发展的重要标志,是出租车中最重要的工具。
它关系着交易双方的利益。
具有良好性能的计价器无论是对广大出租车司机朋友还是乘客来说都是很必要的。
出租车计价器的主要功能是计价显示、时钟显示、根据白天、黑夜、途中等待来调节营运参数、计量数据查询等。
要求用Protel 画出系统的电路原理图(要求以最少组件,实现系统设计所要求的功能),印刷电路板(要求布局合理,线路清晰),绘出程序流程图,并给出程序清单(要求思路清晰,尽量简洁,主程序和子程序分开,使程序有较强的可读性)。
1.2性能指标1.不同情况具有不同收费标准:白天、晚上、途中等待(>10min开始收费);2.数据输出:单价输出、路程输出、总金额输出;3.按键:启动计时开关、数据显示切换、白天/晚上切换、复位;4.能手动进行修改单价,但单价设定需密码进入。
湖南工业大学课程设计资料袋电气与信息工程学院(系、部)2012~2013 学年第 2 学期课程名称单片机系统课程设计指导教师职称学生姓名甘显豪专业班级自动化1004 学号10401701305题目出租车计费系统成绩起止日期2012 年12月31日~2013 年1 月11 日目录清单湖南工业大学课程设计任务书电气与信息工程学院(系、部)自动化专业1004 班级课程名称:单片机系统课程设计设计题目:出租车计费系统完成期限:自2012 年12月31日至2013 年 1 月11 日共 2 周指导教师(签字):年月日系(教研室)主任(签字):年月日附件三(单片机应用系统)设计说明书(题目)出租车计费系统起止日期:2012 年12 月31 日至2013 年 1 月11日学生姓名甘显豪班级自动化1004学号10401701305成绩指导教师(签字)电气与信息工程学院2012年12 月31 日一、设计任务:1.1 外部脉冲自动计数,自动显示。
1.1.1设计一个255计数器:0-255计数,计满后自动清0,重新计数(在数码管中显示)。
1.1.2设计一个999999计数器:0-999999计数,计满后自动清0,重新计数(在数码管中显示)。
1.2 设计一个出租车计费系统:起步价为5元(2km以内),2km后,0.8元/0.5km;要求每500m 刷新计费一次,在8位数码管中,前3位显示数码管显示里程数,后3位数码管显示价钱(角,元,十元)二、设计原理及思路1.设计一个255计数器:0-255计数,计满后自动清0,重新计数(在数码管中显示)。
设计原理:这个用汇编和C语言都比较简单。
首先我确定用的是T0(TMOD=0x06)定时计数器,用查询计数模式,工作方式2(8位,可自动重新装初值),总中断不用开,赋初值255,来一个脉冲直接溢出,只要判断溢出标志位TF0是否为1即可,TF0为1则说明溢出,然后再用指令清0就OK了,然后给数码管显示加1(当然这里要先判断是否加到了255,若>255就显示清0)。
基于单片机的出租车计费(c语言)基于proteus仿真一.设计要求:1.用单片机AT89c51实现出租车计费器的设计。
2.出租车起步开始计程和计费,计程系统按实际公里数计程,计费系统首先显示起步价(如5.0),车行驶2km以内,只收起步价5元。
3.出租车行驶超过2km后,按每公里1.8元在5.0元的基础上增加。
4.出租车达到目的地后,(用一个按钮)计程和计费数据清零,为下一次计费开始。
5.出租车行驶仿真:把信号发生器的输出接到单片机外部中断上,设置信号发生器不同的频率输出,分别表示速度的快慢。
6.每一个脉冲表示轮胎转一圈,目前出租车轮胎周长为1.83米。
8.运行时间显示(时、分、秒),每一次起步时清零9.出租车行驶超过10km后(或超过20元路费),每公里加收50%的车费,即车费变为每公里2.7元。
10.行驶速度计算11.参数设置:可以修改轮胎周长,修改起步价,修改每公里单价等。
二.设计仿真proteus三.设计程序#include<reg51.h>unsignedchar d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//段选unsigned char f=0x00,y=0x00,k=0x00,m=0x00,z=0x00,q=0x00,w=0x00,s=0x00;//定义变量注意其范围(不然容易出现乱码)unsigned int x=0;#define uint unsigned int#define uchar unsigned charvoid delay(unsigned int i)//延时1ms{unsigned char j;while(i--){for(j=0;j<125;j++){;}}}void div2()//显示{ P2=0x80;P1=d[s/10];//计时小时P0=d[y/100];//计费百位delay(5);P2=0x40;P1=d[s%10];//小时个位P0=d[y%100/10];//计费十位delay(5);P2=0x20;P1=d[10];//显示“-”P0=d[y%10]&0x7f;//计费个位delay(5);P2=0x10;P1=d[f/10];//分钟P0=d[x*2/10000];//路程万位delay(5);P2=0x08;P1=d[f%10];P0=d[x*2%10000/1000];//路程千位delay(5);P2=0x04;P1=d[10];P0=d[x*2%1000/100];delay(5);P2=0x02;P1=d[w/10];//秒P0=d[x*2%100/10];delay(5);P2=0x01;P1=d[w%10];P0=d[x*2%10];delay(5);}void tt()//总费用函数{if(x*2<2000){y=5;}else if(x*2>2000){y=5+(x*2-2000)/1000*2;}else if(x*2>10000){y=21+(x*2-10000)/1000*3;}}void main()//开3个中断端{EX0=1;//开启外部中断源IT0=1;EX1=1;IT1=1;TH0=(65535-50000)/256;TL0=(65535-50000)%256;TMOD=0X01;ET0=1;TR0=1;//开启定时中断 EA=1;//开中断源while(1){div2();tt();}}void int1(void) interrupt 0 //信号中断服务程序{x++;}void int2() interrupt 2 //清零中断{w=0;f=0;s=0;x=0;y=0;EX0=0;ET0=0;}void int0() interrupt 1//计时中断服务程序{ ET0=0;TR0=0;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1;q++;if(q==20)//计数20恰好为1秒{q=0;w++;if(w==60)//秒到60{w=0;f++;if(f==60)//分到60{f=0;s++;if(s==12){s=0;}}}}ET0=1;}四.设计结果。
出租车计价器(单片机c语言)摘要本电路以AT89S51单片机为中心,附加A44E霍尔传感器测距(本电路中用模拟开关替代),实现对出租车计价,采用AT24C02 实现在系统掉电的时候保存单价,输出采用8段数码显示管,显示行驶总里程和总金额。
模拟出租车计价器设计:进行里程显示,预设起步价和起步公里数;行程按全程收费,有复位功能和启动功能,启动后,开始计价。
我们采用单片机进行设计,可以用较少的硬件和适当的软件相互配合来实现设计要求,且灵活性强,可以通过软件编程来完成更多的附加功能,应用前景广阔。
关键字:出租车计价器; AT89S51单片机; A44E霍尔传感器; 断电保存; 8段数码显示管.目录第 1章绪论 01.1 课题背景 01.2 主要设计内容及基本要求 0第2章系统硬件设计 (1)2.1硬件设计说明 (1)2.2 AT89S51单片机简介 (1)2.3 硬件电路设计 (2)2.4 硬件组成 (3)2.4.1 驱动电路 (3)2.4.2 显示电路 (4)2.4.3 复位电路 (5)2.4.4 掉电保护电路 (5)2.4.5 时钟电路 (6)2.4.6 按键电路 (6)第3章系统调试 (7)3.1 单片机仿真软件在线调试—PROTEUS (7)3.2 电路元件检测 (8)3.3 硬件检测 (8)附录1程序源代码 (12)附录2电路仿真图 (18)总结 (19)第 1章绪论1.1 课题背景我们知道,只要乘坐的出租车启动,随着行驶里程的增加,就会看到司机旁边的计价器里程数字显示的读数从零逐渐增大,而当行驶到某一值时(如2KM)计费数字显示开始从起步价(如4元)增加。
当乘客到站时,按下停止按键,计费数字显示总里程和总金额,它可以很直观的反映用户使用情况。
1.2 主要设计内容及基本要求利用AT89S51单片机,设计简单的出租车计价器。
在出租车计价器的总体设计中,我主要负责出租车计价器硬件设计。
其中主要的外围功能电路有:驱动电路,按键控制电路,掉电保护电路,时钟部分,数码管显示电路等。
/************************************************ 课程设计出租车计价器C51源程序,实现出租车计* 价器基本功能。
** 版权声明:* 未经本人允许不得应用于商业用途,可用* 于交流学习。
** Sunday, July 01 2012* **************************************************************/#include<reg52.h>#include<absacc.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define _NOP_(); {_nop_();_nop_();_nop_();_nop_();};#define OP_WRITE 0xa0 // 器件地址以及写入操作#define OP_READ 0xa1 // 器件地址以及读取操作#define key_set 0// = P3^3;#define key_down 1// = P3^4;#define key_up 2// = P3^5;#define key_ok 3//= P3^6;/** USR_DAT ,PRESET_DAT saved daytime: distance,price,night: distance,priceTIME : hour , min , sec*/uchar data USR_DAT[4] = {3,2,3,6};//uchar PRESET_DAT[4] = {3,2,3,3};uchar data ITEMS[3] = {0,0,0};//存放-里程,单价,费用uchar data TIME[3] = {0,0,12};//存放时间-秒,分,时uchar cycle_time; //100->考虑到5km/h,运转周期是1.44s-->0.02s计数72次uint stop_time,stop_time_all,mileometer,temp_s,speed;uchar cycle_time_info,lock = 1,lock_items = 1;//信号量;uchar key_pressed_time,key_num;//set按键按下次数uchar hour,min,sec,count;uchar code STR1[] = " Time:";//uchar code SPACE[] = " ";//uchar code STR2[] = "S: P: A: "; //里程,单价,应收取费用uchar code STR3[] = "Stop time: min";uchar code STR_SET[] = " Setting ";uchar code STR_SET_HOUR[] = " Setting hour ";uchar code STR_SET_MIN[] = " Setting min ";uchar code STR_SET_PRICE[] = " Setting price ";uchar code STR_SET_START[] = " Setting start ";uchar code DAY[] = " Day: ";uchar code NIGHT[] = " Night: ";uchar code STR_RST[] = "Reset? No < > Y ";sbit lcd_rs = P2^0;sbit lcd_rw = P2^1;sbit lcd_e = P2^2;sbit LED = P1^1;sbit SDA = P1^7;sbit SCL = P1^6;void delay(uchar z);void lcd_write_cmd(uchar cmd);void lcd_write_dat(uchar dat);void lcd_init();void lcd_display(uchar addr,uchar dat);void lcd_display_2(uchar addr,uchar dat);void lcd_display_3(uchar addr,uchar dat);void lcd_write_str(uchar addr,uchar *str);void time0_init();void time1_init();void display_time();void display_reset();void display_items();void display_set_time();void display_stop_time();void ex_int_init();void set_items();uchar key_scan();void key_set_dat();/*24c02相关*/void start();void stop();uchar shin();bit shout(uchar write_data);void write_byte( uchar addr, uchar write_data);uchar read_current();uchar read_addr(uchar addr);void save_user_dat();void restore_user_dat();void main(void){// uchar set_ok = 0;time0_init();time1_init();ex_int_init();lcd_init();restore_user_dat();while(1){// lcd_display_2(0x02,cycle_time_info);set_items();key_num = key_scan();if(!key_pressed_time){if(lock||(cycle_time >= 72)||(stop_time > 0))display_stop_time();elsedisplay_time();display_items();}else{key_set_dat();}}}/** 函数名:key_scan()* 函数作用:扫描按下的按键并返回相应的键值* */uchar key_scan(){P3 |= 0xfb;if((P3 & 0xfb) != 0xfb)delay(200);if((P3 & 0xfb) != 0xfb){switch (P3 & 0xfb){case 0xeb:return key_down;case 0xdb:return key_up;case 0xf9:return key_ok;default:return 0;}}}/** 函数名:uchar key_set_dat(uchar key_pressed_time) * 函数输入:set键按下的次数,以及键值* 函数输出://完成设置返回0,未完成返回1* 函数作用:根据set按键按下的次数,执行相应的设置: * 1.复位包括里程和费用* 2.时间设置:时,分* 3.参数设置:白天起步距离和单价* 4.参数设置:晚上起步距离和单价* */void key_set_dat(){switch(key_pressed_time){case 1:{ display_reset();if(key_num == key_up){ //2ITEMS[0] = 0;ITEMS[2] = 0;mileometer = 0;stop_time_all = 0;cycle_time = 0;key_pressed_time = 0;}if(key_num == key_down){ //1key_pressed_time ++;}if(key_num == key_ok){key_pressed_time = 0;}// key_num = 0;}break;case 2:{lcd_write_str(0x80,STR_SET_HOUR);lcd_display(0x40+0x06,' '-0x30);lcd_display(0x40+0x07,' '-0x30);display_set_time();//hourif(key_num == key_up)TIME[2] ++;if(key_num == key_down)TIME[2] --;if(key_num == key_ok){key_pressed_time = 0;}// key_num = 0;}break;case 3:{lcd_write_str(0x80,STR_SET_MIN);lcd_display(0x40+0x09,' '-0x30);lcd_display(0x40+0x0a,' '-0x30);display_set_time();if(key_num == key_up)//minTIME[1] ++;if(key_num == key_down)TIME[1] --;if(key_num == key_ok)key_pressed_time = 0;}break;case 4:{lcd_write_str(0x80,STR_SET_PRICE);lcd_write_str(0x80+0x40,DAY);lcd_display_2(0x40+0x08,USR_DAT[1]);// lcd_display(0x40+0x09,' '-0x30);// lcd_display(0x40+0x0a,' '-0x30);if(key_num == key_up)//minUSR_DAT[1] ++;if(key_num == key_down)USR_DAT[1] --;if(key_num == key_ok)key_pressed_time = 0;}break;case 5:{lcd_write_str(0x80,STR_SET_PRICE);lcd_write_str(0x80+0x40,NIGHT);lcd_display_2(0x40+0x08,USR_DAT[3]); // lcd_display(0x40+0x09,' '-0x30);// lcd_display(0x40+0x0a,' '-0x30);if(key_num == key_up)//minUSR_DAT[3] ++;if(key_num == key_down)USR_DAT[3] --;if(key_num == key_ok)key_pressed_time = 0;}break;case 6:{lcd_write_str(0x80,STR_SET_START);lcd_write_str(0x80+0x40,DAY);lcd_display_2(0x40+0x08,USR_DAT[0]); // lcd_display(0x40+0x09,' '-0x30);// lcd_display(0x40+0x0a,' '-0x30);if(key_num == key_up)//minUSR_DAT[0] ++;if(key_num == key_down)USR_DAT[0] --;if(key_num == key_ok)key_pressed_time = 0;}break;case 7:{lcd_write_str(0x80,STR_SET_START);lcd_write_str(0x80+0x40,NIGHT);lcd_display_2(0x40+0x08,USR_DAT[2]); // lcd_display(0x40+0x09,' '-0x30);// lcd_display(0x40+0x0a,' '-0x30);if(key_num == key_up)//minUSR_DAT[2] ++;if(key_num == key_down)USR_DAT[2] --;if(key_num == key_ok)key_pressed_time = 0;}break;default:key_pressed_time = 0;}// save_user_dat(); _-->会引起WARNING L15: MULTIPLE CALL TO SEGMENT}/** 函数名:set_items()* 函数作用:设置计算显示的里程,设置相应时间的单价,计算应收取费用* 即是设置ITEMS数组* */void set_items(){ITEMS[0] = (mileometer * 2)/1000;/* while(lock_items){temp_s = ITEMS[0];lock_items --;lcd_display(0x0d,lock_items);} */if(TIME[2] > 18 || TIME[2] < 6) //晚上六点后,早上六点前实行夜间收费标准{ITEMS[1] = USR_DAT[3];if(ITEMS[0] > USR_DAT[2]){/*if((ITEMS[0] - temp_s) != 0){ITEMS[2] += ITEMS[1];lock_items ++;}*/ITEMS[2] = (ITEMS[0] - USR_DAT[2])*ITEMS[1] + 5 + stop_time_all/300;}elseITEMS[2] = 5 + stop_time_all/300; //起步价 5 元}else{ITEMS[1] = USR_DAT[1]; //ITEMS[0]里程 ITEMS[1] 单价 ITEMS[2]结算if(ITEMS[0] > USR_DAT[0]){/* if((ITEMS[0] - temp_s) != 0){ITEMS[2] += ITEMS[1];lock_items ++;} */ITEMS[2] = (ITEMS[0] - USR_DAT[0])*ITEMS[1] + 5 + stop_time_all/300;}elseITEMS[2] = 5 + stop_time_all/300;}}/** 函数名:ex_int_init()* 函数作用:初始化外部中断* */void ex_int_init(){EX0 = 1;IT0 = 1;IP = 0x0a;//将定时器中断0,1优先级设为最高EX1 = 1;IT1 = 1;//下降沿触发}/** 函数名:ex1_int() interrupt 2* 函数作用:设置时间,用户数据:白天和晚上的起步距离和单价USR_DAT* */void ex1_int() interrupt 2{EX1 = 0;delay(200);EX1 = 1;key_pressed_time ++;}/** 函数名: void ex_int() interrupt 0* */void ex0_int() interrupt 0{if((cycle_time >= 72)||(stop_time > 0)) //此时说明速度小于5km/h{stop_time_all += (stop_time + cycle_time/50);cycle_time_info ++;}elsecycle_time_info = 10;if(cycle_time_info > 10)lock = 1;elselock = 0;stop_time = 0;cycle_time = 0;// if(stop_time_all >= 300){// ITEMS[2] += stop_time_all/300;//stop_time_all %= 300;// }// else{// while(lock){ /*获取信号量*/// lock --;// stop_time = sec;//暂时借用stop_time寄存器// };// display_stop_time();// /*// * 完成工作在display_stop_time显示 1s 后返回显示display_time */ // if((sec - stop_time) != 0){// display_time();// stop_time = 0;// lock ++ ;//释放信号量// }// }mileometer ++ ;if(mileometer%2 == 0)LED = !LED;}/** 函数名:void time1_init()* 函数作用:初始化定时器1,为工作方式一* */void time1_init(){TMOD = TMOD | 0x10;TH1 = (65535 - 20000)/256;TL1 = (65535 - 20000)%256;EA = 1;ET1 = 1; //定时器终端控制位TR1 = 1; //定时器控制位}/** 函数名称:void time1() interrupt 3* 函数作用:时钟计数函数计时时间用于测速 * */void time1() interrupt 3{TH1 = (65535 - 20000)/256;TL1 = (65535 - 20000)%256;cycle_time ++;if(cycle_time == 100){ //100stop_time += 2;cycle_time = 0;}// lcd_display_3(0x40+ 0x02,stop_time); // lcd_display_3(0x40+ 0x06,cycle_time);}/** 函数名:void display_set_time()* 函数作用:显示设置时间界面* */void display_set_time(){// lcd_write_str(0x80,STR_SET);lcd_write_str(0x80+0x40,STR1);lcd_display(0x40+0x08,'-'-0x30);lcd_display(0x40+0x0b,'-'-0x30);lcd_display(0x40+0x0e,' '-0x30);lcd_display_2(0x40+0x06,TIME[2]);lcd_display_2(0x40+0x09,TIME[1]);lcd_display_2(0x40+0x0c,TIME[0]);}/** 函数名:display_reset()* 函数作用:复位确定界面* Setting* Reset? No < > Y* */void display_reset(){lcd_write_str(0x80,STR_SET);lcd_write_str(0x80+0x40,STR_RST);}/** 函数名:display_stop_time()* 函数作用:显示停车或者小与5km/h的时间* Stop time:00 min* */void display_stop_time(){lcd_write_str(0x80,STR3);lcd_display_2(0x0a,stop_time_all/60); }/** 函数名:display_items()* 函数作用:显示里程,单价,应收取费用* S: P: A:* */void display_items(){// lcd_write_str(0x80+0x40,STR2); //第二行lcd_display(0x40+0x00,'S'-0x30);lcd_display(0x40+0x01,':'-0x30);lcd_display(0x40+0x04,' '-0x30);lcd_display(0x40+0x05,'P'-0x30);lcd_display(0x40+0x06,':'-0x30);lcd_display(0x40+0x09,' '-0x30);lcd_display(0x40+0x0a,'['-0x2f);//$lcd_display(0x40+0x0b,':'-0x30);lcd_display_2(0x40+0x02,ITEMS[0]); //里程lcd_display_2(0x40+0x07,ITEMS[1]); //单价lcd_display_3(0x40+0x0c,ITEMS[2]); //费用}/** 函数名称:display_time()* 函数作用:在lcd上显示出时钟时,分,秒* Time: 00-00-00* */void display_time(){lcd_write_str(0x80,STR1);lcd_display(0x06,' '-0x30);lcd_display(0x09,'-'-0x30);lcd_display(0x0c,'-'-0x30);lcd_display_2(0x07,TIME[2]);lcd_display_2(0x0a,TIME[1]);lcd_display_2(0x0d,TIME[0]);lcd_display(0x0f,' '-0x30);}/** 函数名:void time0_init()* 函数作用:初始化定时器0,为工作方式一* */void time0_init(){TMOD = TMOD | 0x01;TH0 = (65535 - 50000)/256;TL0 = (65535 - 50000)%256;EA = 1;ET0 = 1; //定时器终端控制位TR0 = 1; //定时器控制位}/** 函数名称:void time0() interrupt 1* 函数作用:时钟计数函数* */void time0() interrupt 1{TH0 = (65535 - 50000)/256;TL0 = (65535 - 50000)%256;count ++;if(count >= 20){count = 0;TIME[0] ++;}if(60 <= TIME[0]){TIME[0] = 0;TIME[1] ++;save_user_dat(); // 1 min保存用户数据}if(60 <= TIME[1]){TIME[1] = 0;TIME[2] ++;}if(24 <= TIME[2])TIME[2] = 0;}/************************************************** ****************** lcd 相关操作函数* ********************* * ************************************************/ /** 函数名:delay(uchar z)* 函数作用:单位延时约100us* */void delay(uchar z) //延时函数100us{uint x,y;for(x=z;x>0;x--)for(y=100;y>0;y--);}/** 函数名:lcd_write_cmd()* 函数作用:lcd写指令* */void lcd_write_cmd(uchar cmd){XBYTE[0xfcff] = cmd;delay(1);}/** 函数名:lcd_write_dat()* 函数作用:lcd写数据* */void lcd_write_dat(uchar dat){XBYTE[0xfdff] = dat;delay(1);}/** 函数名:lcd_init()* 函数作用:lcd初始化* */void lcd_init(){delay(16);lcd_write_cmd(0x3f);delay(5);lcd_write_cmd(0x3f);delay(1);lcd_write_cmd(0x3c);lcd_write_cmd(0x08);//lcd初始化完成//lcd使用方式设置// lcd_write_cmd(0x38);lcd_write_cmd(0x08);//屏幕关lcd_write_cmd(0x01);//清屏lcd_write_cmd(0x03);//光标归位lcd_write_cmd(0x0c);//光标方式设置不显示光标lcd_write_cmd(0x06);//指针自动加一整屏不移动}/** 函数名:lcd_display(uchar addr,uchar dat)* 输入参数:显示地址(首行addr,下行0x40+addr),显示数据的ascii * 函数作用:在特定位置显示一位特定数据* */void lcd_display(uchar addr,uchar dat){lcd_write_cmd(0x80 + addr);lcd_write_dat(dat + 0x30);//数字转换成ascii}/** 函数名:lcd_display_2(uchar addr,uchar dat)* 输入参数:显示地址(首行addr,下行0x40+addr),显示数据的ascii * 函数作用:在特定位置显示两位特定数据* */void lcd_display_2(uchar addr,uchar dat){lcd_write_cmd(0x80 + addr);lcd_write_dat(dat/10 + 0x30);//数字转换成asciilcd_write_dat(dat%10 + 0x30);}/** 函数名:lcd_display_3(uchar addr,uchar dat)* 输入参数:显示地址(首行addr,下行0x40+addr),显示数据的ascii * 函数作用:在特定位置显示三位特定数据* */void lcd_display_3(uchar addr,uchar dat){lcd_write_cmd(0x80 + addr);lcd_write_dat(dat/100 + 0x30);//数字转换成asciilcd_write_dat(dat%100/10 + 0x30);lcd_write_dat(dat%100%10 + 0x30);}/** 函数名:lcd_write_str* 输入参数:首地址,字符串首地址指针* 函数作用:写字符串数据* */void lcd_write_str(uchar addr,uchar *str) {lcd_write_cmd(addr);do{lcd_write_dat(*str);str ++;}while(*str != '\0');}/*************************** 24C00相关函数*************************//** 启动*/void start(){SDA = 1;SCL = 1;_NOP_();SDA = 0;_NOP_();SCL = 0;}/** 停止*/void stop(){SDA = 0;_NOP_();SCL = 1;_NOP_();SDA = 1;}/** 24C00移出数据到MCU*/uchar shin(){uchar i,read_data;for(i = 0; i < 8; i++){SCL = 1;read_data <<= 1;read_data |= SDA;SCL = 0;}return(read_data);}/** MCU移出数据到24C00*/bit shout(uchar write_data){uchar i;bit ack_bit;for(i = 0; i < 8; i++) // 循环移入8个位{SDA = (bit)(write_data & 0x80);_nop_();SCL = 1;_NOP_();SCL = 0;write_data <<= 1;}SDA = 1; // 读取应答_NOP_();SCL = 1;_NOP_();ack_bit = SDA;SCL = 0;return ack_bit; // 返回AT24C02应答位}/** 在指定地址addr处写入数据write_data*/void write_byte(uchar addr, uchar write_data) {start();shout(OP_WRITE);shout(addr);shout(write_data);stop();delay(10);}/** 读取当前地址数据*/uchar read_current(){uchar read_data;start();shout(OP_READ);read_data = shin();stop();return read_data;}/** 读取特定地址数据*/uchar read_addr(uchar addr) {start();shout(OP_WRITE);shout(addr);return(read_current()); }/** 将用户数据存储EEPROM 24C00* USR_DAT[4] ITEMS[3]*/void save_user_dat(){uchar i = 0;for(;i < 4;i ++)write_byte(i,USR_DAT[i]);for(;i < 7;i ++)write_byte(i,ITEMS[i]); }/** 恢复用户数据*/void restore_user_dat(){uchar i = 0;for(;i < 4;i ++)USR_DAT[i] = read_addr(i);for(i = 0;i < 3;i ++)ITEMS[i] = read_addr(i); }。
c语言出租车计费
已知某城市普通出租车收费标准为:起步里程为3公里,起步费为8元,10公里以内超过起步里程的部分,每公里加收2元,超过10公里以上的部分加收50%的回空补贴费,即每公里3元。
出租车营运过程中,因堵车和乘客要求临时停车等客的,按每5分钟加收2元
计算,不足5分钟的不计费。
从键盘任意输入行驶里程(精确到0.1公里)和等待时间(精确到分钟),请编程计算并输出乘客应支付的车费,对结果进行四舍五入,精确到元。
输入提示信息:"Input distance and time:"
输入格式:
用逗号分隔的两个数字,第一个表示距离、第二个表示时间:"%f,%d"
输出格式:"fee = %.0f\n" (注意:等号的两边各有一个空格)
#include <stdio.h>
int main(void)
{
int start_money = 8, less_than_10_km_per_money = 2, beyond_10_km_extra_money = 1, wait_5_min_money = 2,real_wait_time;
float start_distense = 3, real_distense ,real_money=0;
printf("Input distance and time(eg.3.5,15):");
scanf("%f,%d",&real_distense,&real_wait_time);
real_money = start_money;
real_money += real_distense > start_distense ? (real_distense - start_distense) * less_than_10_km_per_money : 0 ;
real_money += real_distense > 10 ? (real_distense - 10) * beyond_10_km_extra_money : 0 ;
real_money += real_wait_time / 5 > 0 ? real_wait_time / 5 * wait_5_min_money : 0 ;
real_money = (int)(real_money + 0.5);
printf("fee = %.0f\n",real_money);
return 0;
}。