1、河南理工大学本科课程设计报告摘要出租车计价器是乘客与司机双方的交易准则,它是出租车行业发展的重要标志,是出租车中最重要的工具。它关系着交易双方的利益。具有良好性能的计价器无论是对广大出租车司机朋友还是乘客来说都是很必要的。因此,汽车计价器的研究也是十分有一个应用价值的。 而采用模拟电路和数字电路设计的计价器整体电路的规模较大,用到的器件多,造成故障率高,难调试,对于模式的切换需要用到机械开关,机械开关时间久了会造成接触不良,功能不易实现。而采用单片机进行的设计,相对来说功能强大,用较少的硬件和适当的软件相互配合可以很容易的实现设计要求,且灵活性强,可以通过软件编程来完成更多的附加功能。针对计费
2、模式的切换,通过软件编程就可以轻易而举的实现。避免了机械开关带来的不稳定因素。另外在本方案中那个使用了点阵的液晶,可以实现更加友好的使用界面。数据信息一目了然,并且即使是成品也可以方便的修改使用界面,更可根据不同的公司客户使用不同的局面。【关键词】出租车计价器 单片机 控制河南理工大学本科课程设计报告AbstractTaximeter is both passengers and drivers of the transaction criteria, it is the taxi industry an important symbol, a taxi is the most importa
3、nt tools. It relates to the interests of both transactions. Has a good performance regardless of the meter is a vast number of taxi drivers or passengers are very necessary. Therefore, the car meter is also very much a study of value. The use of analog circuits and digital circuit design of the mete
4、r as a whole circuit of a larger scale, using the device, a failure rate is high and difficult to debug, the pattern of switching need to use mechanical switches, mechanical switch will cause a long-time contacts Bad, functions not easy to achieve. SCM used for the design, a relatively powerful, wit
5、h less hardware and appropriate software can easily coordinate with each other to achieve the design requirements, flexibility and strong, can be programmed by software to complete more of the additional Function. Pricing model for the switch, software programming and can easily cite the achievement
6、. To avoid a mechanical switch the destabilizing factors. Also in this programme that the use of a dot-matrix LCD, can be more friendly to use interface. Data information at a glance, and even the finished product can also facilitate the use of interface changes, according to different customers usi
7、ng a different situation.Keywords: Taximeter 89 S52 MCU control河南理工大学本科课程设计报告目 录前 言 .1第一章 方案设计 21.1 功能要求 .21.2 系统工作原理及其组成 .2第二章 硬件设计 42.1 单片机最小系统单元 .42.2 系统的硬件构成及功能 52.3 里程计算、计价单元设计 52.4 数据显示部分 .7第三章 软件设计 83.1 系统主程序 .83.2 中断程序 .93.3 计算程序 .93.4 显示程序 10第四章 系统调试与仿真 114.1 Proteus 仿真 .114.2 硬件调试 14第五章 总结
8、 .15参考文献 .16附录 A:源程序及注释 17河南理工大学本科课程设计报告1前 言近几年来,出租汽车行业在各地得以蓬勃发展,出租车经营更加步入正轨的状态,出租车计价器成为出租车营运中必配的、可靠的计量器具,其使用准备性直接关系到经营者与乘客的经济利益。而随着出租车行业的发展,对出租车计价器的要求也越来越高,用户不仅要求计费器性能稳定,计费准确,有防作弊功能;同时还要求其具有车票资料打印、IC 卡付费和电脑串行通信功能。不同国家和地址的计费方式存在差异,如有些地区有夜间收费及郊区收费等,而有些地区则无夜间收费和郊区收费。但是在实际的运营中,总有不少经营者或乘客反映相同路径,不同车辆的收费有
9、较大出入。计价器的设计早已成熟,但还可以在此基础上增加一些功能,以使得出租车计价器的功能和性能更加完善。出租车已经是城市交通的重要组成部分,从加强行业管理以及减少司机与乘客的纠纷出发,具有良好性能的计价器对出租车司机和乘客来说都是很必要的。而采用模拟电路和数字电路设计的计价器整体电路的规模较大,用到的器件多,造成故障率高,难调试。而采用单片机进行的设计,相对来说功能强大,用较少的硬件和适当的软件相互配合可以很容易地实现设计要求,且灵活性强,可以通过软件编程来完成更多的附加功能。本设计采用 AT89S52 单片机为主控器,并用光电传感器检测转盘转动模拟车速,实现对出租车的多功能的计价设计,输出采
10、用 74HC244 芯片驱动 8 段数码显示管。本电路设计的计价器不但能实现基本的计价,而且还能根据单程,往返和中途等待来调节单价。河南理工大学本科课程设计报告2第一章 方案设计1.1 功能要求1. 用前 4 位数码管实时显示里程数(Z) ,单位为公里,最后一位为小数位;用后 4 位数码管时时显示金额数(J) ,单位为元,最后一位为小数位。2. 规定出租车单程价格为 2 元/公里,往返则价格为 1.5 元/公里;单程/往返分别由“单程” 按键和“往返” 按键设定。3. 车速5 公里/小时的时间累积为总等待时间 T(分钟) ,每 5 分钟等待时间相当于里程数增加 1 公里。4. 起步公里数为 3
11、 公里,价格为 5 元;若实际运行大于 3 公里, 按“设计任务 2”计算价格。5. 用单片机控制电机转动,并用光电传感器检测转盘转动模拟车速,车速与转盘转速成正比。转盘转速为 5 转/秒对应车速为 5 公里/小时,转盘转速为50 转/秒对应车速为 50 公里/小时,依此类推。6. 要求公里数检测误差不超过10。7. 到达目的地后,按“暂停” 键,计价器可暂停计价。8. 按“清除” 键,计价器能将记录数据(里程、等待时间与价格等)自动清 0。9.按“查询”键,能自动显示总等待时间 T,再按下该键回到显示里程数、金额状态。1.2 系统工作原理及其组成出租车计价是根据车所行驶的路程以及乘客乘车的方
12、式综合决定的。出租车行驶总路程可以通过车轮的周长乘车轮旋转圈数得到。即可计算得到车轮旋转几周出租车能行驶一公里的路程。输出的脉冲信号被接入到 AT89S52 单片机系统中,通过计算接收到的脉冲个数,计算出当前所行驶的路程。同时,根据不同的收费标准,选择相应的起步价、单价等收费标准进行计算。74HC244 管理键盘和数码显示,通过键盘能够实现启动、暂停、停止计价器、切换显示当前的行驶里程和需支付的车费。出租车计价器用于记录里程、等待时间、是否往返、起步公里数与价格的河南理工大学本科课程设计报告6关河南理工大学本科课程设计报告3系,它能有效地避免司机与乘客间的矛盾,保障双方的利益。模拟出租车计价器
13、能根据总里程数、总等待时间长短、是否往返、起步公里数的情况作出相应报价等。当然实际的出租车计价器还具有能打印出车票等功能。总体模块如图 1.1 所示。时钟与复位电路按键输入电路信号输入LED 显示器驱动电器发光二极管LED 显示器单 片 机图 1.1 电路的组成部分河南理工大学本科课程设计报告4第二章 硬件设计2.1 单片机最小系统单元主控机系统采用了 Atmel 公司生产的 AT89S52 单片机,它含有 256 字节数据存储器,内置 8K 的电可擦除 FLASH ROM,可重复编程,大小满足主控机软件系统设计,所以不必再扩展程序存储器。复位电路和晶振电路是 AT89S52 工作所需的最简外
14、围电路。单片机最小系统电路图如图 2.1 所示。 1 2 3 4 5 6 7 8ABCD87654321DCBATitleNumber RevisionSizeA3Date: 9-Sep-2010 Sheet of File: H:出出出出出KEY_LED.DDB Drawn By:EA/VP31X119X218RESET9RD17WR16INT012INT113T014T115P101P112P123P134P145P156P167P178P00 39P01 38P02 37P03 36P04 35P05 34P06 33P07 32P20 21P21 22P22 23P23 24P24 2
15、5P25 26P26 27P27 28PSEN 29ALE/P 30TXD 11RXD 10JP1STC89C52R210kC110ufVCCC130pfC230pfY112MHZVCCcsclockdatakey图 2.1 单片机最小系统图AT89S52 的复位端是一个史密特触发输入,高电平有效。RST 端若由低电平上升到高电平并持续 2 个周期,系统将实现一次复位操作。在复位电路中,按一下复位开关就使在 RST 端出现一段时间的高电平,外接 11.0592M 晶振和两个AT89S52河南理工大学本科课程设计报告630pF 电河南理工大学本科课程设计报告5容组成系统的内部时钟电路。2.2 系
16、统的硬件构成及功能计价器的单片机控制方案图如图 1 所示。它由以下几个部件组成:单片机AT89S51、总金额及单价显示部件、键盘控制部件、里程计算单元、串中显示驱动电路等。利用单片机丰富的 IO 端口,及其控制的灵活性,实现基本的里程计价功能和价格调节、时钟显示功能。不但能实现所要求的功能而且能在很大的程度上扩展功能,而且还可以方便的对系统进行升级。具体电路参见“多功能出租车计价器总体电路图” 。 图 2.2 总体电路图2.3 里程计算、计价单元设计里程计算是通过安装在车轮上的霍尔传感器A44E检测到的信号,送到单片机,经处理计算,送给显示单元的。其原理如图2-3所示。图 2-3 传感器测距示
17、意图P3.4AT89S52AT89S52河南理工大学本科课程设计报告6由于 A44E 属于开关型的霍尔器件,其工作电压范围比较宽(4.518V) ,其输出的信号符合 TTL 电平标准,可以直接接到单片机的 IO 端口上,而且其最高检测频率可达到 1MHZ。集成开关型霍尔传感器原理如图 2-4 所示。图 2-4 集成开关型霍耳传感器原理图A44E 集成霍耳开关由稳压器 A、霍耳电势发生器(即硅霍耳片)B、差分放大器 C、施密特触发器 D 和 OC 门输出 E 五个基本部分组成。在输入端输入电压 ,经稳压器稳压后加在霍耳电势发生器的两端,根据霍耳效应原理,当霍cV耳片处在磁场中时,在垂直于磁场的方
18、向通以电流,则与这二者相垂直的方向上将会产生霍耳电势差 输出,该 信号经放大器放大后送至施密特触发器HVH整形,使其成为方波输送到 OC 门输出。当施加的磁场达到工作点.(即 )时,opB触发器输出高电压(相对于地电位)使三极管导通,此时 OC 门输出端输出低电压,通常称这种状态为“开” 。当施加的磁场达到释放点(即 )时,触发器输rp出低电压,三极管截止,使 OC 门输出高电压,这种状态为“关” 。这样两次电压变换,使霍耳开关完成了一次开关动作。其集成霍耳开关外形及接线如图 2-5 所示。河南理工大学本科课程设计报告6图 2-5 集成霍耳开关外形及接线河南理工大学本科课程设计报告7我们选择了
19、 P3.4 口作为信号的输入端,内部采用外部中断 0(这样可以减少程序设计的麻烦),车轮每转一圈(我们设车轮的周长是 1 米),霍尔开关就检测并输出信号,引起单片机的中断,对脉冲计数,当计数达到 1000 次时,也就是 1 公里,单片机就控制将金额自动的加增加,其计算公式:当前单价 公里数=金额。2.4 数据显示部分由于设计要求有单价(2 位)、总金额(3 位)和里程( 3 位)显示输出,采用 LCD 液晶段码显示,在距离屏幕 1 米之外就无法看清数据,不能满足要求,而且在白天其对比度也不能够满足要求,因此我们采用 8 位 LED 数码管来显示。本设计的数据显示采用 74HC244 来驱动(共
20、阳 )的方法。河南理工大学本科课程设计报告8开 始计数器、I/O、中断初始化、开计数器有无乘客P3.4=1?显示起步价 5 元显示 0第三章 软件设计软件是单片机系统的灵魂,根据设计的要求,在本系统中主要有主程序、中断服务程序和键盘显示子程序、计算子程序等。在主程序中主要完成了寄存器的初始化部分以及对键盘和显示的控制。而现在应用更广泛的是单片机 C 语言,因其简单明了,故此次课程设计采用单片机 C 语言编程。3.1 系统主程序 在主程序模块中,需要完成对各参量和接口的初始化、出租车起价和单价的初始化以及中断、计算、循环等工作。另外,在主程序模块中还需要设置启动/清除标志寄存器、里程寄存器和价格
21、寄存器,并对它们进行初始化。然后,主程序将根据各标志寄存器的内容,分别完成启动、清除、计程和计价等不同的操作。 当汽车运行起来时,就启动计价,根据里程寄存器中的内容计算和判断行驶里程是否已超过起步价公里数。若已超过,则根据里程值、每公里的单价数和起步价数来计算出当前的总金额,并将结果存于总金额寄存器中;中途等待时,无脉冲输入,不产生中断,当时间超过等待设定值时,开始进行计时,并把等待价格加到总金额里,然后将总金额、里程和单价、往返价格送数码管显示出来。程序流程如图 3.1 所示。图 3-1 程序流程图河南理工大学本科课程设计报告9里程3?总金额=起步价总金额+=(里程-3)* 单价调用计算程序
22、总金额+= 等待时间*等待单价返回总金额=起步价总金额+= 等待时间*等待单价3.2 中断程序 每当光电传感器输出一个低电平信号就使单片机中断一次,当里程计数器对里程脉冲计满 50 次时,进入里程计数中断服务程序中,里程变量加一。主函数中总金额也相应地变化。 流程图如图 3-2开始保护现场重置计数初值中断 1 0次 ?计算车速车速 #define uchar unsigned char#define uint unsigned intuchar code table=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;sbit P17=P17;s
23、bit zt=P30;sbit qc=P31;sbit cx=P32;sbit dc=P36;sbit wf=P37;sbit ks=P01;sbit P01=P01;sbit P03=P03;sbit P04=P04;sbit P05=P05;sbit P07=P07;uchar num1,t0,miao,num2,num3,num4,miao1,flag1,flag2,flag3,flag4,flag5,flag6,flag;float jg ;int num,cs,lc,csh,s,jq=0;ddsj,xs;void delay1(uint x) /延时时基为 1msint i,j;fo
24、r(i=x;i0;i-)for(j=1000;j0;j-);void delay2(uchar n)uchar x,y;for(x=n;x0;x-)for(y=110;y0;y-);void key()if(dc=0) if(flag4=1) flag4=0;flag3+;jg=2;if(flag3=1P07=1;if(wf=0) if(flag3=1) flag3=0;flag4+;jg=1.5; if(flag4=1 P05=1;if(zt=0) delay1(7);河南理工大学本科课程设计报告18 if(zt=0) while(!zt);flag2+;if(flag2=1) TR0=0;
25、TR1=0;P03=0;if(flag2=2) flag2=0;TR0=1;TR1=1; P03=1;if(qc=0) delay1(2); flag=0;if(qc=0) lc=0;jq=0;ddsj=0;flag6=1;/flag=1;if(cx=0) delay1(7); flag=0;if(cx=0) while(!cx);flag1+;if(flag1=1) TR0=0;TR1=0;P04=0;xs=ddsj;jq=0;flag=1;if(flag1=2) TR0=1;TR1=1;P04=1;flag=0;flag1=0;void display() P1=tablexs/1000;
26、P2=0x80;delay2(2);P1=0xff;P1=tablexs/100%10;P2=0x40;delay2(2);河南理工大学本科课程设计报告19P1=0xff;P1=tablexs%100/10;P2=0x20;P17=0;delay2(2);P1=0xff;P1=tablexs%10;P2=0x10;delay2(2);P1=0xff;P1=tablejq/1000;P2=0x08;delay2(2);P1=0xff;P1=tablejq/100%10;P2=0x04;delay2(2);P1=0xff;P1=tablejq%100/10;P2=0x02;P17=0;delay2
27、(2);P1=0xff;P1=tablejq%10;P2=0x01;delay2(2);P1=0xffvoid init()TMOD=0x26;TH1=6;TL1=6;TH0=255;TL0=255;EA=1;ET0=1;ET1=1;TR0=1;TR1=1; void timer1() interrupt 3num1+;if(num1=40)num1=0;num2+;if(num2=100)num3+;/五分钟判断标志河南理工大学本科课程设计报告20num4+;num2=0;cs=csh;/如果每秒次数大于 200 次就超过 5 公里每小时csh=0; void timer0() interrupt 1csh+;num+;if(num=20)num=0;lc+; void main()ddsj=0;init();while(1)key();if(flag!=1) if(cs200)if(num4=60) num4=0;ddsj+;if(num3=300)/五分钟到里程?num3=0;lc=lc+10;if(lc=30)jq=50;elsejq=(lc-30)*jg+50; elseif(lc=30)jq=50;elsejq=(lc-30)*jg+50; xs=lc; display();