单片机课程设计论文出租车计价器.docx
《单片机课程设计论文出租车计价器.docx》由会员分享,可在线阅读,更多相关《单片机课程设计论文出租车计价器.docx(31页珍藏版)》请在冰豆网上搜索。
![单片机课程设计论文出租车计价器.docx](https://file1.bdocx.com/fileroot1/2022-11/25/9810adde-be54-433e-b0b0-5cf39259e406/9810adde-be54-433e-b0b0-5cf39259e4061.gif)
单片机课程设计论文出租车计价器
河南理工大学
《单片机应用与仿真训练》设计报告
基于单片机的出租车计价器的设计
摘要
本设计采用AT89S52单片机为主控器,并用霍尔传感器检测电机转盘转动模拟车速,实现对出租车的多功能的计价设计,输出采用8段数码显示管。
本电路设计的计价器可以实现要单程,往返和中途等待来调节计费,并且能够记录等待时间。
出租车计价是根据车所行驶的路程以及乘客乘车的方式综合决定的。
出租车行驶总路程可以通过车轮的周长乘车轮旋转圈数得到。
即可计算得到车轮旋转几周出租车能行驶一公里的路程。
使用霍尔传感器方便地计量车轮旋转的圈数。
输出的脉冲信号被接入到AT89S52单片机系统中,通过计算接收到的脉冲个数,计算出当前所行驶的路程,并且可以计算实时的速度,在速度低于5公里每小时是进入等待计费。
于此同时,根据不同的收费标准,通过选择相应的起步价、单价等收费标准进行计算。
通过键盘能够实现往返设置,启动、暂停、停止计价器以及切换显示当前的行驶里程和需支付的车费。
本设计硬件电路总体可以分为五个单元:
单片机最小系统单元,指示灯电路单元,按键电路单元,路程时间与金额显示单元,转速信号接收单元。
软件系统可以大致分为五个大的模块为:
总初始化模块,按键扫描模块,中断与定时模块,数据计算模块,数码管显示模块。
其中,键盘扫描和数码管显示采用查询方式,转速信号接收与等待记时采用中断方式。
这些软硬件系统构成了最终的设计。
关键词单片机霍尔传感器出租车计价器
1概述
1.1设计目的、意义
租车计价器技术也在不断进步和提高。
国内出租车计价器已经经历了4个阶段的发展。
从传统的全部由机械元器件组成的机械式,到半电子式即用电子线路代替部分机械元器件的出租车计价器;再从集成电路式到目前的单片机系统设计的出租车计价器。
出租车计价器计费是否准确、出租车司机是否作弊才是乘客最关心的问题,而计价器营运数据的管理是否方便才是出租车司机最关注的。
因此怎样设计出一种既能有效防止司机作弊又能方便司机的计价器尤为重要。
因此,本文以单片机AT89S52为核心设计一款多功能出租车计价器,该计价器能实现按时间和里程综合计算车价,能显示时间、里程、单价、总车价等相关信息显示。
它比市场上的一些计价器使用更方便,功能更全,还具有有效防止司机作弊和系统稳定性好的优点。
本次设计的目的在于现在各大中城市出租车行业都已普及自动计价器,所以计价器技术的发展已成定局。
采用模拟电路和数字电路设计的计价器整体电路的规模较大,用到的器件多,造成故障率高,难调试。
而采用单片机进行的设计,相对来说功能强大,是深化单片机应用的良好途径,用较少的硬件和适当的软件相互配合可以很容易地实现设计要求,且灵活性强,可以通过软件编程来完成更多的附加功能。
1.2AT89S52单片机功能简介
计算机系统已明显地朝巨型化、单片化、网络化三个方向发展。
巨型化发展的目的在于不断提高计算机的运算速度和处理能力,以解决复杂系统计算和高速数据处理,比如系统仿真和模拟、实时运算和处理。
单片化是把计算机系统尽可能集成在一块半导体芯片上,其目的在于计算机微型化和提高系统的可靠性,这种单片计算简称单片机。
单片机的内部硬件结构和指令系统主要是针对自动控制应用而设计的,所以单片机又称微控制器MCU(MicroControllerUnit)。
用它可以很容易地将计算机嵌入到各种仪器和现场控制设备中,因此单片机又叫做嵌入式微控制器(EmbeddedMCU)。
单片机自20世纪70年代问世以来,以其鲜明的特点得到迅猛发展,已广泛应用于家用电器、智能玩具、智能仪器仪表、工业控制、航空航天等领域,经过30多年的发展,性能不断提高,品种不断丰富,已经形成自动控制的一支中坚力量。
据统计,我国的单片机年容量已达1~3亿片,且每年以大约16%的速度增长,但相对于国际市场我国的占有率还不到1%。
这说明单片机应用在我国有着广阔的前景。
对于从事自动控制的技术人员来讲,掌握单片机原理及其应用已经成为必不可少的学习任务。
单片机的应用十分广泛,在工业控制领域、家电产品、智能化仪器仪表、计算机外部设备,特别是机电一体化产品中,都有重要的用途。
其主要的用途可以分为以下方面:
显示:
通过单片机控制发光二极管或是液晶,显示特定的图形和字符。
机电控制:
用单片机控制机电产品做定时或定向的动作。
检测:
通过单片机和传感器的联合使用,用来检测产品或者工况的意外发生。
通信:
通过RS-232串行通信或者是USB通信,传输数据和信号。
科学计算:
用来实现简单的算法。
那么单片机是不是解决上述应用的唯一选择呢?
淡然不是!
目前,在自动控制中,一般有三种选择,分别是嵌入式微机、DSP和单片机。
单片机最明显的优点是价格便宜,从几元人民币到几十元人民币。
这是因为这类芯片的生产量很大,技术也很成熟。
其次,单片机的体积也远小于其他两种方案。
单片机本身一般用40引脚封装,当然功能多一些的单片机也有引脚比较多的,如68引脚,功能少的只有10多个或20多个引脚,有的甚至只有8只引脚。
当然,单片机无论在速度还是容量方面都小于其他两种方案,但是在实际工作中并不是任何需要计算机的场合都要求计算机有很高的性能。
例如,控制电冰箱的控制器就不需要使用嵌入式系统,用一片51就可以轻松实现。
所以应用的关键是看能否够用,是否有很好的性能价格比。
51系列的单片机已经面世十多年,依然没有被淘汰,还在不断发展中,这就说明是他有广阔的应用前景。
2.系统总体方案设计及硬件设计
2.1设计要求
(1)能显示里程,单位为公里,最后一位为小数位。
(2)能显示金额数,单位为元,最后一位为小数位。
(3)可设定单程价格和往返价格,单程价格为2元/公里,往返价格为1.5元/公里。
(4)车速<5公里/小时的时间累积为总等待时间,每5分钟等待时间相当于里程数增加1公里。
(5)起步公里数为3公里,价格为5元,若实际距离大于3公里,按规则3计算价格。
(6)按暂停键,计价器可暂停计价,按查询键,可显示总等待时间。
2.2设计参数
由于要求没有给出车轮的相关参数,所以这里进行一些基本参数的查询。
据调查统计,现行出租车轮胎直径大致有四种,直径分别为520mm、540mm、560mm和580mm.
本作品针对560mm的出租车进行设计。
它的周长为:
1.7584m,57圈行驶100m.
2.3方案的选取
本设计可以分为五个单元,单片机最小系统单元,指示灯电路单元,按键电路单元,路程时间与金额显示单元,转速信号接收单元,如下图:
2.4硬件设计
本设计的硬件设计包括单片机AT89S52单元、测距单元、显示单元(数码管显示金额、等待时间和里程)、按键与指示单元(指示灯对单双程切换指示、暂停、等待指示)。
2.4.1AT89S52单片机及最小系统
单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统。
对51系列单片机来说,最小系统一般应该包括:
单片机、晶振电路、复位电路。
AT89S52具有如下特点:
40个引脚,4kBytesFlash片内程序存储器,128bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。
P0口有二个功能:
1、外部扩展存储器时,当做数据/地址总线。
2、不扩展时,可做一般的I/O使用,但内部无上拉电阻,作为输入或输出时应在外部接上拉电阻。
P1口只做I/O口使用:
其内部有上拉电阻。
P2口有两个功能:
1、扩展外部存储器时,当作地址总线使用。
2、做一般I/O口使用,其内部有上拉电阻。
P3口有两个功能:
除了作为I/O使用外(其内部有上拉电阻),还有一些特殊功能,由特殊寄存器来设置。
图2AT89S52引脚图图3AT89S52封装图
设计中用到的单片机各管脚(图2)功能以及与其他模块连接介绍如下:
VCC:
接+5V电源。
VSS:
接地。
时钟引脚:
XTAL1和XTAL2两端接晶振和30PF的电容,构成时钟电路。
它可以使单片机稳定可靠的运行。
RST:
复位信号输入端,高电平有效。
当在此引脚加两个机器周期的高电平时,就可以完成复位操作。
P1.0:
接功能按键。
P1.1:
接切换键,表示单双程切换。
P1.2:
接查询(上次金额)键。
P1.3:
接清零键。
P1.4:
接空车指示灯。
P1.5:
接查询指示灯。
P1.6:
接开始计时指示灯。
P1.7:
接双程指示灯。
P3.0:
接查询/确认键。
P0口接数码管段选端,P2口接数码管位选段。
P3.2:
接霍尔传感器的输出口。
P3.3:
接存储器的SCL口。
P3.4:
接储存器的SDA口。
P3.5:
接时钟电路DS1302的RST口。
P3.6:
接DS1302的SCLK口。
P3.7:
接DS1302的I/O口。
复位电路和晶振电路是AT89S52工作所需的最简外围电路。
单片机最小系统电路图如图4所示。
图4单片机最小系统
AT89S52的复位端是一个史密特触发输入,高电平有效。
RST端若由低电平上升到高电平并持续2个周期,系统将实现一次复位操作。
在复位电路中,按一下复位开关就使在RST端出现一段时间的高电平,外接12M晶振和两个30pF电容组成系统的内部时钟电路。
2.4.2测距单元
本次设计我们选取了霍尔传感器来进行里程测量。
霍尔器件是一种磁传感器。
用它们可以检测磁场及其变化,可在各种与磁场有关的场合中使用。
霍尔器件以霍尔效应为其工作基础。
霍尔器件具有许多优点,它们的结构牢固,体积小,重量轻,寿命长,安装方便,功耗小,频率高,耐震动,不怕灰尘、油污、水汽及盐雾等的污染或腐蚀。
霍尔器件分为:
霍尔元件和霍尔集成电路两大类,前者是一个简单的霍尔片,使用时常常需要将获得的霍尔电压进行放大。
后者将霍尔片和它的信号处理电路集成在同一个芯片上。
本次设计选取了霍尔集成电路来测量里程。
里程测量是通过将霍尔传感器的集成电路安装在车轮上方的铁板上,将磁铁安装在车轮上,旋转的车轮将磁铁对准集成电路时,霍尔传感器会输出一个脉冲信号,送到单片机,经过单片机的计算处理,将行驶的里程送到显示单元并显示出来。
其原理示意图如下:
图5传感器测距示意图
A44E是一种利用霍尔效应做成的半导体集成电路器件,它被设计在交变磁场中运行,特别是能在低电源电压和长时间运行温度范围可达到125℃。
这种霍尔IC可用作各种类型的传感器(速度传感器、位移传感器、转速传感器等等),接触开关以及相类似的应用场合。
其工作电压比较宽(2.5~20V),可运行在较大的温度范围内(-20℃~125℃),其输出的信号符合TTL电平标准,可以直接接到单片机的IO端口上,而且其最高检测频率可达到1MHZ。
霍尔传感器的特性如图6所示,其中BOP为工作点“开”的磁感应强度,BRP为释放点“关”的磁感应强度。
当外加的磁感应强度超过动作点BOP时,传感器输出低电平,当磁感应强度降到动作点BOP以下时,传感器输出电平不变,一直要降到释放点BRP时,传感器才由低电平跃变为高电平。
BOP与BRP之间的滞后使开关动作更为可靠。
图6A44E霍尔传感器和其输出特性
A44E霍尔传感器有3个外接口,2个是电源的正负极接口,最后一个是脉冲信号输出口,只要将霍尔传感器的信号输出端接到单片机的端口上便可以实现距离检测。
其中,单片机的P3.2(INT0)引脚作为信号的输入端,采用外部中断0进行计数。
车轮每转一圈,霍尔传感器就产生一个脉冲信号,根据霍尔效应原理,当霍尔片处在磁场中时,霍尔传感器的输出端输出低电平。
当车轮转动一圈时小磁铁提供一个磁场,则霍尔传感器输出一次低电平完成一次数据采集,从而产生信号。
霍尔传感器检测并输出信号到单片机的INT0或INT1计算脉冲输入端,引起单片机的中断,对脉冲计数,当计数达到特定的次数时,里程就会增加,单片机对里程进行计算后,通过接口电路将计算好的结果传送到数码管并显示出来。
2.4.3显示单元
本设计采用两个四个一组的共阴八位数码管来显示,一组显示金额,另一组显示路程与等待时间配合按键来切换。
数据端都用单片机P1口,片选端分别接在P2口的高四位和低四位。
它们的连线如下:
2.4.4键盘与指示单元
本设计按照功能要求设置了四个按键和四个LED灯。
(1)按键说明如下:
key0系统清零,用来将整个计费系统的显示清零;
key1显示切换,用来切换路程与等待时间的显示;
key2单程双程,用来设置是单程还是往返计费;
key3系统暂停,用来将整个计费系统暂停;
(2)指示灯说明如下:
led1指示单程还是双程,当选择双程计费时亮;
led2指示系统暂停与否,当选择暂停时亮;
led3指示是否进入等待计费,计入等待计费时亮;
led4指示显示的是路程还是等待时间,显示等待时间时亮。
3软件设计
3.1总体流程
本设计中,软件系统可以大致分为五个大的模块为:
总初始化模块,按键扫描模块,中断与定时模块,数据计算模块,数码管显示模块。
其中,键盘扫描和数码管显示采用查询方式,转速信号接收与等待记时采用中断方式。
3.2计算模块
计算程序根据里程数分别进入不同的计算公式。
如果里程大于3公里,则执行公式:
总金额=起步价+(里程-3)*单价+等待时间*等待单价;否则,执行公式:
总金额=起步价+等待时间*等待单价。
对于里程数采用外部中断零来记录,车轮没转一周,霍尔传感器发一个脉冲然后进入中断子程序,对相应的变量进行更新。
对于速度的判断及等待时间的记录采用定时器零中断,设定10ms一个中断,然后判断车速,小于5公里/小时时,则开始记录等待时间。
3.3键盘扫描
键盘扫描才用查询方式,当有按键按下时就对相应的标志进行取反,或调用其他子函数,在消抖过程中,这里将数码管显示程序潜入以保证显示的稳定。
3.4显示程序
显示程序利用主函数内的循环,实现动态扫描显示,同时根据数码管余辉和人眼暂留现象,即可实现显示。
本设计采用两个四个一组的八位数码管来显示,一组显示金额,另一组显示路程与等待时间配合按键来切换。
数据端都用单片机P1口,片选端分别接在P2口的高四位和低四位。
4Proteus软件仿真
本设计需要用KeiluVision3对C51程序进行编译,生成“.hex”文件。
在Proteus软件中画出仿真电路(如图19),把KeiluVision3编译后生成的“.hex”导入到单片机中,按“运行仿真”键进行仿真
如图显示的状态设置为:
单程,车速大于5km/h,当路程等于7.2km时的显示情况。
5课程设计体会
在本次单片机课程设计中,我们选择的题目是基于51单片机的出租车计价器的设计。
老师统一配发的主控芯片是AT89S52单片机,要实现的计价器的基本功能是以按键为输入控制方式,实现对出租车运行过程中状态信息的测量,主要包括等待时间、金额和里程等,并将其显示出来。
经一个星期的努力我们完成了所有的基本功能,在完成整个课程设计的过程中,我们遇到了许多困难,但在解决困难的同时,也收获了许多,现在就将在整个课程设计过程中的几点收获与体会总结如下:
1、提高了单片机的C语言编程能力。
虽然单片机原理这门课程是在上学期修的,之后的这段时间也没有使用单片机实际的做一些设计,因为当时是用汇编语言学习的单片机,对C语言的编程方法不是很熟悉。
因此,选题后我们使用郭天祥的《新概念51单片机设计》开始练习51单片机的C程序设计,一开始我们总想一下子把整个程序写完(随着更深入的学习后来发现这种想法是不对的),因而使自己的自信心很受挫。
在这里我们得到的经验是使程序模块化:
将一个大的程序分为几个主要模块,分别完成,最后再组合在一起调试成功。
2、使我们对硬件电路的分析及设计能力有了不小的进步。
本设计的硬件设计包括单片机AT89S52单元、测距单元、显示单元、按键与指示单元。
通过上网查找相关资料,虽然找到了比较合适的电路图,但因为对其原理理解的不是特别透彻,在实际的焊接过程中遇到了不少的困难,比如没有共地、缺少滤波电容、电源压降太大、缺少下拉电阻,焊接中焊点虚焊和短路等。
在这里我们得到的经验是:
拿到一个电路图之后要对其进行深入的分析,了解其原理,并修改其错误,同时在焊接的过程中一定要细心、耐心,只有不停的分析电路,查找故障,久而久之我们才能成为一个很好的设计者。
3、增强了我们的团队意识。
在整个设计的过程中,我们之间发生了不少的争执,在设计硬件电路时,我们对电路图的选择持有不同意见,在焊接过程中我们对整体布局布线也有过争议,在程序编写过程中对算法的选取,流程的设计也各持己见。
由于我们各自的过分,坚持导致了一些不必要的时间浪费。
在这里我们得到的经验是:
在合作的过程中要善于聆听对方的一间,要发现别人的长处,弥补自己的不足。
一个团队只有能够相互取长补短,才能够在愉快的合作中更好得完成任务。
4、不要过于追求实物的产品化。
在做课程设计的过程中,由于我们一开始考虑了许多复杂细小的情况,导致我们不知道从哪里开始入手,产生了许多不必要的麻烦。
我们得到的经验是:
遇到问题要抓主要矛盾,解决主要矛盾(实现基本功能)之后,再去考虑其他的细节问题。
遇到问题不要只想,试着动手做就有思路了。
参考文献
【1】郭天祥.新概念51单片机C语言教程.电子工业出版社,2008
【2】余发山,王福忠.单片机原理及应用技术.中国矿业大学出版社,2008.6
【3】侯玉宝,陈忠平,李成群.基于Proteus的51系列单片机设计与仿真.电子工业出版社,2008
【4】李泉溪.单片机原理与应用实例仿真.北京航空航天大学出版社,2009
【5】谭浩强.C程序设计.清华大学出版社,1991
【6】楼然苗,胡佳文,李光飞等.单片机实验与课程设计.浙江大学出版社,2010.10
【7】王晓敏.传感器检测技术及应用.北京大学出版社,2010
【8】吴红星.电机驱动与控制专用集成电路及应用.中国电力出版社,2006
附1:
源程序代码
//"里程和价格显示程序"
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#definesomenop{_nop_();_nop_();_nop_();_nop_();_nop_();}
#defineSlaveAddrW0xA0//"写命令"
#defineSlaveAddrR0xA1//"读命令"
//"IIC总线引脚定义"
sbitSDA=P1^0;//"数据线"//
sbitSCL=P1^1;//"时钟线"//
//"语音芯片定义"
sbitSS=P1^3;//"片选"
sbitMOSI=P1^4;//"数据输入"
sbitMISO=P1^5;//"数据输出"
sbitSCLK=P1^6;//"ISD4004时钟"
sbitls138A=P2^0;//"138译码器的3个位选,A为低位"
sbitls138B=P2^1;
sbitls138C=P2^2;
sbitkds=P2^3;//"单双程控制开关"
sbitkks=P2^4;//"开始控制开关"
sbitkcx=P2^5;//"查询控制开关"
sbitkzt=P2^6;//"暂停控制开关"
sbitkql=P2^7;//"清零控制开关"
sbitkjy=P1^2;//"上次记忆值查询"
//"变量定义"
ucharcodeduanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//"数码管段码"
uintcount,num0,k,zhuan,z,su,n;
floatgong,quan,jin,deng;
ucharqiane,baie,shie,gee;//"金额的千,百,十,个"
ucharqianc,baic,shic,gec;//"路程的千,百,十,个"
//"函数声明"
voiddisplay(floatcheng,floate,bitbiao);
//"24C02函数声明"
voidIIC_Start(void);
voidIIC_Stop(void);
voidIIC_Ack(bitackbit);
voidIIC_SendByte(unsignedcharbyt);
bitIIC_WaitAck(void);
unsignedcharIIC_RecByte(void);
voidWrite(ucharadd,uchardat);
uintRead(ucharadd);
/////////////"24c02操作函数"//////////////
//"总线启动条件"
voidIIC_Start(void)
{
SDA=1;
SCL=1;
somenop;
SDA=0;
somenop;
SCL=0;
}
//"总线停止条件"
voidIIC_Stop(void)
{
SDA=0;
SCL=1;
somenop;
SDA=1;
}
//"应答位控制"
voidIIC_Ack(bitackbit)
{
if(ackbit)
{
SDA=0;
}
else
{
SDA=1;
}
somenop;
SCL=1;
somenop;
SCL=0;
SDA=1;
somenop;
}
//"等待应答"
bitIIC_WaitAck(void)
{
SDA=1;
somenop;
SCL=1;
somenop;
if(SDA)
{
SCL=0;
IIC_Stop();
return0;
}
else
{
SCL=0;
return1;
}
}
//"通过I2C总线发送数据"
voidIIC_SendByte(unsignedcharbyt)
{
unsignedchari;
for(i=0;i<8;i++)
{
if(byt&0x80)
{
SDA=1;
}
else
{
SDA=0;
}
somenop;
SCL=1;
byt<<=1;
somenop;
SCL=0;
}
}
//"从I2C总线上接收数据"
unsignedcharIIC_RecByte(void)
{
unsignedcharda;
unsignedchari;
for(i=0;i<8;i++)
{
SCL=1;
somenop;
da<<=1;
if(SDA)
da|=0x01;
SCL=0;
somenop;
}
returnda;
}
voidWrite(uc