C语言出租车计价器课程设计
出租车计价器专业课程设计报告(含代码)

摘要随着社会的发展,出租车是人们生活中非常方便且较普遍的交通工具,出租车计价器的使用日益完善,现在我们引用单片机技术,使用编码和解码信息传递这种方式来完成计价器计数脉冲的形成;单片机可以很精确地检测到传感器信号。
用较少的硬件和适当的软件相互配合可以很容易的实现设计要求,且灵活性强,可以通过软件编程来完成更多的附加功能,本课程设计采用89C51的定时器T0产生的时钟,通过HD8255键盘显示电路用来显示行驶路程和价格及对计价的控制等从而实现了一个小型计价器系统。
关键字:计价器、单片机、89C51、HD8255目录一、设计要求 (1)1.1、基本要求: (3)1.2、要求分析: (3)二、系统组成及工作原理 (3)2.1系统的硬件构成及功能 (3)2.2 AT89S51单片机及其引脚说明 (4)2.3 AT24C01存储单元 (5)2.4系统工作原理 (5)三、方案设计对比 (6)3.1方案一: (6)3.2方案二: (6)3.3方案选择 (7)四、软件设计 (7)4.1系统主程序分析 (7)4.2计算程序 (8)4.3中途等待中断程序 (8)五、实验调试分析与结果 (9)5.1 实验调试 (9)5.2实验结果 (9)六、结论 (10)参考文献 (11)附录一: (12)一、设计要求1.1、基本要求:里程显示为:***.**公里;能预置起步价及单价:如起步3公里6.00元;1.60/公里;1.2、要求分析:1)起步价:乘客上车,显示起步价(6元),行车距离在3公里以内。
2)里程计价:(计价单位为元,并进行四舍五入)a.行车里程 < 3公里时,计价为6元;b.3公里≤行车里程时,计价为:6元+(里程-3)*1.6元/公里二、系统组成及工作原理2.1系统的硬件构成及功能本次设计主要有四个部分模块电组成,脉冲源产生脉冲提供给单片机,用来计算行驶路程,变换电路用来对产生的脉冲进行整形放大,单片机电路则控制整个系统的运行,8255键盘显示电路用来显示行驶路程和价格及对计价的控制。
基于C语言的出租车计价器程序设计

目录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],通过软件编程就可以实现计费模式的切换。
出租车计价器(课程设计)

