《出租车计价器课程设计报告.doc》由会员分享,可在线阅读,更多相关《出租车计价器课程设计报告.doc(39页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、. .XX工程学院题 目: 出 租 车 计 价 器 院 系: 电气信息工程学院 专 业: 电气工程及其自动化 成 员:X靖瑜、邱绪艳、高倩楠指导教师: 瓮 嘉 民 2012 年 11 月 29 日课程设计报告评语该组在实训期间,认真完成规定的课程设计内容,认真听讲,积极学习,实训报告条理清晰、内容详实、字迹整洁、能独立完成实训作品,动手能力得到很大提高。该组圆满完成实训任务,效果等 级:评阅人: 职称:年 月 日目 录总方案设计3一设计任务31.1根本要求31.2发挥局部4二.软件算法42.1系统主程序流程图42.2数据处理子程序流程图52.3等待时间计时子程序52.4键盘扫描子程序6三硬件设
2、计73.1单片机最小系统73.2测距单元83.3按键单元103.4显示单元10四Proteus软件仿真13五程序14六参考文献28七感受29. .word. .总方案设计本次设计是使用单片机技术来实现一个模拟出租车的计价器,利用单片机丰富的IO端口及其控制的灵活性,实现根本的里程计价功能和等待功能等。具有性能可靠、电路简单、本钱低、扩展空间大等特点。一设计任务本次课程设计的任务是设计一款基于STC89C52单片机的出租车计价器,通过对传感器的检测,对数值进展处理和显示。设计总框图如图1-1:霍尔传感器数据显示状态指示按键单片机图1-1计价器系统框图1.1根本要求设计一个模拟出租车计价器,计费包
3、括起步价、行车里程计费两局部,用两个四位一体的数码管分别显示总金额和里程,一个数码管显示价格,起步价为5.0元,最大值为9999元,3Km之内起步价计费,超过3km,增加1元即1 km增加1元;一个显示里程,准确到0.1km,最大值为999.9km.、计费功能费用的计算是按行驶里程收费,设起步价为5元。1、当里程3km时,每公里多加1元,总费用=5+1*X-3、显示功能1、显示里程:用四位数字显示,显示方式为“XXX.X,单位为km,计程X围0-999.9km,准确到0.1km。2、显示费用:用四位数字显示,显示方式为“XXXX,单位为元,计价X围0-9999元,准确到1元。1.2发挥局部增加
4、扩展按键,可以根据需求定义新功能。二.软件算法2.1系统主程序流程图图2-1系统主程序流程图2.2数据处理子程序流程图每当霍尔传感器输出一个脉冲,里程和金额都相应变化,当然等待时间也换算成里程,计算程序根据里程数分别进入不同的计算公式。如果里程大于3公里,那么执行公式:金额=里程-3*单价+5;否那么,执行公式:总金额=起步价。程序流程图如图2-2所示。 图2-2 数据处理子程序流程图2.3等待时间计时子程序当出租车停顿时,等待时间被换算成里程,进展计算,显示换算过的里程数和金额。当结算时停顿计时和计费并显示金额,当有清零键按下时存储本次金额。如图2-3:图2-3等待时间计时子程序2.4键盘扫
5、描子程序键盘处理状态表如下表2-1.操作状态Key1按下开场键开场打表,翻开INT0中断,开场采集轮子脉冲,记录距离Key2按下结算键关闭各个中断,停顿采集轮子脉冲Key3按下堵车键进入堵车状态并计费Key4按下查询键显示总路程、总金额Key5按下清零键清零当前值表2-1当没有按键按下的时候,单片机循环主程序,一旦有按键按下,便转向相应的子程序处理,处理完毕再返回。流程图如图2-4。图4-4 键盘扫描子程序三硬件设计3.1单片机最小系统复位电路和晶振电路是STC89C52工作所需的最简外围电路。单片机最小系统电路图如图3-1所示。图3-1单片机最小系统STC89C52 的复位端是一个史密特触发
6、输入,高电平有效。RST端假设由低电平上升到高电平并持续2个周期,系统将实现一次复位操作。在复位电路中,按一下复位开关就使在RST端出现一段时间的高电平,外接12M晶振和两个30pF 电容组成系统的内部时钟电路。3.2测距单元本次设计我们选取了霍尔传感器来进展里程测量。霍尔器件是一种磁传感器,用它可以检测磁场及其变化,可在各种与磁场有关的场合中使用。霍尔器件以霍尔效应为其工作根底,它具有许多优点,它的构造结实,体积小,重量轻,寿命长,安装方便,功耗小,频率高,耐震动,不怕灰尘、油污、水汽及盐雾等的污染或腐蚀。里程测量是通过将霍尔传感器安装在车轮旁边的铁板上,将磁铁安装在车轮上,旋转的车轮将磁铁
7、对传感器时,霍尔传感器会输出一个脉冲信号,经过处理送到单片机,经过单片机的计算处理,将行驶的里程送到显示单元并显示出来。其原理示意图如3-2:图3-2 传感器测距示意图霍尔传感器有3个外接口,2个是电源的正负极接口,最后一个是脉冲信号输出口,只要将霍尔传感器的信号输出端接到单片机的端口上便可以实现距离检测。工作原理如图3-3.其中,单片机的P3.2INT0引脚作为信号的输入端,采用外部中断0进展计数。车轮每转一圈,霍尔传感器就产生一个脉冲信号,根据霍尔效应原理,当霍尔片处在磁场中时,霍尔传感器的输出端输出低电平。当车轮转动一圈时小磁铁提供一个磁场,那么霍尔传感器输出一次低电平完成一次数据采集,
8、从而产生信号。霍尔传感器检测并输出信号到单片机的INT0口,引起单片机的中断,对脉冲计数,当计数到达特定的次数时,里程就会增加,单片机对里程进展计算后,通过接口电路将计算好的结果传送到数码管并显示出来。图3-3 霍尔元件工作原理3.3按键单元本设计的按键单元电路有6个按键,功能分别是:S1是开场键,按下时开场计时和计费;S2是结算键;S3是查询键,按下时可以查询历史记录;S4是清零键,用于清楚上次记录;S5是扩展键,用于在需要时实现新功能;S6是复位键。如图3-4所示。图3-4 按键单元电路3.4显示单元本设计显示单元包括两局部:数码管显示图3-5和二极管指示显示图3-6。数码管显示局部使用两
9、个四位一体的LED数码管,LED是发光二极管的简称,是一种将电能转换成光能的设备。LED显示器是由发光二极管排列组成的显示器件。它采用低电压扫描驱动,具有:耗电少、使用寿命长、本钱低、故障少、视角大、可视距离远等特点。此外,它的响应时间短一般不超过0.1us,亮度也比拟高。它的缺点是工作电流比拟大,每一段的工作电流在10mA左右。其中每位数码管是由8个发光二极管演变而来,其中7个发光二极管构成7笔字形,另一个构成小数点,称为8段LED。8段LED数码管是利用7个LED发光二极管外加一个小数点的LED组合而成的显示设备,可以显示09等10个数字和小数点,使用非常广泛,它的外观如图3-7所示:图3
10、-7 8段数码管这类数码管可以分为共阳极(8个发光二极管的阳极接在起)与共阴极(8个发光二极管阴极连在一起)两种,共阳极就是把所有LED的阳极连接到共同接点,而每个LED的阴极分别为a、b、c、d、e、f、g及dp小数点;共阴极那么是把所有LED的阴极连接到共同接点,而每个LED的阳极分别为a、b、c、d、e、f、g及dp小数点,如图3-8所示。 图3-8 共阳和共阴数码管构造通过控制这个公共端,可使该位亮或暗。如共阴极端接地或共阳极接高电平,那么该位显示器有效,反之无效。本设计采用共阳LED数码管。数码管有静态显示和动态显示两种,这里采用动态显示。它具有低功耗、接口少等特点。如图3-5两个四
11、位一体数码管接P0口作为段选,接P2口作为位选。开场计价时前四位显示路程,后四位显示价钱。图3-5数码管显示局部 二极管指示局部包括开场打表指示灯、显示统计数据指示灯、堵车等待指示灯等如图3-6。这些指示灯能对出租车的每一种状态进展指示,开场打表时D1亮,结算当前费用时D2亮,堵车等待时D3亮,清零当前值时D4亮。图3-6 二极管指示局部实物图如3.7.图3-7 实物图四Proteus软件仿真本设计需要用Keil uVision4对C52程序进展编译,生成“.hex文件,如图4-1.图4-1Keil uVision4编译在Proteus软件中画出仿真电路如图4-2,把Keil uVision4
12、编译后生成的“.hex导入到单片机中,按“运行仿真键进展仿真。图4-2Proteus仿真五程序源程序如下:#include #define uchar unsigned char #define uint unsigned int/*description: */* 本区定义了程序各局部涉及的单价 */#define QBJ 5 /*起步价;修改“5,即可改变程序中打表起步价.*/#define DJ 10/*每公里价钱;修改十位上“1,即可改变每公里单价.例“ 10代表1公里1元,20代表1公里2元 */#define DC_SD 2;/*堵车时默认速度;修改“2,即可改变默认速度*/*表示
13、每10秒增加 “2 百米/*(默认速度公式:DC_SD= V/3600 V单位为km/h)*/* 注:暂不支持小数,仅支持整数。 */volatile unsigned int qianwei,baiwei,shiwei,gewei; /显示数据各个位置数字的临时变量 unsigned int code led_seg_code10=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/段码表示0-9 volatile unsigned int dis,distance,A_distance,time,A_time,cost,A_cost;/定义
14、路程、价钱、总路程,总时间,全局变量; volatile unsigned int temp_cost,temp_distance,temp_cost_1,temp_distance_1; /需要用来传递的临时 全局变量sbit key1=P14; /开场打表sbit key2=P15; /停车,停顿打表sbit key3=P33; /以按键模拟堵车sbit key4=P16; /查看 合计 打表 里程 及 费用sbit key5=P17;/去除当前显示sbit led1=P10;/ 指示key1 sbit led2=P11;/ 指示key2sbit led3=P12;/ 指示key3sbit
15、 led4=P13; / 指示key4bit STAR_flag;/ 标志位对应 key1bit STOP_FLAG;/ 标志位对应 key2bit DC_flag;/ 标志位对应 key3bit DATA_flag;/ 标志位对应 key4bit CLR_FLAG;/ 标志位对应 key5 void initial_data(void)STAR_flag=0; DATA_flag=0; DC_flag=0; STOP_FLAG=0;CLR_FLAG=0; led1=0;led2=0;led3=0;led4=0; void juli()dis=dis+1; /每转一周1M(暂定)if(dis=
16、5)/100M 在数码管上显示暂定 distance=distance+1;dis=0; void jisuan()if(distance=20)cost=(distance-20)/DJ+QBJ; /*起步价;修改此处“5,即可改变程序中打表起步价.每公里价钱;修改“10,即可改变每公里单价.*/else /* 注: “1为每公里1¥ */cost=QBJ; /*这里5,同上。*/void fenli(uint temp) if(temp9999) temp=9999;qianwei=temp/1000;baiwei=(temp/100)%10;shiwei=(temp%100)/10;ge
17、wei=temp%10; void diplay_delay() uchar i; for(i=0;i0;i-) for(j=340;j0;j-);void keyscan() if(key1=0) delay(5); /按键消抖 if(key1=0) /按键消抖 EA=1; /KEY1按下,翻开总中断根据main()可知,翻开INT0中断,即开场采集轮子脉冲,记录距离 STAR_flag=1; /翻转KEY1标志位STOP_FLAG=0; DATA_flag=0; CLR_FLAG=0;/翻转其他按键标志位,到达互锁功能 while(key1=0); /松键等待 if(key2=0)dela
18、y(5); /按键消抖if(key2=0) /按键消抖EA=0; /KEY2按下,翻开总中断根据main()可知,关闭各个中断,即停顿采集轮子脉冲,记录距离包括堵车检测STOP_FLAG=1; /翻转KEY2标志位STAR_flag=0; DATA_flag=0; CLR_FLAG=0; /翻转其他按键标志位,到达互锁功能while(key2=0); /松键等待if(key5=0)delay(5);/按键消抖if(key5=0)/按键消抖CLR_FLAG=1;/翻转KEY5标志位STOP_FLAG=0; STAR_flag=0; DATA_flag=0;/翻转其他按键标志位,到达互锁功能whi
19、le(key5=0); /松键等待 if(key4=0) delay(5); /按键消抖 if(key4=0) /按键消抖 DATA_flag=1; /翻转KEY4标志位STOP_FLAG=0; STAR_flag=0; CLR_FLAG=0;/翻转其他按键标志位,到达互锁功能 while(key4=0);/松键等待 /指示等扫描 led1=STAR_flag; / 指示,是否有乘客乘车; led2=DATA_flag; / 切换指示,显示 总?路程.时间? led3=DC_flag; / 指示是否堵车; diplay_delay(); void initial_time() TMOD=0X0
20、1;TH0=(65536-7800)/256; /10msTL0=(65536-7800)%256;IT0=1;EX0=1;ET0=1;EA=0;void zd() interrupt 0 /外部中断0juli();if(distance=9999)distance=9999; void time0() interrupt 1 /定时0 uint temp_t;TH0=(65536-7800)/256; /10ms 此处延迟10MS,由于代码长度和全局不稳定变量未优化导致,一定误差。TL0=(65536-7800)%256;/故,经计算,10MS的初值未7800左右。temp_t+;if(te
21、mp_t=1000) /1秒改变一次distance 0.X kmtemp_t=0;distance=distance+DC_SD;if(distance=9999)distance=9999; void main(void) uchar kkk=1; /局部标志位变量,判断key1和key2的开关关系,使显示稳定状态。 bit mmm=0; /局部标志位变量,标志堵车按键状态,改变 定时器 与 外部中断开关顺序。 initial_data(); /初始化数据 initial_time(); /初始化定时器 while(1) keyscan(); if(STAR_flag=1)/判断key1标
22、志位 if(key3=0) / 模拟堵车 delay(5); if(key3=0) /消除抖动 TR0=1;EX0=0; DC_flag=1; /* mmm=!mmm;if(mmm=1) /第一次按下key3(进入堵车状态) TR0=1;EX0=0; /开 TO 关 INT0DC_flag=!DC_flag;/翻转堵车标志位if(mmm=0) /第二次按下key3退出堵车状态,进入打表计时状态TR0=0; EX0=1; /开 INT0 关T0DC_flag=!DC_flag; /翻转堵车标志位 */ elseTR0=0; EX0=1;DC_flag=0;kkk=1; /将打表开场局部标志位 置
23、1,EA=1; /开总中断翻开int0jisuan(); /计算费用fenli(cost); /别离费用各个位,分为 “个“十“百“千led_show_1(); /将费用显示在四位数码管组1上fenli(distance); /别离里程各个位,分为 “个“十“百“千led_show_2(); /将里程显示在四位数码管组2上temp_cost=cost; /将本次费用暂存于传递变量 temp_cost中。temp_distance=distance;/将本次里程暂存于传递变量 temp_distance中。 if(STOP_FLAG=1)/判断key2标志位 EA=0;/关闭中断关int0,ET
24、0TR0=0;cost=0;distance=0;/去除上次费用,里程fenli(temp_cost);/别离 传递变量 temp_cost ,即上次费用。led_show_1();/将上次费用显示在四位数码管组1上fenli(temp_distance);/别离 传递变量 temp_distance ,即上次里程。led_show_2();/将上次里程显示四位数码管组2上if(kkk=1)/判断是否是key1按下后,按的key2temp_cost_1=temp_cost; /将 传递变量 temp_cost ,即上次费用 传递到 temp_cost_1 上。temp_distance_1=t
25、emp_distance;/将 传递变量 temp_cost ,即上次费用 传递到 temp_distance_1 上。kkk=0; /去除KKK标志位A_cost=A_cost+temp_cost_1; /统计总费用temp_cost_1=0;A_distance=A_distance+temp_distance_1;/统计总里程temp_distance_1=0; if(DATA_flag=1) /判断key4标志位 显示总里程 fenli(A_cost); / 别离总费用led_show_1(); /将总费用显示四位数码管组2上fenli(A_distance);/别离总里程led_sh
26、ow_2(); /将总里程显示四位数码管组2上 if(CLR_FLAG=1)/清零 fenli(0);led_show_1();fenli(0);led_show_2(); . .word. .六参考文献1 戴佳, 陈斌, 苗龙. 51单片机应用系统开发典型实例. 中国电力,20052 余发山,王福忠. 单片机原理及应用技术. 中国矿业大学,2021.63 侯玉宝, 陈忠平, 李成群.基于Proteus的51系列单片机设计与仿真.电子工业,20214 李玉梅. 基于MCS-51系列单片机原理的应用设计. 国防工业,20065 边春元, 李文涛, 江杰. C51单片机典型模块设计与应用. 机械工
27、业,20216 楼然苗,胡佳文,李光飞等.单片机实验与课程设计. XX大学,2021.10. .word. .七感受感想1X靖瑜完本钱次的单片机课程设计花费了两周时间,我觉得花费这些时间是十分有意义而且十分必要的。单片机课程设计中遇到最多的问题是在程序编写和线路设计上,为此,我们翻阅了好几本书,系统地学习了C语言,认真回忆和复习了电路知识,查阅了大量的网络资源。这期间,我们曾因为程序错误而苦恼,因为电路复杂而焦急,但是我们还是靠着团结努力的精神逐一克制克制。最终,我和我的队友制定出了完整的设计方案,设计出了简洁明了的电路图,并且在我们的共同努力下做出了出租车计价器的实物图。这次课程设计从理论到
28、实践,我学到了很多的东西,还稳固了以前所学过的知识,比之前有了一个更加清晰的理解,明显地感觉到动手实践掌握的东西远比单纯课堂上听来的要深刻清晰,掌握得也更扎实,在下次遇到类似问题的时候就会有清晰的解决问题的思路和方法。同时我发现自己对单片机的兴趣也在逐渐增加,在这一设计过程中,我学会了坚持不懈,不轻言放弃。回忆起此次单片机课程设计,我最大的感触是,做事要有条理有方案,学习知识要严谨仔细,遇到问题时要马上思考检查问题出在哪边,而不是抱怨,只有这样我才能真正学会单片机,而且自己处理问题的能力才会得到提高。总之,单片机课程设计让我受益匪浅,感谢给我帮助的教师和朋友!. .word. .感想2邱绪艳在
29、本次设计中,我们采用STC89C52芯片为核心器件,设计出了简单的出租车计价器,能够实现显示时间、等待时间、金额和里程,按键控制,堵车指示。选题后,我们便开场复习单片机方面的知识,因为我们的单片机理论知识学得不好,也查阅、搜索了很多相关资料,进展总体设计与具体设计,同时也学习仿真软件Proteus和编程软件Keil uVision4的使用。由于以前都采用汇编语言实现编程,对用C语言来实现单片机的编程不太习惯,很多程序看不懂,需要查英语字典翻译,花费了一些时间来熟悉C语言的编程。在设计开场,要形成流程图,它可以使设计有一定的逻辑性与严密性,使得设计思路明确。采用模块化的设计思想很重要,它方便编写
30、、修改与调试,另外加上必要的注释,便于交流与理解。这次课程设计设计完成后,体会颇多,在学与做的过程中,取长补短,不断学习新的知识,吸取经历,到达进步的目的。在设计起初,程序的调试时我们遇到的最大困难,仿真时很多功能不能实现,焊接时有很多困难,具体如下:1仿真时出现同样的8位数字,无法正常计数。原因:在程序中按键的程序繁杂,调用指令无序,定义中缺少指令。解决方法:按键程序采用分区扫描法,根据流程图,整改要调用的指令,重新定义所需子程序2清零后,重新计时,切换数字波动大。原因:按键的扫描不符合程序规定。解决方法:采用按键分区扫描3焊接时布线繁杂,不能一个一个的焊,最终我们采用先布线后焊接,把每个线
31、路的线先放好,美观后焊接,由于焊接水平有限,在焊接时出现焊锡连到一起,焊接不结实的问题,但是我们认真检查,修改,最终完成了实物焊接4在调试实物时,出现模拟脉冲示波器失真。因为轮胎中的磁柱与霍尔传感器感应出现问题,轮胎转动偏离轴承,霍尔传感器无法感应。通过我们的努力以及相关图书资料的帮助,本次设计我们学习到不少单片机的知识,但由于自己的理论知识水平有限,实践知识和设计经历缺乏,在设计过程中难免存在一些问题。所焊实物尚有许多缺乏,个别功能还不能很好的实现,主要原因是考虑问题不周全,电路设计经历少,实际动手能力缺乏。恳请各位教师批评指正,以使我们在以后的学习和实践中加以改良和提高。感想3高倩楠出租车计费器系统的设计已经全部完成,能按预期的效果进展模拟汽车启动,停顿,暂停等功能并能够通过LED显示车费数目。本款出租车计价器包括单价输出、单价查询、显示当前里程和金额功能。另外,多功能出租车计价器还具有性能可靠、电路简单、本钱低、实用性强等特点,加上经过优化的程序,使其有很高的智能化水平。半个月来,经过我们的努力,根本上完成了设计要求的内容,在系统可行性分析、原理图设计等方面都作了许多实际工作,取得了一些成绩,同时也遇到了一些问题,存在一些缺乏。经过这半个月的学习,我觉得自己不管是在理论知识方面还是在动手能力方面都有了不小的进步,自己从中受益匪浅。这次设计很好的把以前学到的理论知
限制150内