暑期课程设计报告基于单片机的出租车计费器功能实现及拓展白登辉厉从予叶热斯力2014/7/161目录第1章摘要........................................................................................................................2第2章方案设计与对比....................................................................................................32.1方案一.............................................................................................................................32.2方案二.............................................................................................................................32.3方案三.............................................................................................................................32.4方案四.............................................................................................................................3第3章硬件设计................................................................................................................43.1整体原理图.....................................................................................................................43.2附加硬件构成.................................................................................................................4第4章软件设计................................................................................................................64.1流程图.............................................................................................................................64.2关键代码及其功能.........................................................................................................7第5章总结......................................................................................................................18第6章参考文献..............................................................................................................192第1章摘要出租车计价器是一种计量器具,用于测量出租持续时间及依据里程传感器传送的信号测量里程,并以测得的等待时间及里程为依据,计算并显示乘客出租车应付的费用。计价器作为乘客与司机双方交易的公平保障,在出租车运营中起到重要的作用。具有稳定性能的计价器对广大出租车司机和乘客来说都是很必要的。考虑到本题的实用性,我们选择出租车计费器作为本次课程设计的题目。出租车计价器最开始的只能显示路程,之后能够自主计费。随着技术的进步,现在的计费器能实现自动打印发票、语音提示、按时间自主变动单价等功能。本文中所设计的出租车计费器,基于单片机STC12C5A60S2设计。本设计采用C语言编程,在KeiluVision4软件中编译,用stc-isp-15xx软件下载测试,得到了计费器仿真设计结果。我们还尝试在已有电路板上增加硬件,软硬件结合,完成题目要求的扩展功能。在文章之后的部分中我们会介绍我们方案的提出、对比及最后决定,软硬件的设计,部分关键的程序,及最后的总结。3第2章方案设计与对比2.1方案一实现题目中的所有基本功能,不添加额外的硬件设备。以STC12C5A60S2为主控器,接收单片机上的旋转编码器生成的脉冲信号作为里程计数,每一个脉冲代表0.1km。设定起步价和燃油附加费之和15元作为初始值,根据题目基础要求,在里程计数超过3km后增加里程费。等待计时功能则用内部时钟完成。使用STLED316S和相连的八段数码显示管,显示总费用、时间和里程。其中数码管前四位显示总费用,后两位分时显示时间和路程。利用外部中断,控制时间、路程的记录和显示。2.2方案二我们希望能在设计的程序中运用到单片机上自带的键盘,所以考虑不使用外部中断控制,而是用键盘控制里程计数和等待时间计数的切换。但由于前期没有掌握键盘使用的方法,我们只得放弃这个想法,继续方案一。2.3方案三在经过初期的程序设计和实践之后,我们认为我们可以在完成所有基础要求的前提下,完成部分拓展要求。我们希望能在设计中加入硬件部分,故我们选择扩展功能中的(4),用一个外部的信号源和传感器生成检测脉冲信号,代替电路板自带旋转编码器产生的脉冲。同时我们还设计完成了要求(2),在里程超过20km之后加入返程补偿。返程补偿部分并不复杂,只需要更改部分计算程序就可以实现此功能。至于外部脉冲信号生成部分,我们制作了一个简单的外接电路。将一个低功率电动机,和变阻元件、开关串联起来,用一个光敏传感器检测随电动机转动的光栅生成的信号,向单片机对应端口传输脉冲信号即可。其中变阻器可用于调节里程增长速度,开关可控制计费模式。2.4方案四在前期的研究中,我们无法很好解处理使用键盘的难题,故无法完成(3)键盘设置这个功能。同时我们希望能通过键盘控制的方法,切换夜间与白天模式,这在我们一开始也是难以实现的。但在之后的研究中,我们掌握了正确控制键盘的方法,故最终方案四在完成方案三的前提下,加入了日、夜模式切换和键盘设置的功能。这样算来,除去拓展功能中的上位机由于时间关系无法完成外,我们完成了所有的设计任务。4第3章硬件设计3.1整体原理图本组按照实际使用的元件,设计了程序对应的电路图。见附录(电子文档见PDF)。3.2附加硬件构成本次选题基础内容主要为软件设计,硬件设计的拓展要求为设计一个外部传感器,代替EC12。考虑到在实现设计功能的同时,还希望电路便于实现和控制。我们采用了如图1所示的设计。电路由一个连接光栅的电动机、光电传感器、开关和变阻器组成。当开关打开时,电动机带动光栅转动。对光电传感器进行遮光处理后,光电传感器即能产生脉冲信号。这个信号的频率与接入的变阻器大小有关,调整变阻器大小可以输出不同频率的波形。如图2,3。图1外部传感器在一开始我们尝试用发下来的电路板提供电源,后来发现由于功率不够,在接入外部传感器后,数码管无法正常显示,故之后我们只能用外接电池的方式给其供电。5图250Hz输出波形图393Hz输出波形6第4章软件设计4.1流程图74.2关键代码及其功能/*******************************************************************************************/**函数名称:show**函数功能:6位led前四位显示金额,后两位显示路程或者时间**入口参数:money,tiro**出口参数:无/*******************************************************************************************/voidshow(unsignedintmoney,unsignedinttiro){unsignedintm0,m1,m2,m3,tr0,tr1,m,tr;unsignedcharshow[7];tr=tiro;m=money;tr0=tr/10;tr1=(tr-10*tr0)/1;/*取整*/if(tr0==0){tr0=20;}m0=money/1000;m1=(money-m0*1000)/100;m2=(money-m0*1000-m1*100)/10;/*取整*/m3=(money-m0*1000-m1*100-m2*10);if(m0==0){m0=20;}m2=m2+10;/*加10用于显示小数点*/show[0]=tr1;show[1]=tr0;show[2]=m3;show[3]=m2;show[4]=m1;show[5]=m0;Write8Led(0,show,6);}8/*******************************************************************************************/**函数名称:delay1**函数功能:精确延时dt*0.1秒**入口参数:dt**出口参数:无/*******************************************************************************************/voiddelay1(unsignedintdt){inti;for(i=0;idt*2;i++){TH1=0x3c;TL1=0xb0;TR1=1;while(TF1==0);TF1=0;TR1=0;}}/*******************************************************************************************/**函数名称:init1_count**函数功能:运用计数器T1的中断功能计脉冲数**入口参数:无**出口参数:无/*******************************************************************************************/voidinit1_count(void)interrupt2{EX1=0;/*关中断*/Delay(10);num1=num1+1;/*计数(全局变量)*/Delay(10);road=num1/10;if(num1=30){road1=30;9}else{road1=num1;}if(road1=990){road=99;}if(money=9999){money=9999;}re=0;/*中断标志位置零,表示进入中断*/if(road1==200){overtime=tm;}if(road1=200&&road1990){if(g8563_Store[2]0x18&&g8563_St