摘要本设计的是一个基于c51单片机的出租车自动计费设计,附有复位电路,时钟电路,键盘电路和显示电路等。
复位电路是单片机的初始化操作,除了正常的初始化外,为摆脱困境,通过复位电路可以重新开始。
时钟电路采用12MHz的晶振,作为系统的时钟源,具有较高的准确性。
在上电时字符型数码显示器显示最初的起步价,但超过3km时计价器会在起步价的基础上再按每里程收费,通过按键可以启动,清除显示器的显示价钱。
通过计算可以得出总共的费用和总的路程。
在这里主要是以AT89S51单片机为核心控制器,P0口和P2口接七段显示器模块,P1口接按键的,通过按键输入启动和清除总价格。
关键词:单片机AT89C51;七段数码显示器7SEG-MPX4-CA;出租车计费器。
AbstractThis design is a based on c51 taxi automatic bill design, with reset circuit, clocking circuit, the keyboard circuit and show circuit, etc. Reset circuit are the initialization of single chip, in addition to the normal operation of the initial barbarian, difficulty, through to reset circuit can start again. The 12 MHz clock circuit of crystals, as the system clock source, has enough precision.When power in character type digital display shows the first started value, but more than 3 km the meter will start in price when on the basis of every mileage charge, then press the button can be activated by the display of the display, clear price. Can be obtained by the computation of the total cost, and general journey. Here are based on AT89S51 as the core controller, mouth and P2 P0 mouth pick seven segment display module, pick buttons, the P1 mouth by keystroke start and remove the total price.目录摘要 (1)目录 (2)第一章出租车计价器的设计题目要求 (3)1.1设计题目 (3)1.2设计要求 (3)第二章出租车的总体设计方案 (3)2.1方法论证与比较 (3)2.2 工作原理 (5)2.21工作原理框图如下: (5)2.22 工作原理: (6)2.3 所需设备及软硬件 (6)第三章出租车硬件电路设计 (6)3.1 AT89S51介绍 (7)3.11主要的功能特性 (7)3.12 管脚功能 (8)3.2 LED数码管介绍 (9)3.3单片机最小系统 (11)3.4振荡电路 (12)3.5 复位电路 (12)3.6 按钮接口电路 (13)3.7 显示电路 (13)第四章系统软件设计 (14)4.1 proteus软件介绍 (14)4.2 keil软件介绍 (15)4.3利用proteus与keil进行调试 (15)4.4 主程序流程图 (16)4.5子程序流程图 (16)4.51 键盘扫描子程序 (16)4.52 处理总价子程序 (17)4.53 显示总价子程序 (18)第五章设计调试结果和设计心得以及参考资料 (20)5.1 设计调试结果 (20)5.2 设计中的问题及解决方法 (20)5.3 设计心得 (20)5.4参考资料 (21)附录: (21)附录一:程序清单 (21)附录二、系统总体电路图 (26)附录二、仿真图 (27)第一章出租车计价器的设计题目要求1.1设计题目出租车计价器1.2设计要求利用单片机设计一个出租车自动计费器,计费包括起步价、行车里程计费、用4个七段数字显示器显示总金额,最大值为999.9元,起步价为5.0元,3Km 之内按起步价计费,超过3Km之后1.6元/公里,每200米计价跳表(即1KM增加1.6元,200m增加0,32元)。
c语言出租车计费

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;}。
出租车计价器(单片机c语言)

分类号编号毕业设计题目:基于单片机的出租车计价器的设计——电子设计系别信息工程学院专业电子信息工程姓名学号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日摘要现在各大中城市出租车行业都已普及自动计价器,所以计价器技术的发展已成定局。
而部分小城市尚未普及,但随着城市建设日益加快,象征着城市面貌的出租车行业也将加速发展,计价器的普及也是毫无疑问的,所以未来汽车计价器的市场还是十分有潜力的。
出租车计价器课程设计任务书

课题:出租车计价器一、预备知识(1)SPCE061A 端口设置方法(2)SPCE061A 定时器使用方法(3)SPCE061A 内部Flash 的读写方法(4)凌阳单片机汇编语言或C 语言编写基础(5)LED 数码管的显示原理(6)微型打印机的使用方法二、课程设计目的单片机学习不仅仅需要掌握单片机本身的用法,其外围器件:显示界面如LED 数码管,发光二极管、液晶等,控制器件如键盘等都是需要掌握和灵活应用的。
在计程器设计题目中还涉及到了微型打印机设备。
本课程设计以凌阳单片机系统板-61 板为基础进行设计开发,其基本要求是:1.熟悉单片机系统板基本构成;2.掌握LED 数码管显示原理及使用方法;3.掌握单片机系统板的使用方法;4.初步掌握单片机汇编语言一般编程技巧;5.初步掌握单片机系统调试的一般步骤及方法;6.掌握微型打印机的控制方法。
三、课程设计任务设计要求:利用SPCE061A单片机配合SPLC501液晶模组,实现基本的出租车计价器功能。
具体规格如下:1. 里程计量a) 单片机对传感器脉冲进行计数(传感器脉冲使用SPCE061A内部PWM输出模拟),并将脉冲数换算成公里数;b) 每公里对应的脉冲数PulsePerKM可以调整。
2. 费用计算a) 费用计算包括两部分:行驶费用和低速等待费用;b) 行驶费用计算如下:白天行驶里程不足StartMilege(三公里)时,费用按照起步价StartPrice(¥10.0元)计算;当超出StartMilege时,行驶费用=StartPrice+(行驶里程-StartMilege)×每公里的单价;夜晚行驶里程不足StartMilege时,费用按照起步价NightStartPrice(¥11.0元)计算;当超出StartMilege时,行驶费用=NightStartPrice+(行驶里程-StartMilete)×每公里的单价;c) 每公里的单价根据时间区分为白天和黑夜两种价格。
出租车计价器(单片机c语言)

