出租车计价器.docx

上传人:土8路 文档编号:10388633 上传时间:2021-05-13 格式:DOCX 页数:21 大小:974.59KB
返回 下载 相关 举报
出租车计价器.docx_第1页
第1页 / 共21页
出租车计价器.docx_第2页
第2页 / 共21页
出租车计价器.docx_第3页
第3页 / 共21页
出租车计价器.docx_第4页
第4页 / 共21页
出租车计价器.docx_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《出租车计价器.docx》由会员分享,可在线阅读,更多相关《出租车计价器.docx(21页珍藏版)》请在三一文库上搜索。

1、摘要 随着出租车行业的发展,出租车已经是城市交通的重要组成部分,从加强行业管理以及减少司机与乘客的纠纷出发,具有良好性能的计价器对出租车司机和乘客来说都是很必要的。因此,汽车计价器的研究也是十分有一个应用价值的。而采用模拟电路和数字电路设计的计价器整体电路的规模较大,用到的器件多,造成故障率高,难调试。而采用单片机进行的设计,相对来说功能强大,用较少的硬件和适当的软件相互配合可以很容易地实现设计要求,且灵活性强,可以通过软件编程来完成更多的附加功能。本设计采用AT89S52单片机为主控器,以U18949霍尔传感器测距,实现对出租车的多功能的计价设计,输出采用8段数码显示管,显示行驶总里程和总金

2、额,而且还模拟出租车计价器的设计,进行里程显示,预设起步价和起步公里数;行程按单程(双程)收费,有复位功能,启动功能,暂停功能和查询功能,当遇到堵车或等待顾客停下来办事等,在规定的要求下计费,有重要的功能,启动后,开始计价。该出租车计价器应用前景广阔。关键字:出租车计价器 AT89S52单片机 U18949霍尔传感器 8段数码显示目录1 概述1.1 基本功能(1)能显示里程,单位为公里,最后一位为小数位。(2)能显示金额数,单位为元,最后一位为小数位。(3)可设定单程价格和往返价格,单程价格为2元/公里,往返价格为1.5元/公里。(4)车速5公里/小时的时间累积为总等待时间,每5分钟等待时间相

3、当于里程数增加1公里。(5)起步公里数为3公里,价格为5元,若实际距离大于3公里,按规则3计算价格。(6)按暂停键,计价器可暂停计价,按查询键,可显示总等待时间。1.2 基本原理 计价器主要系统有四部分组成:AT89S52 单片机、U18949 霍尔传感器、独立键盘、显示数码管。霍尔传感器安装在车轮上,主要检测汽车行进的公里数,并产生一系列相应的脉冲输出,脉冲送到单片机进行处理,单片机根据程序设定通过计算脉冲数换算出行驶公里数,再根据从EEPROM中读取的价格等相关数据进行金额的计算,计算好的金额、里程和单价都实时地显示在数码管上。独立键盘可以进行单程和双程切换,可以实现路程和等待时间的切换,

4、可以实现清零功能和暂停功能,数码管能同时显示里程数和金额数。2 系统总体方案及硬件设计 2.1系统总体方案计价器的单片机控制方案图如图2-1 系统结构图所示。利用单片机丰富的IO端口,及其控制的灵活性,实现基本的里程计价功能、时间显示控制等功能。不但能实现所要求的功能而且能在很大的程度上扩展功能,而且还可以方便的对系统进行升级。系统结构图如下:图2-1 系统结构图2.2 硬件设计2.2.1 单片机最小系统 主控机系统采用了Atmel 公司生产的 AT89S52单片机,它含有256 字节数据存储器,内置8K 的电可擦除FLASH ROM,可重复编程,大小满足主控机软件系统设计,所以不必再扩展程序

5、存储器。复位电路和晶振电路是AT89S52 工作所需的最简外围电路。单片机最小系统电路图如图2-2-1所示。 AT89S52 的复位端是一个史密特触发输入,高电平有效。RST端若由低电平上升到高电平并持续2个周期,系统将实现一次复位操作。在复位电路中,按一下复位开关就使在RST端出现一段时间的高电平,外接11.0592M 晶振和两个30pF 电容组成系统的内部时钟电路。图 2-2-1 单片机最小系统 2.2.2 U18949 霍尔传感器检测单元 U18949 霍尔传感器属于开关型的霍尔器件,其工作电压范围比较宽(4.518V),其输出的信号符合TTL电平标准,可以直接接到单片机的IO 端口上,

