单片机教学规划专业论文-出租车计价器.doc
河南理工大学河南理工大学河南理工大学 单单片机片机应应用与仿真用与仿真训练训练 设计报设计报告告基于基于单单片机的出租片机的出租车计车计价器的价器的设计设计,摘摘 要要本设计采用 AT89S52 单片机为主控器,并用霍尔传感器检测电机转盘转动模拟车速,实现对出租车的多功能的计价设计,输出采用 8 段数码显示管。本电路设计的计价器可以实现要单程,往返和中途等待来调节计费,并且能够记录等待时间。出租车计价是根据车所行驶的路程以及乘客乘车的方式综合决定的。出租车行驶总路程可以通过车轮的周长乘车轮旋转圈数得到。即可计算得到车轮旋转几周出租车能行驶一公里的路程。使用霍尔传感器方便地计量车轮旋转的圈数。输出的脉冲信号被接入到 AT89S52 单片机系统中,通过计算接收到的脉冲个数,计算出当前所行驶的路程,并且可以计算实时的速度,在速度低于 5 公里每小时是进入等待计费。于此同时,根据不同的收费标准,通过选择相应的起步价、单价等收费标准进行计算。通过键盘能够实现往返设置,启动、暂停、停止计价器以及切换显示当前的行驶里程和需支付的车费。本设计硬件电路总体可以分为五个单元:单片机最小系统单元,指示灯电路单元,按键电路单元,路程时间与金额显示单元,转速信号接收单元。软件系统可以大致分为五个大的模块为:总初始化模块,按键扫描模块,中断与定时模块,数据计算模块,数码管显示模块。其中,键盘扫描和数码管显示采用查询方式,转速信号接收与等待记时采用中断方式。这些软硬件系统构成了最终的设计。关关键词键词单片机霍尔传感器出租车计价器 ,摘摘 要要.- 1 -1 概述概述.- 2 -1.1 设计目的、意义.- 2 -1.2 AT89S52 单片机功能简介.- 3 -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 软软件件设计设计.- 11 -3.1 总体流程.- 11 -3.2 计算模块.- 12 -3.3 键盘扫描.- 12 -3.4 显示程序.- 12 -4 PROTEUS 软软件仿真件仿真.- 13 -5 课课程程设计设计体会体会.- 14 -参考文献参考文献.- 15 -附附 1:源程序代:源程序代码码.- 16 -附附 2:系:系统统原理原理图图.- 30 -,1 概述概述1.1 设计目的、意义租车计价器技术也在不断进步和提高。国内出租车计价器已经经历了 4 个阶段的发展。从传统的全部由机械元器件组成的机械式,到半电子式即用电子线路代替部分机械元器件的出租车计价器;再从集成电路式到目前的单片机系统设计的出租车计价器。出租车计价器计费是否准确、出租车司机是否作弊才是乘客最关心的问题,而计价器营运数据的管理是否方便才是出租车司机最关注的。因此怎样设计出一种既能有效防止司机作弊又能方便司机的计价器尤为重要。因此, 本文以单片机 AT89S52 为核心设计一款多功能出租车计价器,该计价器能实现按时间和里程综合计算车价,能显示时间、里程、单价、总车价等相关信息显示。它比市场上的一些计价器使用更方便,功能更全,还具有有效防止司机作弊和系统稳定性好的优点。本次设计的目的在于现在各大中城市出租车行业都已普及自动计价器,所以计价器技术的发展已成定局。采用模拟电路和数字电路设计的计价器整体电路的规模较大,用到的器件多,造成故障率高,难调试。而采用单片机进行的设计,相对来说功能强大,是深化单片机应用的良好途径,用较少的硬件和适当的软件相互配合可以很容易地实现设计要求,且灵活性强,可以通过软件编程来完成更多的附加功能。1.2 AT89S52 单片机功能简介计算机系统已明显地朝巨型化、单片化、网络化三个方向发展。巨型化发展的目的在于不断提高计算机的运算速度和处理能力,以解决复杂系统计算和高速数据处理,比如系统仿真和模拟、实时运算和处理。单片化是把计算机系统尽可能集成在一块半导体芯片上,其目的在于计算机微型化和提高系统的可靠性,这种单片计算简称单片机。单片机的内部硬件结构和指令系统主要是针对自动控制应用而设计的,所以单片机又称微控制器 MCU(Micro Controller Unit)。用它可以很容易地将计算机嵌入到各种仪器和现场控制设备中,因此单片机又叫做嵌入式微控制器(Embedded MCU)。单片机自 20 世纪 70 年代问世以来,以其鲜明的特点得到迅猛发展,已广泛应用于家用电器、智能玩具、智能仪器仪表、工业控制、航空航天等领域,经过 30 多年的发展,性能不断提高,品种不断丰富,已经形成自动控制的一支中坚力量。据统计,我国的单片机年容量已达 13 亿,片,且每年以大约 16的速度增长,但相对于国际市场我国的占有率还不到1。这说明单片机应用在我国有着广阔的前景。对于从事自动控制的技术人员来讲,掌握单片机原理及其应用已经成为必不可少的学习任务。 单片机的应用十分广泛,在工业控制领域、家电产品、智能化仪器仪表、计算机外部设备,特别是机电一体化产品中,都有重要的用途。其主要的用途可以分为以下方面:显示:通过单片机控制发光二极管或是液晶,显示特定的图形和字符。机电控制:用单片机控制机电产品做定时或定向的动作。检测:通过单片机和传感器的联合使用,用来检测产品或者工况的意外发生。通信:通过 RS-232 串行通信或者是 USB 通信,传输数据和信号。科学计算:用来实现简单的算法。那么单片机是不是解决上述应用的唯一选择呢?淡然不是!目前,在自动控制中,一般有三种选择,分别是嵌入式微机、DSP 和单片机。单片机最明显的优点是价格便宜,从几元人民币到几十元人民币。这是因为这类芯片的生产量很大,技术也很成熟。其次,单片机的体积也远小于其他两种方案。单片机本身一般用 40 引脚封装,当然功能多一些的单片机也有引脚比较多的,如 68 引脚,功能少的只有 10多个或 20 多个引脚,有的甚至只有 8 只引脚。当然,单片机无论在速度还是容量方面都小于其他两种方案,但是在实际工作中并不是任何需要计算机的场合都要求计算机有很高的性能。例如,控制电冰箱的控制器就不需要使用嵌入式系统,用一片 51 就可以轻松实现。所以应用的关键是看能否够用,是否有很好的性能价格比。51 系列的单片机已经面世十多年,依然没有被淘汰,还在不断发展中,这就说明是他有广阔的应用前景。,2.系系统总统总体方案体方案设计设计及硬件及硬件设计设计2.1 设计要求(1)能显示里程,单位为公里,最后一位为小数位。(2)能显示金额数,单位为元,最后一位为小数位。(3)可设定单程价格和往返价格,单程价格为 2 元/公里,往返价格为 1.5 元/公里。(4)车速3总金额=起步价单程?总金额=(里程-3)*单价+等待时间*等待价格价格为单程价格为双程NNNNN开始初始化变量中断与定时初始化键盘扫描数据计算数码管显示结束清零键?切换显示键?切换标志自取反单程双程键?双程标志自取反暂停键?关中断停止计费调用初始化函数YYYYNYY,对于里程数采用外部中断零来记录,车轮没转一周,霍尔传感器发一个脉冲然后进入中断子程序,对相应的变量进行更新。对于速度的判断及等待时间的记录采用定时器零中断,设定 10ms 一个中断,然后判断车速,小于 5 公里/小时时,则开始记录等待时间。3.3 键盘扫描键盘扫描才用查询方式,当有按键按下时就对相应的标志进行取反,或调用其他子函数,在消抖过程中,这里将数码管显示程序潜入以保证显示的稳定。3.4 显示程序显示程序利用主函数内的循环,实现动态扫描显示,同时根据数码管余辉和人眼暂留现象,即可实现显示。本设计采用两个四个一组的八位数码管来显示,一组显示金额,另一组显示路程与等待时间配合按键来切换。数据端都用单片机P1 口,片选端分别接在 P2 口的高四位和低四位。,4 Proteus 软软件仿真件仿真本设计需要用 Keil uVision3 对 C51 程序进行编译,生成“.hex”文件。在 Proteus 软件中画出仿真电路(如图 19),把 Keil uVision3 编译后生成的“.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#define uchar unsigned char#define uint unsigned int#define somenop _nop_();_nop_();_nop_();_nop_();_nop_();#define SlaveAddrW 0 xA0/写命令#define SlaveAddrR 0 xA1/读命令/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; /开始控制开关sbit kcx=P25; /查询控制开关sbit kzt=P26; /暂停控制开关sbit kql=P27;/清零控制开关sbit kjy=P12; /上次记忆值查询/变量定义uchar code duanma=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f;/数码管段码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)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;else SCL = 0;return 1;/通过 I2C 总线发送数据 ,void IIC_SendByte(unsigned char byt)unsigned char i;for(i=0;i8;i+) if(byt&0 x80) SDA = 1;else SDA = 0;somenop;SCL = 1;byt = 1;somenop;SCL = 0;/从 I2C 总线上接收数据 unsigned char IIC_RecByte(void)unsigned char da;unsigned char i;for(i=0;i8;i+) SCL = 1;somenop;da 0;time-) TH1=0 xfc; TL1=0 x18; 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); void isd_stop()/stop 指令(停止当前操作) delay(10); isd_send(0 x30); SS=1; /ss=1,关闭 spi 通信端delayms(50); void isd_powerup()/发送上电指令 , delay(10); isd_send(0 x20); SS=1; /ss=1,关闭 spi 通信端delayms(50); void isd_stopwrdn()/发送掉电指令 delay(10); isd_send(0 x10); SS=1; /ss=1,关闭 spi 通信端delayms(50); void isd_play()/发送 play 指令,从当前地址开始放音,IAB=1 isd_send(0 xf0); SS=1; /ss=1,关闭 spi 通信端 void isd_rec()/发送 rec 指令,从当前地址开始录音,IAB=1 isd_send(0 xb0); SS=1; /ss=1,关闭 spi 通信端 void isd_setplay(unsigned char adl,unsigned char adh)/发送放音指令,从指定地址开始放音 delayms(1); isd_send(adl); /发送放音起始地址低位delay(2); isd_send(adh); /发送放音起始地址高位delay(2); isd_send(0 xe0); /发送放音指令字节,IAB=0SS=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(0 xa0); /发送录音指令字节,IAB=0SS=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; TMOD=0 x11; 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(0 x00); /读取 24C02 中上一次的等待时间、金额数据 delaynms(10); money=Read(0 x02); delaynms(10); for(xun=200;xun0;xun-) display(wait,money,1); if(kks=0) delaynms(10); if(kks=0) init();isd_powerup();isd_setplay(0 x00,0 x00); isd_play(); /发送放音指令if(kds=0) /开始计价后,显示 2 秒钟单价 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(gong=3) jin=5; else jin=gong*1.5; display(gong,jin,0); /显示公里,金额 if(kds=1) if(gong0;xun-) display(deng,jin,1); if(kzt=0) /按下为暂停 delaynms(10); if(kzt=0) EX0=0; ET0=0;, isd_powerup(); isd_setplay(0 x00,0 x01); isd_play(); /发送放音指令 while(1) display(gong,jin,0); /显示公里,金额 if(kql=0) delaynms(10); if(kql=0) deng=n*2+su/60; Write(0 x00,deng); delaynms(10); Write(0 x02,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); 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(countz) zhuan=count+65535-z;/count 溢出情况下 else zhuan=count-z; z=count; if(zhuan=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; delaynms(2); ls138A=0; ls138B=1; ls138C=0; if(biao=1) P0=duanmashic;, else P0=duanmashic|0 x80; delaynms(2); ls138A=1; ls138B=1; ls138C=0; P0=duanmagec; delaynms(2); ls138A=0; ls138B=0; ls138C=1; P0=duanmaqiane; delaynms(2); ls138A=1; ls138B=0; ls138C=1; P0=duanmabaie; delaynms(2); ls138A=0; ls138B=1; ls138C=1; P0=duanmashie|0 x80; delaynms(2); ls138A=1; ls138B=1; ls138C=1; P0=duanmagee; delaynms(2);, 附附 2:系:系统统原理原理图图EA/VPP31XTAL119XTAL218RST9P3.7(RD)17P3.6(WR)16P3.2(INT0)12P3.3(INT1)13P3.4(T0)14P3.5(T1)15P1.0(T2)1P1.1(T2EX)2P1.23P1.34P1.45P1.56P1.67P1.78(AD0)P0.039(AD1)P0.138(AD2)P0.237(AD3)P0.336(AD4)P0.435(AD5)P0.534(AD6)P0.633(AD7)P0.732(A8)P2.021(A9)P2.122(A10)P2.223(A11)P2.324(A12)P2.425(A13)P2.526(A14)P2.627(A15)P2.728PSEN29ALE/PROG30(TXD)P3.111(RXD)P3.010GND20VCC40U?AT89S52111226945713810a b c d e f g dpD1D2D3D4【/【111226945713810a b c d e f g dpD1D2D3D4【123456781615141312111091KRVCC12Y1XTALC233PC133PGNDC310R110KVCCR31KS20SW-PB123456781615141312111091KR【/【/【VCC【/【/【GNDVCCMBMotorGNDVcc1OUT2GND3【10KRVCCGNDGNDVCC