P1.1:接功能键。
P1.3:接清零键。
P0口接数码管段选端,P2口接驱动芯片。
P3.4(T0):接模拟开关按键,替代了出租车计价器中的霍尔传感器。
P3.1、P3.0口接掉电保护电路。
2.3
按下计价按键时,显示起步价和起步里程范围,这些在程序中设置;当等于或超过两公里后,按计算总价的公式为:总价=起步价+单价*(总里程-起步里程)+1进行计价。本设计中,起步价为4元,起步里程为2公里,当然这些数据可以在程序中改写,以满足不同时期价格调整的需要。下图是通过在Keil C中编译通过,并生成Hex文件,在PROTEUS中仿真通过的整体硬件原理图:
图2.11时钟电路
2.4.6
按键控制电路中,单片机的P1.0管脚接启动/停止按键,通过软件编程,当按下按键计数器开始工作,开始计价;当弹起按键时,计数器停止工作,停止计价,启动/停止按键带自锁功能。按下启动按键,开关处于导通状态,这时给P1.0送低电平信号,这时TR0=1,计数器开始工作,调用计价子程序开始计价。清零按键接单片机的P1.3管脚,按下清零按键,P1.3为低电平,调用清零子程序,用于将显示数据清零,在程序中给各位赋0代码(0x3f),以达到清零的目的,方便下次计价。另外为功能键,控制价格调整,这个按键是在没有按下启动/停止按键时有作用,计价过程中无效。
能够保证系统可靠的复位,在初始化程序中应安排一定的复位延迟时间。
图2.8复位电路
2.4.4
掉电保护电路中采用了存储芯片AT24C02。
AT24C02是一个CMOS标准的EEPROM存储器,是AT24CXX系列(AT24C01/02/04/08/16)成员之一,这些EEPROM存储器的特点是功耗小、成本低、电源范围宽,静态电源电流约30uA~110uA,具有标准的I2C总线接口,是应用广泛的小容量存储器之一。
基于单片机的出租车计费(c语言)

基于单片机的出租车计费(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语言编写)

目录一、设计任务和性能指标 (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.能手动进行修改单价,但单价设定需密码进入。
出租车计价器(单片机c语言)doc资料

出租车计价器(单片机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); }。
出租车计价器-课程设计报告

软件学院课程设计报告课程题目出租车计价器班级集成13-4专业集成电路设计与集成系统学生学号指导教师(填写自己班的指导教师)年月日1.课程设计目的全面熟悉、掌握VHDL语言基本知识,掌握利用VHDL语言对常用的组合逻辑电路和时序逻辑电路编程,把编程和实际结合起来,熟悉编制和调试程序的技巧,掌握分析结果的若干有效方法,进一步提高上机动手能力,培养使用设计综合电路的能力,养成提供文档资料的习惯和规范编程的思想。
2.课程设计题目描述和要求2.1.课程设计题目描述①.实现计费功能,计费标准为:按行驶里程计费,起步价为7.0元,并在车行3km 后按2.2元/km 计费,当计费器达到或超过20元时,每公里加收50%的车费,车停止不计费。
②.现场模拟功能:以开关或按键模拟公里计数,能模拟汽车起动、停止、暂停等状态。
③.将车费和路程显示出来,各有一位小数。
2.2.总体设计思路框架2.3.课程设计题目要求①.设计正确,方案合理。
②.程序精炼,结构清晰。
③.设计报告含程序设计说明,用户使用说明,源程序清单及程序框图。
④.上机演示。
⑤.有详细的文档。
文档中包括设计思路、设计仿真程序、仿真结果及相应的分析与结论。
3.设计思想和设计内容3.1 出租车计费设计该出租车计费器按下开关S1后开始计费和计里程数,起步价是7元,行驶3公里,以后2.2元/公里。
并且设计选择模块,在车费超过20元每公里加收50%车费即3.3元/公里。
3.2 基本设计思想出租车计费器根据设计要求可初步分为3方面——显示、记里程数、记费。
之后再根据三方面分别设计模块。
1.显示模块。
一般计数器显示数字为1-F即16进制,而16进制不方便观看,所以在设计这一模块时我们将16进制改为10进制输出进而设计了译码模块。
2、里程模块。
设计要求对里程计数主要分为两个方面,计数以及公里数比较。
即3公里之内收7元,3公里之后20元(通过计算为9公里)以内每公里2.2元,9公里以外为每公里3.3元。
C语言程序设计 课程设计题目