6、而且其最高检测频率可达到1MHZ。里程计算是通过安装在车轮上的霍尔传感器检测到的脉冲信号,送到单片机产生中断,单片机再根据程序设定,计算出里程。本系统选择了将U18949霍尔传感器的脉冲输出口接到P3.2口外部中断0作为信号的输入端(这样可以减少程序设计的麻烦),电机每转一圈,霍尔开关就检测并输出信号,引起单片机的中断,对脉冲计数,当计数达到180次时,即1公里,单片机就控制将金额自动增加。其原理如图 2-2-2所示。 图 2-2-2 传感器示意图 2.2.3 独立键盘控制单元由于调节信息不多,故采用4个独立键盘即可,分别实现清零、切换、单双程切换、暂停等作用。电路原理如图2-2-3所示。 图

7、 2-2-3 独立键盘控制单元S0:接P1.0口,对上一次的计费进行清零,为下次载客准备。S1:接P1.1口,当在行驶过程中不按下,显示路程数,但在停止过程,按下可显示等待时间。S2:接P1.2口,按键不按下表示单程行驶,按键按下表示双程行驶。S3:接P1.3口,按键按下1次表示行驶,按键按下第二次表示暂停。2.2.4 显示单元电路设计由于设计要求有里程、金额、等待时间显示输出,所以采用两个四位LED数码管的分屏显示。显示电路有两个四位LED数码管组成。电路如图2-2-4所示。各个数码管显示内容示意如图2-2-5。 图 2-2-4 显示单元电路图 2-2-5 数码管显示内容示意图3软件设计本系

8、统的软件设计主要可分为主程序模块、定时计数中断程序、里程计数中断服务程序、中途等待中断服务程序、显示子程序服务程序、键盘服务程序六大模块。下面对各部分模块作介绍。3.1 主程序模块在主程序模块中,需要完成对出租车起价和单价的初始化、中断向量的设计以及开中断、循环等待等工作。另外,在主程序模块中还需要设置启动/清除标志寄存器、里程寄存器和价格寄存器,并对它们进行初始化。主程序流程图如图3-1 所示。当按下S3时,就启动计价,将根据里程寄存器中的内容计算和判断出行驶里程是否已超过起价公里数。若已超过,则根据里程值、每公里的单价数和起价数来计算出当前的累计价格,并将结果存于价格寄存器中,然后将时间和

9、当前累计价格送显示电路显示出来。当到达目的地的时候,由于霍尔开关没有送来脉冲信号,就停止计价,显示当前所应该付的金额和对应的单价,到下次启动计价时,系统自动对显示清零,并重新进行初始化过程。图 3-1 主程序流程图3.2 定时中断服务程序在定时中断服务程序中,每1/40s 产生一次中断,当产生40 次中断的时候,也就到了一秒,送数据到相应的显示缓冲单元,并调用显示子程序实时显示。其程序流程如图3-2 所示。图 3-2 定时中断服务 3.2.1 里程计数中断程序 每当霍尔传感器输出一个低电平信号就使单片机中断一次,当里程计数器对里程脉冲计满 180次时,进入里程计数中断服务程序中,里程变量加一。

10、主函数中总金额也相应地变化。3.2.2 中途等待程序 在中途等待中断程序中,每1ms产生一次中断,将当前里程值送入某个缓存变量,每5分钟将缓存变量中的值和当前里程值比较,当汽车停止,霍尔传感器5分钟没有输出信号,当前里程值和缓存变量内的值相同,则进入等待计时,每5分钟记一次价格。3.3 显示服务程序 显示程序利用定时器每1ms产生一次中断,相应变量置位,点亮数码管,显示一位数据,利用主函数内的循环,实现动态扫描显示,同时根据数码管余辉和人眼暂留现象,即可实现显示。数码管在一般情况下显示里程数,价格两项数据,当按下键1时则跳转显示等待时间一项数据。当松开键1时则返回显示里程数,价格两项数据。程序

