片机课程设计论文---出租车计价器.doc_第1页
片机课程设计论文---出租车计价器.doc_第2页
片机课程设计论文---出租车计价器.doc_第3页
片机课程设计论文---出租车计价器.doc_第4页
片机课程设计论文---出租车计价器.doc_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

河南理工大学河南理工大学河南理工大学 单片机应用与仿真训练单片机应用与仿真训练设计报告设计报告 基于单片机的出租车计价器的设计基于单片机的出租车计价器的设计 - 1 - 摘摘 要要 本设计采用 AT89S52 单片机为主控器,并用霍尔传感器检测电机转盘转动 模拟车速,实现对出租车的多功能的计价设计,输出采用 8 段数码显示管。本 电路设计的计价器可以实现要单程,往返和中途等待来调节计费,并且能够记 录等待时间。 出租车计价是根据车所行驶的路程以及乘客乘车的方式综合决定的。出租 车行驶总路程可以通过车轮的周长乘车轮旋转圈数得到。即可计算得到车轮旋 转几周出租车能行驶一公里的路程。使用霍尔传感器方便地计量车轮旋转的圈 数。输出的脉冲信号被接入到 AT89S52 单片机系统中,通过计算接收到的脉冲 个数,计算出当前所行驶的路程,并且可以计算实时的速度,在速度低于 5 公 里每小时是进入等待计费。于此同时,根据不同的收费标准,通过选择相应的 起步价、单价等收费标准进行计算。通过键盘能够实现往返设置,启动、暂停、 停止计价器以及切换显示当前的行驶里程和需支付的车费。 本设计硬件电路总体可以分为五个单元:单片机最小系统单元,指示灯电 路单元,按键电路单元,路程时间与金额显示单元,转速信号接收单元。软件 系统可以大致分为五个大的模块为:总初始化模块,按键扫描模块,中断与定 时模块,数据计算模块,数码管显示模块。其中,键盘扫描和数码管显示采用 查询方式,转速信号接收与等待记时采用中断方式。这些软硬件系统构成了最 终的设计。 关键词关键词单片机霍尔传感器出租车计价器 - 2 - 摘摘 要要- 1 - 1 1 概述概述.- 2 - 1.1 设计目的、意义- 2 - 1.2 AT89S52 单片机功能简介.- 3 - 2.2.系统总体方案设计及硬件设计系统总体方案设计及硬件设计.- 4 - 2.1 设计要求- 4 - 2.2 设计参数 - 5 - 2.3 方案的选取- 5 - 2.4 硬件设计 - 5 - 2.4.1 AT89S52 单片机及最小系统.- 5 - 2.4.2 测距单元- 7 - 2.4.3 显示单元- 10 - 2.4.4 键盘与指示单元.- 10 - 3 3 软件设计软件设计 .- 11 - 3.1 总体流程 - 11 - 3.2 计算模块 - 12 - 3.3 键盘扫描 - 12 - 3.4 显示程序 - 12 - 4 4 PROTEUS 软件仿真软件仿真.- 13 - 5 5 课程设计体会课程设计体会- 14 - 参考文献参考文献- 15 - 附附 1 1:源程序代码:源程序代码- 16 - 附附 2 2:系统原理图:系统原理图- 30 - - 3 - 1 1 概述概述 1.1 设计目的、意义 租车计价器技术也在不断进步和提高。国内出租车计价器已经经历了 4 个 阶段的发展。从传统的全部由机械元器件组成的机械式,到半电子式即用电子线 路代替部分机械元器件的出租车计价器;再从集成电路式到目前的单片机系统 设计的出租车计价器。出租车计价器计费是否准确、出租车司机是否作弊才是 乘客最关心的问题,而计价器营运数据的管理是否方便才是出租车司机最关注的。 因此怎样设计出一种既能有效防止司机作弊又能方便司机的计价器尤为重要。 因此, 本文以单片机 AT89S52 为核心设计一款多功能出租车计价器,该计价器能 实现按时间和里程综合计算车价,能显示时间、里程、单价、总车价等相关信 息显示。它比市场上的一些计价器使用更方便,功能更全,还具有有效防止司机 作弊和系统稳定性好的优点。 本次设计的目的在于现在各大中城市出租车行业都已普及自动计价器,所 以计价器技术的发展已成定局。采用模拟电路和数字电路设计的计价器整体电 路的规模较大,用到的器件多,造成故障率高,难调试。而采用单片机进行的 设计,相对来说功能强大,是深化单片机应用的良好途径,用较少的硬件和适 当的软件相互配合可以很容易地实现设计要求,且灵活性强,可以通过软件编 程来完成更多的附加功能。 1.2 AT89S52 单片机功能简介 计算机系统已明显地朝巨型化、单片化、网络化三个方向发展。巨型化发 展的目的在于不断提高计算机的运算速度和处理能力,以解决复杂系统计算和 高速数据处理,比如系统仿真和模拟、实时运算和处理。单片化是把计算机系 统尽可能集成在一块半导体芯片上,其目的在于计算机微型化和提高系统的可 靠性,这种单片计算简称单片机。单片机的内部硬件结构和指令系统主要是针 对自动控制应用而设计的,所以单片机又称微控制器 MCU(Micro Controller Unit)。用它可以很容易地将计算机嵌入到各种仪器和现场控制设备中,因此 单片机又叫做嵌入式微控制器(Embedded MCU)。单片机自 20 世纪 70 年代问 世以来,以其鲜明的特点得到迅猛发展,已广泛应用于家用电器、智能玩具、 - 4 - 智能仪器仪表、工业控制、航空航天等领域,经过 30 多年的发展,性能不断提 高,品种不断丰富,已经形成自动控制的一支中坚力量。据统计,我国的单片 机年容量已达 13 亿片,且每年以大约 16的速度增长,但相对于国际市场 我国的占有率还不到 1。这说明单片机应用在我国有着广阔的前景。对于从 事自动控制的技术人员来讲,掌握单片机原理及其应用已经成为必不可少的学 习任务。 单片机的应用十分广泛,在工业控制领域、家电产品、智能化仪器仪表、 计算机外部设备,特别是机电一体化产品中,都有重要的用途。其主要的用途 可以分为以下方面: 显示:通过单片机控制发光二极管或是液晶,显示特定的图形和字符。 机电控制:用单片机控制机电产品做定时或定向的动作。 检测:通过单片机和传感器的联合使用,用来检测产品或者工况的意外发 生。 通信:通过 RS-232 串行通信或者是 USB 通信,传输数据和信号。 科学计算:用来实现简单的算法。 那么单片机是不是解决上述应用的唯一选择呢?淡然不是!目前,在自动 控制中,一般有三种选择,分别是嵌入式微机、DSP 和单片机。 单片机最明显的优点是价格便宜,从几元人民币到几十元人民币。这是因 为这类芯片的生产量很大,技术也很成熟。 其次,单片机的体积也远小于其他两种方案。单片机本身一般用 40 引脚封 装,当然功能多一些的单片机也有引脚比较多的,如 68 引脚,功能少的只有 10 多个或 20 多个引脚,有的甚至只有 8 只引脚。 当然,单片机无论在速度还是容量方面都小于其他两种方案,但是在实际 工作中并不是任何需要计算机的场合都要求计算机有很高的性能。例如,控制 电冰箱的控制器就不需要使用嵌入式系统,用一片 51 就可以轻松实现。所以应 用的关键是看能否够用,是否有很好的性能价格比。51 系列的单片机已经面世 十多年,依然没有被淘汰,还在不断发展中,这就说明是他有广阔的应用前景。 - 5 - 2.2.系统总体方案设计系统总体方案设计及硬件设计及硬件设计 2.1 设计要求 (1)能显示里程,单位为公里,最后一位为小数位。 (2)能显示金额数,单位为元,最后一位为小数位。 (3)可设定单程价格和往返价格,单程价格为 2 元/公里,往返价格为 1.5 元/公里。 (4)车速3 总金额=起步价 单程? 总金额=(里程-3)*单价+等待 时间*等待价格 价格为单程 价格为双程 N N N N N 开始 初始化变量 中断与定时初始化 键盘扫描 数据计算 数码管显示 结束 清零键? 切换显示键? 切换标志自取反 单程双程键? 双程标志自取反 暂停键? 关中断 停止计费 调用初始化函数 Y Y Y Y N Y Y - 13 - 3.2 计算模块 计算程序根据里程数分别进入不同的计算公式。如果里程大于 3 公里,则 执行公式:总金额=起步价+(里程-3)*单价+等待时间*等待单价;否则,执行 公式:总金额=起步价+等待时间*等待单价。 对于里程数采用外部中断零来记录,车轮没转一周,霍尔传感器发一个脉 冲然后进入中断子程序,对相应的变量进行更新。 对于速度的判断及等待时间的记录采用定时器零中断,设定 10ms 一个中断, 然后判断车速,小于 5 公里/小时时,则开始记录等待时间。 3.3 键盘扫描 键盘扫描才用查询方式,当有按键按下时就对相应的标志进行取反,或调 用其他子函数,在消抖过程中,这里将数码管显示程序潜入以保证显示的稳定。 3.4 显示程序 显示程序利用主函数内的循环,实现动态扫描显示,同时根据数码管余辉 和人眼暂留现象,即可实现显示。本设计采用两个四个一组的八位数码管来显 示,一组显示金额,另一组显示路程与等待时间配合按键来切换。数据端都用 单片机 P1 口,片选端分别接在 P2 口的高四位和低四位。 - 14 - 4 4 Proteus 软件仿真软件仿真 本设计需要用 Keil uVision3 对 C51 程序进行编译,生成“.hex”文件。 在 Proteus 软件中画出仿真电路(如图 19),把 Keil uVision3 编译后生 成的“.hex”导入到单片机中,按“运行仿真”键进行仿真 如图显示的状态设置为:单程,车速大于 5km/h,当路程等于 7.2km 时的显示 情况。 - 15 - 5 5 课程设计体会课程设计体会 在本次单片机课程设计中,我们选择的题目是基于 51 单片机的出租车计价 器的设计。老师统一配发的主控芯片是 AT89S52 单片机,要实现的计价器的基 本功能是以按键为输入控制方式,实现对出租车运行过程中状态信息的测量, 主要包括等待时间、金额和里程等,并将其显示出来。 经一个星期的努力我们完成了所有的基本功能,在完成整个课程设计的过 程中,我们遇到了许多困难,但在解决困难的同时,也收获了许多,现在就将 在整个课程设计过程中的几点收获与体会总结如下: 1、提高了单片机的 C 语言编程能力。 虽然单片机原理这门课程是在上学期修的,之后的这段时间也没有使用单 片机实际的做一些设计,因为当时是用汇编语言学习的单片机,对 C 语言的编 程方法不是很熟悉。因此,选题后我们使用郭天祥的新概念 51 单片机设计 开始练习 51 单片机的 C 程序设计,一开始我们总想一下子把整个程序写完(随 着更深入的学习后来发现这种想法是不对的),因而使自己的自信心很受挫。 在这里我们得到的经验是使程序模块化:将一个大的程序分为几个主要模块, 分别完成,最后再组合在一起调试成功。 2、使我们对硬件电路的分析及设计能力有了不小的进步。 本设计的硬件设计包括单片机 AT89S52 单元、测距单元、显示单元、按键 与指示单元。通过上网查找相关资料,虽然找到了比较合适的电路图,但因为 对其原理理解的不是特别透彻,在实际的焊接过程中遇到了不少的困难,比如 没有共地、缺少滤波电容、电源压降太大、缺少下拉电阻,焊接中焊点虚焊和 短路等。在这里我们得到的经验是:拿到一个电路图之后要对其进行深入的分 析,了解其原理,并修改其错误,同时在焊接的过程中一定要细心、耐心,只 有不停的分析电路,查找故障,久而久之我们才能成为一个很好的设计者。 3、增强了我们的团队意识。 在整个设计的过程中,我们之间发生了不少的争执,在设计硬件电路时, 我们对电路图的选择持有不同意见,在焊接过程中我们对整体布局布线也有过 争议,在程序编写过程中对算法的选取,流程的设计也各持己见。由于我们各 自的过分,坚持导致了一些不必要的时间浪费。在这里我们得到的经验是:在 - 16 - 合作的过程中要善于聆听对方的一间,要发现别人的长处,弥补自己的不足。 一个团队只有能够相互取长补短,才能够在愉快的合作中更好得完成任务。 4、不要过于追求实物的产品化。 在做课程设计的过程中,由于我们一开始考虑了许多复杂细小的情况,导 致我们不知道从哪里开始入手,产生了许多不必要的麻烦。我们得到的经验是: 遇到问题要抓主要矛盾,解决主要矛盾(实现基本功能)之后,再去考虑其他 的细节问题。遇到问题不要只想,试着动手做就有思路了。 参考文献参考文献 【1】 郭天祥.新概念 51 单片机 C 语言教程.电子工业出版社,2008 【2】 余发山,王福忠.单片机原理及应用技术.中国矿业大学出版社,2008.6 【3】 侯玉宝,陈忠平,李成群.基于 Proteus 的 51 系列单片机设计与仿真.电子工业出版社, 2008 【4】 李泉溪.单片机原理与应用实例仿真.北京航空航天大学出版社,2009 【5】 谭浩强.C 程序设计.清华大学出版社,1991 【6】 楼然苗,胡佳文,李光飞等.单片机实验与课程设计.浙江大学出版社,2010.10 【7】 王晓敏.传感器检测技术及应用.北京大学出版社,2010 【8】 吴红星.电机驱动与控制专用集成电路及应用.中国电力出版社,2006 - 17 - 附附 1 1:源程序代码:源程序代码 /“里程和价格显示程序“ #include #include #define uchar unsigned char #define uint unsigned int #define somenop _nop_();_nop_();_nop_();_nop_();_nop_(); #define SlaveAddrW 0xA0/“写命令“ #define SlaveAddrR 0xA1/“读命令“ /“IIC 总线引脚定义“ sbit SDA = P10; /“数据线“ / sbit SCL = P11; /“时钟线 “/ /“语音芯片定义“ sbit SS =P13;/“片选“ sbit MOSI=P14;/“数据输入“ sbit MISO=P15;/“数据输出“ sbit SCLK=P16;/“ISD4004 时钟“ sbit ls138A=P20;/“138 译码器的 3 个位选,A 为低位“ sbit ls138B=P21; sbit ls138C=P22; sbit kds=P23; /“单双程控制开关“ sbit kks=P24; /“开始控制开关“ - 18 - sbit kcx=P25; /“查询控制开关“ sbit kzt=P26; /“暂停控制开关“ sbit kql=P27;/“清零控制开关“ sbit kjy=P12; /“上次记忆值查询“ /“变量定义“ uchar code duanma=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/“数码管段码“ uint count,num0,k,zhuan,z,su,n; float gong,quan,jin,deng; uchar qiane,baie,shie,gee;/“金额的千,百,十,个“ uchar qianc,baic,shic,gec;/“路程的千,百,十,个“ /“函数声明“ void display(float cheng,float e,bit biao); /“24C02 函数声明“ void IIC_Start(void); void IIC_Stop(void); void IIC_Ack(bit ackbit); void IIC_SendByte(unsigned char byt); bit IIC_WaitAck(void); unsigned char IIC_RecByte(void); void Write(uchar add,uchar dat); uint Read(uchar add); /“24c02 操作函数“/ /“总线启动条件 “ void IIC_Start(void) SDA = 1; SCL = 1; somenop; SDA = 0; somenop; SCL = 0; /“总线停止条件 “ void IIC_Stop(void) - 19 - SDA = 0; SCL = 1; somenop; SDA = 1; /“应答位控制 “ void IIC_Ack(bit ackbit) if(ackbit) SDA = 0; else SDA = 1; somenop; SCL = 1; somenop; SCL = 0; SDA = 1; somenop; /“等待应答 “ bit IIC_WaitAck(void) SDA = 1; somenop; SCL = 1; somenop; if(SDA) SCL = 0; IIC_Stop(); return 0; - 20 - else SCL = 0; return 1; /“通过 I2C 总线发送数据 “ void IIC_SendByte(unsigned char byt) unsigned char i; for(i=0;i0;time-) TH1=0xfc; TL1=0x18; TR1=1; while(TF1!=1) ; TF1=0; TR1=0; void isd_send(unsigned char isdx)/“spi 串行发送子程序,8 位数据“ unsigned char isx_counter; SS=0;/“ss=0,打开 spi 通信端“ SCLK=0; for(isx_counter=0;isx_counter1; SCLK=1; /“上升沿锁存数据“ delay(2); SCLK=0; /“下降沿将数据读走“ delay(2); - 23 - void isd_stop()/“stop 指令(停止当前操作)“ delay(10); isd_send(0x30); SS=1; /“ss=1,关闭 spi 通信端“ delayms(50); void isd_powerup()/“发送上电指令 “ delay(10); isd_send(0x20); SS=1; /“ss=1,关闭 spi 通信端“ delayms(50); void isd_stopwrdn()/“发送掉电指令“ delay(10); isd_send(0x10); SS=1; /“ss=1,关闭 spi 通信端“ delayms(50); void isd_play()/“发送 play 指令,从当前地址开始放音,IAB=1“ isd_send(0xf0); SS=1; /“ss=1,关闭 spi 通信端“ void isd_rec()/“发送 rec 指令,从当前地址开始录音,IAB=1“ isd_send(0xb0); SS=1; /“ss=1,关闭 spi 通信端“ void isd_setplay(unsigned char adl,unsigned char adh)/“发送放音指令,从指定地址开始放音“ delayms(1); isd_send(adl); /“发送放音起始地址低位“ delay(2); - 24 - isd_send(adh); /“发送放音起始地址高位“ delay(2); isd_send(0xe0); /“发送放音指令字节,IAB=0“ SS=1; /“ss=1,关闭 spi 通信端“ /*void isd_setrec(unsigned char adl,unsigned char adh)/“发送录音指令,从指定地址开始录音“ delayms(1); isd_send(adl); /“发送录音起始地址低位“ delay(2); isd_send(adh); /“发送录音起始地址高位“ delay(2); isd_send(0xa0); /“发送录音指令字节,IAB=0“ SS=1; /“ss=1,关闭 spi 通信端“ */ /“其它操作函数“/ void delaynms(uint nms) uint i,j; for(i=0;i0;j-); void init() quan=0; jin=0; deng=0; n=0; z=0; su=0; gong=0; num0=0; count=0; zhuan=0; k=0; kds=1; IT0=1; - 25 - TMOD=0x11; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; EX0=1; void main() uint wait,money; uint xun=0; uchar flag=0; display(0,0,0); if(kjy=0)/“按下为查看上次记忆值“ delaynms(10); if(kjy=0) wait=Read(0x00); /“读取 24C02 中上一次的等待时间、金额数据“ delaynms(10); money=Read(0x02); delaynms(10); for(xun=200;xun0;xun-) display(wait,money,1); if(kks=0) delaynms(10); if(kks=0) init(); isd_powerup(); isd_setplay(0x00,0x00); isd_play(); /“发送放音指令“ if(kds=0) /“开始计价后,显示 2 秒钟单价“ - 26 - for(xun=200;xun0;xun-) display(1.5,jin,0); else for(xun=200;xun0;xun-) display(2.0,jin,0); while(1) gong=k+quan/500;/“公里=公里数+圈数除以 500,500 转为一公里“ if(kds=0) /“按下为双程“下是双程 if(gong0;xun-) display(deng,jin,1); - 27 - if(kzt=0) /“按下为暂停“ delaynms(10); if(kzt=0) EX0=0; ET0=0; isd_powerup(); isd_setplay(0x00,0x01); isd_play(); /“发送放音指令“ while(1) display(gong,jin,0); /“显示公里,金额“ if(kql=0) delaynms(10); if(kql=0) deng=n*2+su/60; Write(0x00,deng); delaynms(10); Write(0x02,jin); delaynms(10); init(); flag=1; break; if(kcx=0)/“按下为查询“ delaynms(10); if(kcx=0) deng=n*2+su/60; /“等待时间=2 分钟乘以 其个数+不到 120 秒的分钟数“ for(xun=200;xun0;xun-) display(deng,jin,1); - 28 - if(flag=1) flag=0; break; void zhongduan0() interrupt 0 count+;/“总的圈数,可能会溢出“ quan+;/“轮子两米一圈“ if(quan=500) quan=0; k+; /“k 是路程的千米整数位“ void time0() interrupt 1 EX0=0; TH0=(65536-50000)/256; TL0=(65536-50000)%256; num0+; if(num0=20) /“一秒时间到“ num0=0; /“一秒后与一秒前的计数值之差给转速 zhuan“ if(count=120) /“su 为秒的累加,累加到 2 分钟,清零,表示一公里的 k 自加一,同时表示 2 分钟的 n 加一“ su=0; k+; n+; EX0=1; void display(float cheng,float e,bit biao)/“若 biao=1,则前四位数码管的第三位不加小数点“ if(biao=0) cheng=cheng*10; e=e*10; qianc=(int)cheng/1000; shic=(int)cheng%100/10; baic=(int)cheng%1000/100; gec=(int)cheng%10; qiane=(int)e/1000; shie=(int)e%100/10; baie=(int)e%1000/100; gee=(int)e%10; ls138A=0; ls138B=0; ls138C=0; P0=duanmaqianc; delaynms(2); ls138A=1; ls138B=0; ls138C=0; P0=duanmabaic; - 30 - delaynms(2); ls138A=0; ls138B=1; ls138C=0; if(biao=1) P0=duanmashic; else P0=duanmashic|0x80; delaynms(2);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论