C语言程序设计课程设计任务书C语言程序设计课程设计任务书C语言程序设计课程设计任务书C语言程序设计课程设计任务书C语言程序设计课程设计任务书C语言课程设计任务书题目:某学院教学信息管理系统功能:1、每一条记录包括一位教师的职工号、姓名、职称、性别、3门主讲课程(课程名称、开课学期、课程性质(学位与非学位课)和教学效果),教学效果综合评分。
2、输入功能:可以一次完成若干条记录的输入。
3、显示功能:完成全部教师记录的显示。
4、查找功能:完成按姓名或课程查找教师的相关记录,并显示。
5、排序功能:按职工号或教学效果综合评分进行排序。
6、插入功能:按教学效果综合评分高低插入一条教师记录。
7、将教师记录存在文件中。
8、应提供一个界面来调用各个功能,调用界面和各个功能的操作界面应尽可能清晰美观!要求:1、用C语言实现系统;2、利用结构体数组实现教学信息的数据结构设计;3、系统具有增加,查询,插入,排序等基本功能;4、系统的各个功能模块要求用函数的形式实现;5、将教学信息存在文件中。
课程设计的最后成果是实验报告一份,内容包括:1、预习报告(题目、流程图、程序的设计思想等);2、实验总结报告(测试方案、源程序代码(需打印)、调试中问题及解决方案、小结等)。
C语言课程设计任务书题目:酒店房间登记与计费管理系统功能:1、屏幕上出现一个界面,让操作员能够方便的选择所需要进行的操作,包括登记入住、查询房间的入住情况、查询当前费用、结账退房等操作。
2、对不同标准的房间实施不同的收费标准,也可以按天收费或按小时收费,可根据顾客需要在登记的入住的时候进行选择。
3、在结账退房时,根据入住的时间,计费方式和房间单价计算出总费用。
分步实施:1、初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数;2、完成最低要求:建立房间列表,完成登记入住、查询房间入住情况功能。
3、进一步要求:完成计费和费用查询功能。
要求:1、用C语言实现系统;2、函数功能要划分好(结构化程序设计);3、界面友好(良好的人机交互),加必要的注释;4、要提供程序测试方案,程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。
c语言课程设计汽车租赁系统