11、流程图如图3-3:图 3-3 显示服务程序 3.4 计算程序 计算程序根据里程数分别进入不同的计算公式。如果里程大于3公里,则执行公式:总金额=起步价+(里程-3)*单价+等待时间*等待单价;否则,执行公式:总金额=起步价+等待时间*等待单价。3.5 键盘程序键盘采用查询的方式,放在主程序中,当没有按键按下的时候,单片机循环主程序,一旦有按键按下,便转向相应的子程序处理,处理结束再返回。如果按键S3被按下,则将key3_flag标志置0; 表示启动开始。否则表示暂停。如果按键S2被按下,则将key2_flag标志置0; 表示往返开始。否则表示单程开始。如果按键S1被按下,则将key1_flag

12、标志置0, 表示将显示等待时间。否则表示显示 。如果按键S0被按下,里程。则将flag标志置0,t置0;表示将显示数据清空。4 Proteus 软件仿真1.打开Proteus软件。2.选择file菜单下的 open design选项,找到所需的元器件,元器件上单击右键选中,再单击左键对其进行命名和赋值,接着在编辑器左边的一栏中,找出并绘制设计所要的各种元器件,按照电路图连接后并保存。3.将用keil编译产生的hex文件下载到单片机中:双击52单片机,在对话框中把保存过的hex文件打开,再单击确定。 4.单击左下角运行按钮,进行软件仿真调试,直到出现正确的结果。图4-1所示为软件的仿真窗口图:图

13、 4-1 单片机仿真窗口5 课程设计体会经过这些天有关于出租车计价器的课程设计,使我们对单片机的应用有了更深的了解。在课程设计的过程中,还是碰到了许多的问题。比如,对于数码管动态扫描显示和键盘的延时防抖的综合编程不能较好地解决;对于代码的前后顺序及调用掌握得还不够好;对于一些相关的应用软件没能熟练掌握。通过这几天晚上的苦想和反复调试,以及参考网上的程序,最终还是把问题解决了。通过这次课程设计,我们最大的收获就是自己的动手能力和独立解决问题的能力得到了很大的提高,也充分体会到了自己设计东西的乐趣、学会查阅资料和对别人的东西融会变通的重要性,也明白了很多知识光靠趴在书本上学是学不到其中的精髓的,同

14、时也学习仿真软件Protues和编程软件Keil。必须亲自去试着实践,亲自去经历才能对它们真正的掌握,凡事都要自己去动下手,去实践一下,遇到困难,永远不要沮丧气馁。在动手的过程中,不仅能增强实践能力,而且在理论上可以有更深的认识;这次设计给了我们极大的鼓舞和信心,相信在以后的学习中可以通过不断的摸索和实践来提高其他方面的知识。参考文献1余发山、王福忠.单片机原理及应用技术.中国矿业大学出版社,2008.62谭浩强.C程序设计(第二版).清华大学出版社,20033戴 佳.51单片机C语言应用程序设计实例精讲.电子工业出版社,20074胡汉才.单片机原理及其接口技术.北京:清华大学出版社,1995

15、5张毅刚.单片机原理及应用.高等教育出版社,20046潘永雄.新编单片机原理与应用.西安电子科技大学出版社,20037戴梅萼、史嘉权.微型计算机技术与应用.清华大学出版社,20038张淑清等. 单片微型计算机接口技术及其应用 北京:国防工业出版社,20049张靖武.单片机原理 应用与PROTEUS仿真. 电子工业出版社,200610陈明荧.8051单片机课程设计实训教材.北京:清华大学出版社,200411单片机学习网.http:/ 1 源程序代码#include #define uchar unsigned char #define uint unsigned int uchar qianwe

16、i,baiwei,shiwei,gewei; /显示数据各个位置数字的变量 char xscode10=0x3f,0x06,0x05b,0x04f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/段码表示0-9 uint t,sudu,maichong,juli,huafei,danjia,wait,way;/定义路程、价钱、等待时间及一些全局的变量等; uchar dengdai,second,minute;/按键的定义,所有按键按下去为低电平sbit key0=P10; /清零sbit key1=P11; /切换路程与等待时间sbit key2=P12; /单程还是往返设置s

