基于51单片机的出租车计价器带仿真及程序Word格式.docx
《基于51单片机的出租车计价器带仿真及程序Word格式.docx》由会员分享,可在线阅读,更多相关《基于51单片机的出租车计价器带仿真及程序Word格式.docx(28页珍藏版)》请在冰豆网上搜索。
其主要的用途可以分为以下方面。
单片机的应用十分广泛,在工业控制领域、家电产品、智能化仪器仪表、计算机外部设备,特别是机电一体化产品中,都有重要的用途。
●显示:
通过单片机控制发光二极管或是液晶,显示特定的图形和字符。
●机电控制:
用单片机控制机电产品做定时或定向的动作。
●检测:
通过单片机和传感器的联合使用,用来检测产品或者工况的意外发生。
●通信:
通过RS-232串行通信或者是USB通信,传输数据和信号。
●科学计算:
用来实现简单的算法。
那么单片机是不是解决上述应用的唯一选择呢?
当然不是!
单片机最明显的优点是价格便宜,从几元人民币到几十元人民币。
这是因为这类芯片的生产量很大,技术也很成熟。
其次,单片机的体积也远小于其他两种方案。
单片机本身一般用40引脚封装,当然功能多一些的单片机也有引脚比较多的,如68引脚,功能少的只有10多个或20多个引脚,有的甚至只有8只引脚。
当然,单片机无论在速度还是容量方面都小于其他两种方案,但是在实际工作中并不是任何需要计算机的场合都要求计算机有很高的性能。
例如,控制电冰箱的控制器就不需要使用嵌入式系统,用一片51就可以轻松实现。
所以应用的关键是看能否够用,是否有很好的性能价格比。
51系列的单片机已经面世十多年,依然没有被淘汰,还在不断发展中,这就说明是它有广阔的应用前景。
2总体方案设计
本次设计是使用单片机技术来实现一个出租车的数字计价器,利用单片机丰富的IO端口,及其控制的灵活性,实现基本的里程计价功能和单双程价格调整、时钟显示功能等等。
具有性能可靠,电路简单、成本低、扩展空间大等特点。
2.1设计任务要求
2.1.1设计任务
设计一款基于AT89S52单片机的出租车数字计价器,通过对传感器的检测,对数值进行处理和显示。
2.1.2设计要求
一、基本要求
(1)能显示里程,单位为公里,最后一位为小数位。
(2)能显示金额数,单位为元,最后一位为小数位。
(3)可设定单程价格和往返价格,单程价格为2元/公里,往返价格为1.5元/公里。
(4)起步公里数为3公里,价格为5元,若实际距离大于3公里,按规则3计算价格。
(5)按暂停键,计价器可暂停计价,按查询键,可显示总等待时间。
二、发挥部分
(1)增加了空车指示功能,当无客人时,按下功能切换按键,空车指示灯亮。
(2)增加实时时间显示,无论计价器工作或者空车,都能显示实时时间,便于时间提醒。
(3)增加信息储存功能。
可以储存等待时间,里程和金额。
2.2设计的主要功能
本设计所设计的出租车数字计价器的主要功能有:
金额输出、路程输出、数据复位、计时计价、空车显示等。
输出采用LCD12864液晶显示屏显示。
2.3方案的选取
本设计是由软件设计和硬件设计两部分组成的。
软件设计要进行程序的编写和软件仿真;
硬件设计要设计电路、硬件仿真和制作电路板。
2.3.1硬件设计方案
本系统的硬件设计主要包括单片机AT89S52、数据显示部件、U18霍尔传感器电路、里程计算及计价单元的设计。
在硬件设计过程中,充分利用各部件的功能,实现多功能的出租车计价器设计。
计价器的单片机系统框图如图2-1所示。
它由以下几个部件组成:
霍尔传感器单元、AT89S52单片机、金额显示、里程显示、电源。
利用单片机丰富的IO端口,及其控制的灵活性,实现基本的里程和价格的计算及显示功能。
图2-1计价器系统框图
2.3.2软件设计方案
本设计程序的采取C语言进行编写,使用KeiluVision4编译和Proteus7.4a仿真软件进行仿真调试。
其中的里程计算和费用计算方案如下。
1、里程计算
(1)霍尔传感器对车轮进行信号检测,产生并输出脉冲信号到单片机;
(2)单片机对传感器输出的脉冲信号进行计数,并进行km计算:
每一个信号代表轮胎旋转一周,设轮胎的周长为2m;
每km产生的信号数为500,里程显示为N×
2m=2N(km)
2、费用计算
(1)出租车的起步费为5元,并且3km内不需额外计价;
(2)出租车行驶3km后,单程2元/km,双程1.5元/km。
(3)等待收费的标准为5分钟算一公里;
(4)暂停时计价器暂停计价,不收费用。
3硬件设计
本设计的硬件设计包括单片机AT89S52单元、测距单元、显示单元(数码管显示金额、等待时间和里程,指示灯对单双程切换指示、空车指示、等待计时指示)、按键单元、时钟单元和储存单元。
3.1AT89S52单片机及最小系统
1、AT89S52单片机
AT89S52具有如下特点:
40个引脚,8kBytesFlash片内程序存储器,256bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,3个16位可编程定时计数器,全双工串行口,看门狗(WDT)电路,片内时钟振荡器。
图3-1AT89S52引脚图
P0口有二个功能:
1、外部扩展存储器时,当做数据/地址总线。
2、不扩展时,可做一般的I/O使用,但内部无上拉电阻,作为输入或输出时应在外部接上拉电阻。
P1口只做I/O口使用:
其内部有上拉电阻。
P2口有两个功能:
1、扩展外部存储器时,当作地址总线使用。
2、做一般I/O口使用,其内部有上拉电阻。
P3口有两个功能:
除了作为I/O使用外(其内部有上拉电阻),还有一些特殊功能,由特殊寄存器来设置。
设计中用到的单片机各管脚(图3-1)功能以及与其他模块连接介绍如下:
VCC:
接+5V电源。
VSS:
接地。
时钟引脚:
XTAL1和XTAL2两端接晶振和30PF的电容,构成时钟电路。
它可以使单片机稳定可靠的运行。
RST:
复位信号输入端,高电平有效。
当在此引脚加两个机器周期的高电平时,就可以完成复位操作。
P1.0:
接功能按键。
P1.2:
接空车指示灯。
P0口接显示屏数据口,P2口接显示屏控制口。
P3.4:
接霍尔传感器的输出口。
P3.5:
接时钟电路DS1302的RST口。
P3.6:
接DS1302的SCLK口。
P3.7:
接DS1302的I/O口。
2、单片机最小系统
复位电路和晶振电路是AT89S52工作所需的最简外围电路。
单片机最小系统电路图如图3-2所示。
图3-2单片机最小系统
AT89S52的复位端是一个史密特触发输入,高电平有效。
RST端若由低电平上升到高电平并持续2个周期,系统将实现一次复位操作。
在复位电路中,按一下复位开关就使在RST端出现一段时间的高电平,外接11.0592M晶振和两个30pF电容组成系统的内部时钟电路。
3.2测距单元
本次设计我们选取了霍尔传感器来进行里程测量。
霍尔器件是一种磁传感器。
用它们可以检测磁场及其变化,可在各种与磁场有关的场合中使用。
霍尔器件以霍尔效应为其工作基础。
霍尔器件具有许多优点,它们的结构牢固,体积小,重量轻,寿命长,安装方便,功耗小,频率高,耐震动,不怕灰尘、油污、水汽及盐雾等的污染或腐蚀。
霍尔器件分为:
霍尔元件和霍尔集成电路两大类,前者是一个简单的霍尔片,使用时常常需要将获得的霍尔电压进行放大。
后者将霍尔片和它的信号处理电路集成在同一个芯片上。
本次设计选取了霍尔集成电路来测量里程。
里程测量是通过将霍尔传感器的集成电路安装在车轮上方的铁板上,将磁铁安装在车轮上,旋转的车轮将磁铁对准集成电路时,霍尔传感器会输出一个脉冲信号,送到单片机,经过单片机的计算处理,将行驶的里程送到显示单元并显示出来。
其原理示意图如下:
图3-3传感器测距示意图
U18是一种利用霍尔效应做成的半导体集成电路器件,它被设计在交变磁场中运行,特别是能在低电源电压和长时间运行温度范围可达到125℃。
这种霍尔IC可用作各种类型的传感器(速度传感器、位移传感器、转速传感器等等),接触开关以及相类似的应用场合。
其工作电压比较宽(2.5~20V),可运行在较大的温度范围内(-20℃~125℃),其输出的信号符合TTL电平标准,可以直接接到单片机的IO端口上,而且其最高检测频率可达到1MHZ。
霍尔传感器的特性如图3-4所示,其中BOP为工作点“开”的磁感应强度,BRP为释放点“关”的磁感应强度。
当外加的磁感应强度超过动作点BOP时,传感器输出低电平,当磁感应强度降到动作点BOP以下时,传感器输出电平不变,一直要降到释放点BRP时,传感器才由低电平跃变为高电平。
BOP与BRP之间的滞后使开关动作更为可靠。
U18集成霍耳开关由稳压器A、霍耳电势发生器(即硅霍耳片)B、差分放大器C、施密特触发器D和OC门输出E五个基本部分组成。
在输入端输入电压VCC,经稳压器稳压后加在霍尔电势发生器的两端,根据霍尔效应原理,当霍尔片处在磁场中时,在垂直于磁场的方向通以电流,则与这二者相垂直的方向上将会产生霍尔电势差VH输出,该VH信号经放大器放大后送至施密特触发器整形,使其成为方波输送到OC门输出。
当施加的磁场达到工作点(即Bop)时,触发器输出高电压(相对于地电位),使三极管导通,此时OC门输出端输出低电压,三极管截止,使OC门输出高电压,这种状态为关。
这样两次电压变换,使霍尔开关完成了一次开关动作。
图3-4U18霍尔传感器和其输出特性
U18霍尔传感器有3个外接口,2个是电源的正负极接口,最后一个是脉冲信号输出口,只要将霍尔传感器的信号输出端接到单片机的端口上便可以实现距离检测。
其中,单片机的P3.2(INT0)引脚作为信号的输入端,采用外部中断0进行计数。
车轮每转一圈,霍尔传感器就产生一个脉冲信号,根据霍尔效应原理,当霍尔片处在磁场中时,霍尔传感器的输出端输出低电平。
当车轮转动一圈时小磁铁提供一个磁场,则霍尔传感器输出一次低电平完成一次数据采集,从而产生信号。
霍尔传感器检测并输出信号到单片机的INT0或INT1计算脉冲输入端,引起单片机的中断,对脉冲计数,当计数达到特定的次数时,里程就会增加,单片机对里程进行计算后,通过接口电路将计算好的结果传送到数码管并显示出来。
3.3按键单元
本设计的按键单元电路(如图3-5)仅有一个功能按键,也就是是否计价控制键,其功能是开启计价模式,并控制空车指示灯的亮灭。
3.4时钟单元
本设计采用基于DS1302的时钟电路(如图3-6)对时间进行实时显示,单片机掉电对其没有影响。
用数码管表现出来,当出租车空车时就显示时间,给人时间提示。
图3-6时钟电路单元
3.5显示单元
本次课程设计采用的是LCD12864液晶显示屏,其功能十分强大,液晶显示屏(LCD)用于数字型钟表和许多便携式计算机的一种显示器类型。
1、液晶和液晶显示
LCD显示使用了两片极化材料,在它们之间是液体水晶溶液。
电流通过该液体时会使水晶重新排列,以使光线无法透过它们。
因此,每个水晶就像百叶窗,既能允许光线穿过又能挡住光线。
液晶显示器(LCD)目前科技信息产品都朝着轻、薄、短、小的目标发展,在计算机周边中拥有悠久历史的显示器产品当然也不例外。
在便于携带与搬运为前题之下,传统的显示方式如CRT映像管显示器及LED显示板等等,皆受制于体积过大或耗电量甚巨等因素,无法达成使用者的实际需求。
而液晶显示技术的发展正好切合目前信息产品的潮流,无论是直角显示、低耗电量、体积小、还是零辐射点,都能让使用者享受最佳的视觉环境。
这种显示器件的最大特点是:
(1)
微功耗,每个显示字符只有几个毫安。
是所有显示器件中功耗最小的。
(2)
低压驱动,一般扭曲向列型(TN)器件阀值电压仅1.5-2V,可以直接与大规模集成电路直接匹配。
(3)
平板形结构,尺寸可以很大,也可以很小。
显示的有效面积相对来说也是比较大的。
显示图案的自由度也相当大
(4)
液晶显示器件属于被动型,不发光,靠调制外界光达到显示目的。
因此,在阳光下也能看的很清楚,既没有刺目感,也不会引起视觉疲劳,更没有射线辐射,伤害视力。
所以它是高信息量信息显示的理想器件。
(5)液晶显示器件虽然所需材料都有特殊、较高的要求,但是其结构简单,而且工艺非常适应现代化规模生产。
所以其生产成本不高。
正因为它具有这些特点,所以在一切小型、便携、数字、智能化仪表中具有最大竞争力;
在大信息量、彩色化、微型及巨型显示领域,液晶显示器件也具有很大的潜力。
2、液晶显示器各种图形的显示原理
(1)线段的显示
点阵图形式液晶由M×
N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×
8=128个点组成,屏上64×
16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。
例如屏的第一行的亮暗由RAM区的
000H——00FH的16字节的内容决定,当(000H)=FFH时,则屏幕的左上角显示一条短亮线,长度为8个点;
当(3FFH)=FFH时,则屏幕的右下角显示一条短亮线;
当(000H)=FFH,(001H)=00H,(002H)=00H,„„(00EH)=00H,(00FH)=00H时,则在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线。
这就是LCD显示的基本原理。
(2)字符的显示
用LCD显示一个字符时比较复杂,因为一个字符由6×
8或8×
8点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为“1”,其它的为“0”,为“1”的点亮,为“0”的不亮。
这样一来就组成某个字符。
但由于内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显示的行列号及每行的列数找出显示RAM对应的地址,设立光标,在此送上该字符对应的代码即可。
汉字的显示
汉字的显示一般采用图形的方式,事先从微机中提取要显示的汉字的点阵码(一般用字模提取软件),每个汉字占32B,分左右两半,各占16B,左边为1、3、
5„„右边为2、4、6„„根据在LCD上开始显示的行列号及每行的列数可找出显示RAM对应的地址,设立光标,送上要显示的汉字的第一字节,光标位置加
1,送第二个字节,换行按列对齐,送第三个字节„„直到32B显示完就可以LCD上得到一个完整汉字。
4软件设计
本系统的软件设计主要分为系统主程序、数据处理子程序、和键盘扫描子程序四个模块,下面对每一块进行介绍。
4.1系统主程序
本设计中,软件设计采用模块化操作,利用各个模块之间的相互联系,在设计中采用主程序调用各个子程序的方法,使程序通俗易懂,我们设计了整体程序流程图。
在main函数编写开始,要进行初始化,包括对系统初始化和对硬件设备进行初始化,并使硬件处于就绪状态。
在主程序模块中,需要完成对各接口芯片的初始化、出租车起价和单价的初始化、中断向量的设计以及开中断、循环等待等工作。
系统流程图如下图4-1。
图4-1系统主程序流程图
4.2数据处理子程序
每当霍尔传感器输出一个低电平信号就使单片机中断一次,在计数中断服务程序,里程和金额都相应变化,当然等待时间也换算成里程(当速度小于5km/h时5分钟想当于1公里)。
计算程序根据里程数分别进入不同的计算公式。
如果里程大于3公里,则执行公式:
金额=(里程-3)*单价+5;
否则,执行公式:
总金额=起步价。
程序流程图如图4-2所示。
4.3键盘扫描子程序
键盘采用查询的方式,放在主程序中,当没有按键按下的时候,单片机循环主程序,一旦右按键按下,便转向相应的子程序处理,处理结束再返回。
5Proteus软件仿真
本设计需要用KeiluVision4对C51程序进行编译,生成“.hex”文件,如图5-1:
图5-1KeiluVision4编译
在Proteus软件中画出仿真电路(如图5-2),把KeiluVision3编译后生成的“.hex”导入到单片机中,按“运行仿真”键进行仿真。
图5-2Proteus仿真
总结
总结在本次设计中,我们采用AT89S52芯片为核心器件,设计出了简单的出租车计价器,能够实现显示时间、等待时间、金额和里程,按键控制,空车指示。
选题后,我们便开始复习单片机方面的知识,也查阅、搜索了很多相关资料,进行总体设计与具体设计,同时也学习仿真软件Proteus和编程软件KeiluVision3。
由于以前都采用汇编语言实现编程,对用C语言来实现单片机的编程不太习惯,花费了一些时间来熟悉C语言的编程。
在设计开始,要形成流程图,它可以使设计有一定的逻辑性与严密性,使得设计思路明确。
采用模块化的设计思想很重要,它方便编写、修改与调试,另外加上必要的注释,便于交流与理解。
这次课程设计设计完成后,体会颇多,在学与做的过程中,取长补短,不断学习新的知识,吸取经验,达到进步的目的。
通过自身的努力以及相关图书资料的帮助,逐渐熟悉了KeiluVision3、PROTEUS和C语言等软件的使用以及硬件焊接与检测过程中的一些小技巧。
本次设计我学习到不少单片机的知识,但由于自己的理论知识水平有限,实践知识和设计经验不足,在设计过程中难免存在一些问题。
所焊实物尚有许多不足,个别功能还不能很好的实现,主要原因是考虑问题不周全,电路设计经验少,实际动手能力不足。
恳请各位老师批评指正,以使我在以后的学习和实践中加以改进和提高。
致谢
毕业设计即将结束,在老师的指导和同学的帮助之下,学生对于出租车计价器设计有了更多新的认知,对出租车计价器设计有了更深一步的认识,对出租车计价器综合设计的整体脉络了解得更加的清晰透彻。
通过毕业设计,学生对自己三年以来所学的知识有更多的认识。
毕业设计,帮助我们总结大学的收获、认清自我。
同时,还帮助我们改变一些处理事情时懒散的习惯。
从最开始时的搜集资料,整理资料,到方案比选,确定方案,再到着手开始设计,每一步都是环环相扣,衔接紧密,其中任何一个步骤产生遗漏或者疏忽,就会对以后的设计带来很多的不便。
本次作者的毕业设计是由徐老师指导的,在他的悉心指导下,我开阔了眼界,明确了思路。
在整个的设计过程中,徐老师提出了许多宝贵的建议和指导,使我能够顺利的完成整个设计,在此,谨向徐老师表示由衷的感谢。
在即将离开学校之际,我要感谢在大学生活中任课的众多老师,正是在他们的谆谆教诲下使我顺利完成了大学的基础知识和专业知识的学习。
在此,还要感谢陪伴我共同走过大学时代并给予我帮助的同学和朋友们,感谢你们,祝福你们在以后的日子里开开心心的度过每一天!
参考文献
[1]贺哲荣.AT89S51单片机硬件设计与编程实例.北京:
中国电力出版社.2012
[2]李泉溪.单片机原理与应用实例仿真.北京:
北京航空航天大学出版社,2012.
[3]王平.单片机应用设计与制作.北京:
清华大学出版社,2012.
[4]彭为等.单片机典型系统设计实例精讲.北京:
电子工业出版社,2007
[5]王庆利等.单片机设计案例实践教程.北京:
北京邮电大学出版社,2008
[6]韩志军等.单片机应用系统设计——入门向导与设计实例.北京:
机械工业出版社,2005
[7]皮大能等.单片机课程设计指导书.北京:
北京理工大学出版社,2010
附1、源程序
#include<
reg52.h>
intrins.h>
#include"
lcd12864.c"
code.h"
ds1302.c"
display.c"
sbitP10=P1^0;
sbitP12=P1^2;
floatdistance_km,money;
voidtimer0isr(void)interrupt1using1
{
distance_km+=0.1;
if(distance_km<
=3)money=5;
elsemoney=5+(distance_km-3)*1.5;
}
voidmain(void)
{
init_lcd();
clearscreen(0);
setline(0);
TMOD=0x06;
distance_km=0;
TH0=0xCE;
TL0=0xCE;
EA=1;
TR0=1;
Init_DS1302();
while
(1)
if(P10==0)
ET0=1;
P12=0;
displa