c 语言课程设计汽车租赁系统一、教学目标本课程的目标是让学生了解和掌握C语言在开发汽车租赁系统中的应用。
通过本课程的学习,学生将能够:1.知识目标:理解C语言的基本语法、数据类型、运算符、控制结构等基本概念;掌握函数、指针、数组等高级特性;了解C语言在汽车租赁系统中的应用。
2.技能目标:能够使用C语言编写简单的程序;能够运用C语言实现汽车租赁系统的基本功能;能够进行C语言程序的调试和优化。
3.情感态度价值观目标:培养学生对计算机科学的兴趣和热情;培养学生独立思考、解决问题的能力;培养学生团队协作、沟通交流的能力。
二、教学内容本课程的教学内容主要包括C语言的基本语法、数据类型、运算符、控制结构等基本概念,以及函数、指针、数组等高级特性。
具体安排如下:1.C语言的基本语法和数据类型;2.C语言的运算符和控制结构;3.函数的定义和调用;4.指针的概念和应用;5.数组的概念和应用;6.C语言在汽车租赁系统中的应用。
三、教学方法本课程将采用讲授法、案例分析法和实验法等多种教学方法,以激发学生的学习兴趣和主动性。
1.讲授法:通过讲解C语言的基本语法、数据类型、运算符、控制结构等基本概念,以及函数、指针、数组等高级特性,使学生掌握C语言的基本知识。
2.案例分析法:通过分析汽车租赁系统的实际案例,使学生了解C语言在实际应用中的重要性,提高学生的实践能力。
3.实验法:安排实验课程,让学生动手编写C语言程序,培养学生的实际操作能力。
四、教学资源本课程的教学资源包括教材、参考书、多媒体资料和实验设备等。
1.教材:选用权威、实用的C语言教材,为学生提供系统的学习资料。
2.参考书:推荐学生阅读一些经典的C语言参考书籍,丰富学生的知识体系。
3.多媒体资料:制作精美的PPT,为学生提供直观的学习体验。
4.实验设备:配置适当的实验设备,确保学生能够进行实际操作。
五、教学评估本课程的评估方式包括平时表现、作业和考试等,以全面、客观地反映学生的学习成果。
出租车计价器的设计(用计算机输入输出系统完成)

计算机硬件技术基础课程设计计程车计价器设计(用计算机系统的输入输出设备完成)重庆大学自动化学院二O一O年九月目录摘要 (2)1.设计的主要内容和方案 (2)2.任务分工 (3)3.操作说明 (3)4.程序流程图 (4)4.1 主程序流程图 (4)4.2 路程计价与等待时间计价切换流程图 (5)4.3 路程计价流程图 (6)4.4 时间计价流程图 (6)4.5 显示程序流程图 (6)5. 总结与体会 (7)5.1 吕天志的总结与体会 (7)5.2 冯尚飞的总结与体会 (8)5.3 唐杰的总结与体会 (9)5.4 旷驹的总结与体会 (10)6.参考文献 (10)7.程序清单 (11)出租车计价器的设计(用计算机系统的输入输出设备完成)摘要:出租车计价器是乘客与司机双方的交易准则,它是出租车行业发展的重要标志,是出租车中最重要的工具。
它关系着交易双方的利益。
具有良好性能的计价器无论是对广大出租车司机朋友还是乘客来说都是很必要的。
因此,汽车计价器的研究也是十分有一个应用价值的。
学习了计算机硬件技术基础,我们对微机原理有了初步了解,也能编程实现一些基本功能。
我们根据计价器的设计要求,用计算机输入输出设备完成了出租车计价器的软件设计。
1 设计的主要内容和方案分析任务要求,确定系统整体设计思路系统的设计方案1分析任务要求,确定系统整体设计思路(1)方案一:用汇编语言实现软件设计分为五个模块:主程序模块、路程计价模块、停车等待计价模块、油耗计算及报警模块、显示模块。
在主程序中,通过设置相应的中断向量,调用相应的中断服务程序,完成相应的计价,调用相关显示程序,完成计价器的最终显示。
路程计价模块中,首先根据行车速度和行车时间计算出行车路程,其中,行车时间可以由计算机内部的8254定时器通道0完成,然后根据路程和预先输入的起步价和每公里单价计算出价格。
在计价过程中,若遇到停车,但没有停止计价,则转入停车等待计价模块。
C语言——7-18出租车计价