17、bit key3=P13; /暂停按键sbit d0=P15;/指示 sbit d1=P17; sbit d2=P14;sbit d3=P16; bit key1_flag;/由于按键会自动复位,这个为标志位bit key2_flag;bit key3_flag;bit flag; /初始化函数void initial_data(void) juli=0;huafei=0;second=0;minute=0;way=0;key1_flag=1; /显示里程,接指示灯key2_flag=0; /单程or往返,接指示灯;key3_flag=1; /暂停,接指示灯;flag=0;maichong=0

18、;dengdai=0;d0=1; /停车指示d1=1; / 等待时间切换标志d2=1; /双程指示d3=1; /暂停指示 /延时时基为1ms void delay(uint x) int i,j; for(i=x;i0;i-) for(j=150;j0;j-);/定时器初始化 void initial_time() TMOD=0x01;TH0=(65536-25000)/256;TL0=(65536-25000)%256;IE=0x83;IT0=1; /外部边沿触发方式 TR0=1;/ 中断记录脉冲数void zd() interrupt 0 /中断0sudu+;if(flag)maichon

19、g+; /进入中途等待计价 /* 定时器 *void time0() interrupt 1 /定时0TH0=(65536-25000)/256; /timer=1/40sTL0=(65536-25000)%256;t+;if(t=40) /1s采样t=0;sudu=sudu/5; /速度(n*圈/s)if(sudu=5) flag=0;else flag=1;sudu=0;if(!flag) way+; dengdai+; if(dengdai=40) dengdai=0; second+; if(second=60) minute+;second=0; /暂停程序void zanting(

20、void) if(key3_flag) EX0=0; /关闭中断 定时器TR0=0;elseEX0=1;TR0=1; key3_flag=!key3_flag; /计算数据处理 void jisuan()if(maichong180) juli=maichong/6+way/3000;huafei=danjia*(juli-30)/10+50; wait=minute*40+second; /显示的辅助程序,分离一个数的各个数字 void divide(uint bb) /数据的分离处理 if(bb9999) bb=9999;qianwei=bb/1000;baiwei=bb/100%10;s

21、hiwei=bb%100/10;gewei=bb%10; /延时约1ms,数码管显示时使用void diplay_delay(void) uchar i; for(i=0;i240;i+); /显示程序;void xianshi()/-显示路程或者等待时间-if(key1_flag) divide(juli);else divide(wait); P2=0xfe; P0=xscodegewei; diplay_delay(); P2=0xfd; if(key1_flag) P0=xscodeshiwei|0x80; /如果是路程,点亮小数点儿else P0=xscodeshiwei; /如果是

22、时间,不需要点亮小数点儿 diplay_delay();P2=0xfb;if(key1_flag) P0=xscodebaiwei;else P0=xscodebaiwei|0x80; diplay_delay();P2=0xfb7;P0=xscodeqianwei; diplay_delay();/-显示价格-divide(huafei);P2=0xef;P0=xscodegewei; diplay_delay();P2=0xdf;P0=xscodeshiwei|0x80; diplay_delay();P2=0xbf;P0=xscodebaiwei; diplay_delay();P2=0

23、x7f;P0=xscodeqianwei; diplay_delay(); /键盘的扫描 void keyscan() if(key1=0) / 按键消抖并判断按下去的次数为基数还是偶数 delay(10); if(key1=0) key1_flag=!key1_flag; if(key0=0) / 清零 delay(10); if(key0=0) initial_data(); if(key3=0) / 暂停 delay(10); if(key3=0) zanting(); if(key2=0) / 单程or往返 delay(10); if(key2=0) key2_flag=!key2_flag; /指示等扫描 d0=flag; / 指示是否等待; d1=key1_flag; /切换指示,显示路程还是等待时间; d2=!key2_flag; / 指示,单程还是往返,灯低电平点亮; 往返亮; d3=key3_flag; / 指示,暂停时亮; diplay_delay(); /主程序 void main(void) initial_data(); /初始化数据 initial_time(); /初始化定时器 while(1) keyscan();jisuan(); xianshi();附 2 系统原理图

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1