C语⾔——7-18出租车计价本题要求根据某城市普通出租车收费标准编写程序进⾏车费计算。
具体标准如下:起步⾥程为3公⾥,起步费10元;超起步⾥程后10公⾥内,每公⾥2元;超过10公⾥以上的部分加收50%的回空补贴费,即每公⾥3元;营运过程中,因路阻及乘客要求临时停车的,按每5分钟2元计收(不⾜5分钟则不收费)。
输⼊格式:输⼊在⼀⾏中给出输⼊⾏驶⾥程(单位为公⾥,精确到⼩数点后1位)与等待时间(整数,单位为分钟),其间以空格分隔。
输出格式:在⼀⾏中输出乘客应⽀付的车费(单位为元),结果四舍五⼊,保留到元。
输⼊样例1:2.6 2输出样例1:10输⼊样例2:5.1 4输出样例2:14输⼊样例3:12.5 9输出样例3:34#include<stdio.h>int main(){double b,c;int h,a;scanf("%lf %d",&b,&h);a=h/5;printf("%0.1f,%d\n",b,a);if(b<=3){c=10+a*2;}else if(b>3&&b<=10){c=10+(b-3)*2+a*2;}else if(b>10){c=10+14+(b-10)*3+a*2;}printf("%.0f\n",c);return0;}总结:注意①:四舍五⼊需要是浮点型;注意②范围要有等号。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
里程计算是通过安装在车轮上的霍尔传感器检测到的脉冲信号,送到单片机产生中断,单片机再根据程序设定,计算出里程。其原理如图4所示。
图4传感器测距示意图
本系统选择了将A44E的脉冲输出口接到P3.3口外部中断1作为信号的输入端(这样可以减少程序设计的麻烦),车轮每转一圈(设车轮的周长是1米),霍尔开关就检测并输出信号,引起单片机的中断,对脉冲计数,当计数达到1000次时,即1公里,单片机就控制将金额自动增加,如图5。
图2单片机最小系统图
AT89S52的复位端是一个史密特触发输入,高电平有效。RST端若由低电平上升到高电平并持续2个周期,系统将实现一次复位操作。在复位电路中,按一下复位开关就使在RST端出现一段时间的高电平,外接11.0592M晶振和两个30pF电容组成系统的内部时钟电路。
2.2 A44E霍尔传感器检测单元
A44E属于开关型的霍尔器件,其工作电压范围比较宽(4.5~18V),其输出的信号符合TTL电平标,可以直接接到单片机的IO端口上,而且其最高检测频率可达到1MHZ。
A44E集成霍耳开关由稳压器A、霍耳电势发生器(即硅霍耳片)B、差分放大器C、施密特触发器D和OC门输出E五个基本部分组成。
在输入端输入电压Vcc,经稳压器稳压后加在霍尔电势发生器的两端,根据霍尔效应原理,当霍尔片处在磁场中时,在垂直于磁场的方向通以电流,则与这二者相垂直的方向上将会产生霍尔电势差VH输出,该VH信号经放大器放大后送至施密特触发器整形,使其成为方波输送到OC门输出。当施加的磁场达到工作点(即Bop)时,触发器输出高电压(相对于地电位),使三极管导通,此时OC门输出端输出低电压,三极管截止,使OC门输出高电压,这种状态为关。这样两次电压变换,使霍尔开关完成了一次开关动作。A44E霍尔传感器原理如图3所示。
3.4显示程序
3.5键盘程序
4、总结
参考文献
附录A系统原理图
附录B系统源程序
前言
随着出租车行业的发展,出租车已经是城市交通的重要组成部分,从加强行业管理以及减少司机与乘客的纠纷出发,具有良好性能的计价器对出租车司机和乘客来说都是很必要的。而采用模拟电路和数字电路设计的计价器整体电路的规模较大,用到的器件多,造成故障率高,难调试。而采用单片机进行的设计,相对来说功能强大,用较少的硬件和适当的软件相互配合可以很容易地实现设计要求,且灵活性强,可以通过软件编程来完成更多的附加功能。本设计采用AT89S52单片机为主控器,以A44E霍尔传感器测距,实现对出租车的多功能的计价设计,并采用AT24C01实现在系统掉电的时候保存单价等信息,输出采用8段数码显示管。本电路设计的计价器不但能实现基本的计价,而且还能根据白天,黑夜和中途等待来调节单价。
第一章系统工作原理
1.1功能说明
出租车计价器根据乘客乘坐汽车行驶距离和等候时间的多少进行计价,并在行程中同步显示车费值。从起步价开始,当汽车程行驶未满3公里时,均按起步价计算。过3公里后,实现每1公里单价收费,中间遇暂停时,计程数不再增加,开始计时收费,测距收费和测时收费的和便构成了一位乘客的车费。同时,白天和夜晚价格不同,可以进行切换。白天单价、夜晚单价、等待单价和起步价格都可通过独立键盘进行调节。(默认起步价为5元/3公里,里程单价白天为1.5元/公里,夜晚为1.8元/公里,等待计时单价为0.5元/5分钟)
图5 A44E霍尔元件接线图
2.3 AT24C01存储单元
存储单元的作用是在电源断开的时候,存储当前设定的单价信息。AT24C01是Ateml公司的1KB的电可擦除存储芯片,采用两线串行的总线和单片机通讯,电压最低可以到2.5V,额定电流为1mA,静态电流10uA(5.5V),芯片内的资料可以在断电的情况下保存40年以上,而且采用8脚的DIP封装,使用方便。
图1系统结构图
第二章硬件设计
2.1单片机最小系统单元
主控机系统采用了Atmel公司生产的AT89S52单片机,它含有256字节数据存储器,内置8K的电可擦除FLASH ROM,可重复编程,大小满足主控机软件系统设计,所以不必再扩展程序存储器。复位电路和晶振电路是AT89S52工作所需的最简外围电路。单片机最小系统电路图如图2所示。
每当设定一次单价,系统就自动调用存储程序,将单价信息保存在芯片内;当系统重新上电的时候,自动调用读存储器程序,将存储器内的单价等信息,读到缓存单元中,供主程序使用。
2.4键盘调整单元
当单价等信息需要进行修改时,就要用到键盘进行修改。由于调节信息不多,故采用4个独立键盘即可,分别实现清零、切换、增大、减小和功能等作用。电路原理如图8所示。
1.2基本原理
计数器系统主要由五部分组成:A44E霍尔传感器、AT89S52单片机、独立键盘、EEPROM AT24C01和显示数码管。
霍尔传感器安装在车轮上,主要检测汽车行进的公里数,并产生一系列相应的脉冲输出,脉冲送到单片机进行处理,单片机根据程序设定通过计算脉冲数换算出行驶公里数,再根据从EEPROM中读取的价格等相关数据进行金额的计算,计算好的金额、里程和单价都实时地显示在数码管上。独立键盘可以调节价格等相关数据,按下相应的按钮,产生信号交由单片机处理并实时显示出来,调节好的数据存储到EEPROM中,掉电后可以使调好的数据不丢失,下次得电后直接从EEPROM读到单片机,系统结构图如图1。
出租车计价器课程设计
前言
1、系统工作原理
1.1功能说明
1.2基本原理
2、硬件设计
2.1单片机最小系统单元
2.2 A44E霍尔传感器检测单元
2.3 AT24C01存储单元
2.4键盘调整单元
2.5显示单元
3、软件设计
3.1系统主程序
3.2中断程序
3.2.1里程计数中断程序
3.2.2中途等待中断程序
3.3计算程序
AT24C02芯片引脚配置如图6所示。
存储单元电路连接如图7所示。
图7存储单元电路原理图
图中R4、R5是上拉电阻,其作用是减少AT24C01的静态功耗。由于AT24C01的数据线和地址线是复用的,采用串口的方式传送数据,所以只用两根线SCL(时钟脉冲)和SDA(数据/地址)与单片机P2.2和P2.3口连接,进行传送数据。