出租车计价器 1.docx
《出租车计价器 1.docx》由会员分享,可在线阅读,更多相关《出租车计价器 1.docx(28页珍藏版)》请在冰豆网上搜索。
出租车计价器1
河南理工大学
《单片机应用与仿真训练》设计报告
出
租
车
计
价
器
姓名:
李冰陈会勇
学号:
321308010220
321308010217
专业班级:
电气本2班
指导老师:
王莉
所在学院:
电气工程与自动化学院
2014年4月15日
摘要
随着出租车行业的发展,出租车行业已经是城市交通的重要组成部分,从加强行业管理以及减少与乘客的纠纷出发,以单片机为核心的智能出租车计价系统的开发就显得尤其重要。
本设计采用89C51单片机为主控器,以霍尔传感器测距,实现对出租车的多功能的计价设计。
并且还添加有其他的附加设计,使司机师傅操作起来更加方便,例如,按暂停键,计价器可暂停计价,按查询键,可显示总等待时间等。
关键词:
89C51,霍尔传感器
目录
一、概论3
1、前言3
2、设计的意义3
3、设计任务3
4、设计的目的和要求4
二、系统总体方案及硬件设计5
1、系统总体方案5
2、霍尔传感器检测单元5
3、键盘调整单元6
三、软件设计8
1、系统主程序8
2、中断程序9
2.1、里程计数中断程序9
2.2、中途等待中断程序9
2.3、计算程序9
2.4、显示程序9
2.5、键盘程序10
四、Proteus软件仿真11
五、实物图12
六、程设计心得体会13
参考文献13
附1:
源程序代码14
附2:
系统原理图22
一概述
1、前言
计价器是出租汽车的经营者和乘坐出租汽车的消费者之间用于公平贸易结算的工具,因而计价器计价准确与否,直接关系到经营者和消费者的经济利益。
依据国家有关法律、法规,出租汽车计价器是列入国家首批强制检定的工作计量器具之一,也是近年来国家质量技术监督部门强化管理的六类重点计量器具之一。
在出租车是城市交通的重要组成部分,行业健康和发展也获得越来越多的关注。
汽车计价器是乘客与司机双方的交易准则,它是出租车行业发展的重要标志,是出租车中最重要的工具。
它关系着交易双方的利益。
具有良好性能的计价器无论是对广大出租车司机朋友还是乘客来说都是很必要的。
出租车已经成为我国城市公共交通的重要组成部分和现代化城市必备的基础设施,成为人们工作、生活中补课缺少的交通工具。
而出租车计价器在出租汽车服务行业中占着极为重要的地位,因为出租车必须安装出租车计价器才能投入正常的运营。
出租车计价器是一种能根据乘客乘坐汽车行驶距离和等候时间的多少进行计价,并直接显示车费值得计量器具。
计价器是出租汽车经营者和乘坐出租汽车的消费者之间用于公平贸易结算的工具,因而计价器准确与否,直接关系到经营者和消费者的经济利益。
依据国家有关法律、法规,出租车计价器是列入国家首批强制检定的工作计量器具之一,也是近年来国家质量技术监督部门强化管理的的六类重点计量器具之一。
2、设计的意义
在出租车时城市交通的重要组成部分的大环境下,行业的健康和发展也获得越来越多的关注。
汽车计价器是乘客与司机双方的交易准则,它是出租车行业发展的重要标志,是出租车种最重要的工具。
她关系着交易双方的利益。
具有良好性能的计价器无论是对广大出租车司机朋友还是乘客来说都是很必要的。
因此,汽车计价器的研究也是十分有应用价值的,尤其是对于出租车行业有着极其重要的意义。
3、设计任务
本设计是采用AT89C51单片机为主控器,以霍尔传感器测距,实现对出租车的多功能的计价设计,输出采用8段数码显示管。
本电路设计的计价器不但能实现基本的计价,而且还能根据单程,返程和起步来调节单价,并实现了暂停和等待时间查询的功能。
4、设计的目的和要求
目的:
通过单片机课程设计,熟练掌握c语言的编程方法,将理论联系到实践中去,提高我们的动脑和动手的能力。
通过出租车计价器系统的设计,掌握单片机个资源的使用方法,和简单程序的编写,最终提高我们的逻辑抽象能力。
基本要求:
(1)能显示里程,单位为公里,最后一位为小数位。
(2)能显示金额数,单位为元,最后一位为小数位。
(3)可设定单程价格和往返价格,单程价格为2元/公里,往返价格为1.5元/公里。
(4)车速<5公里/小时的时间累积为总等待时间,每5分钟等待时间相当于里程数增加1公里。
(5)起步公里数为3公里,价格为5元,若实际距离大于3公里,按规则3计算价格。
(6)按暂停键,计价器可暂停计价,按查询键,可显示总等待时间。
二系统总体方案及硬件设计
1、系统总体方案
模拟计数器系统主要由四大模块组成:
霍尔传感器、AT89C51单片机、独立键盘。
霍尔传感器安装在车轮的旁侧,主要检测汽车行进的公里数,并产生一系列相应的脉冲输出,脉冲送到单片机进行处理,单片机根据程序设定通过计算脉冲数换算出行驶公里数,再根据价格等相关数据进行金额的计算,计算好的金额、里程都实时地显示在数码管上。
独立键盘可以调节价格等相关数据,按下相应的按钮,产生信号交由单片机处理并实时显示出来。
总体方案结构图如下:
图2.1系统总体结构框图
2、霍尔传感器检测单元
属于开关型的霍尔器件,其工作电压范围比较宽(4.5~18V),其输出的信号符合TTL电平标准,可以直接接到单片机的IO端口上,而且其最高检测频率可达到1MHZ。
集成霍耳开关由稳压器A、霍耳电势发生器(即硅霍耳片)B、差分放大器C、施密特触发器D和OC门输出E五个基本部分组成。
在输入端输入电压Vcc,经稳压器稳压后加在霍尔电势发生器的两端,根据霍尔效应原理,当霍尔片处在磁场中时,在垂直于磁场的方向通以电流,则与这二者相垂直的方向上将会产生霍尔电势差VH输出,该VH信号经放大器放大后送至施密特触发器整形,使其成为方波输送到OC门输出。
当施加的磁场达到工作点(即Bop)时,触发器输出高电压(相对于地电位),使三极管导通,此时OC门输出端输出低电压,三极管截止,使OC门输出高电压,这种状态为关。
这样两次电压变换,使霍尔开关完成了一次开关动作。
霍尔传感器原理如图5所示。
图2.2传感器测距示意图
里程计算是通过安装在车轮上的霍尔传感器检测到的脉冲信号,送到单片机产生中断,单片机再根据程序设定,计算出里程。
其原理如图2.4所示。
本系统选择了将霍尔传感器的脉冲输出口接到P3.3口外部中断1作为信号的输入端(这样可以减少程序设计的麻烦),车轮每转一圈(设车轮的周长是5米),霍尔开关就检测并输出信号,引起单片机的中断,对脉冲计数,当计数达到200次时,即1公里,单片机就控制将金额自动增加,如图2.5(霍尔传感器)。
图2.3霍尔传感器
3、键盘调整单元
当单价等信息需要进行修改时,就要用到键盘进行修改。
由于调节信息不多,故采用4个独立键盘即可,分别实现清零、切换、增大、减小和功能等作用。
电路原理如图所示。
图2.4键盘调整模块
S1:
接P1.1口,实现路程和单价的切换。
S2:
接P1.2口,实现单程和往返程的切换。
S3:
接P1.3口,实现清零功能(在按下查询总价键之后实现)。
S4:
接P1.4口,暂停功能。
S5:
接P1.5口,对等待时间进行查询。
S6:
接P1.6口,查询总价。
三软件设计
1、系统主程序
在主程序模块中,需要完成对各参量和接口的初始化、出租车起步价和单价的初始化以及中断、计算、循环等工作。
另外,在主程序模块中还需要设置启动/清除标志寄存器、里程寄存器和价格寄存器,并对它们进行初始化。
然后,主程序将根据各标志寄存器的内容,分别完成启动、清除、计程和计价等不同的操作。
3.1主程序流程图
当汽车运行起来时,就启动计价,根据里程寄存器中的内容计算和判断行驶里程是否已超过起步价公里数。
若已超过,则根据里程值、每公里的单价数和起步价数来计算出当前的总金额,并将结果存于总金额寄存器中;中途等待时,脉冲输入小于设定值时,当时间超过等待设定值时,开始进行计时,并把等待价格加到总金额里,然后将总金额、里程送数码管显示出来。
程序流程如图所示。
2、中断程序
2.1、里程计数中断程序
每当霍尔传感器输出一个低电平信号就使单片机中断一次,当里程计数器对里程脉冲计满1500次时,进入里程计数中断服务程序中,里程变量加一。
主函数中总金额也相应地变化。
在中途等待中断程序中,每1ms产生一次中断,将由当前里程计算出速度值送入某个缓存变量。
把当前速度值与预先设定的速度值相比较,当小于设定的车速时,进入等待计时。
等待时间5分钟相当于里程增加一公里。
流程如图3.4所示:
图3.2中断流程
2.2、中途等待中断程序
在中途等待中断程序中,每1ms产生一次中断,将当前里程值送入某个缓存变量,每5分钟将缓存变量中的值和当前里程值比较,当汽车车速小于5公里/小时,将存储器里面的值与实时测量的值比较,当行进的里程小于5公里每分钟时,则进入等待计时,每5分钟记一次价格。
2.3、计算程序
计算程序根据里程数分别进入不同的计算公式。
如果里程大于3公里,则执行公式:
总金额=起步价+(里程-3)*单价+等待时间*等待单价;否则,执行公式:
总金额=起步价+等待时间*等待单价。
程序流程图如图所示。
3.3计算程序流程图
2.4、显示程序
程序利用定时器每1ms产生一次中断,相应变量置位,点亮一个数码管,显示一位数据,利用主函数内的循环,实现动态扫描显示,同时根据数码管余辉和人眼暂留现象,即可实现显示。
{0x3f,0x06,0x05b,0x04f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段码表示0-9
图3.4显示子程序流程
2.5、键盘程序
键盘实质上是一组按键开关的集合,均利用机械触点的合、断作用。
按键在闭合及断开的瞬间均伴随有一连串的抖动,抖动反应在电压上就是呈现出高电平或低电平,为了确保CPU对一次按键动作只确认一次,必须消除抖动的影响。
去抖通常有硬件去抖和软件去抖两种方法,本程序使用软件延时去抖。
图3.5按键抖动信号波形
对于独立式键盘判键,首先看有键按下不,如果有键按下则延时一会儿,在判断是否真的有键按下,如果确实有键按下,再判键释放,最后执行键功能程序。
判键子函数的流程框图如图3.5所示:
图3.6判键子程序流程图
四Proteus软件仿真
Proteus软件是来自英国Labcenterelectronics公司的EDA工具软件,它组合了高级原理布图、混合模式SPICE仿真,PCB设计以及自动布线来实现一个完整的电子设计系统。
此系统受益于15年来的持续开发,被《电子世界》在其对PCB设计系统的比较文章中评为最好产品—“TheRoutetoPCBCAD”。
Proteus产品系列也包含了我们革命性的VSM技术,用户可以对基于微控制器的设计连同所有的周围电子器件一起仿真。
用户甚至可以实时采用诸如LED/LCD、键盘、RS232终端等动态外设模型来对设计进行交互仿真。
其功能模块:
—个易用而又功能强大的ISIS原理布图工具;PROSPICE混合模型SPICE仿真;ARESPCB设计。
PROSPICE仿真器的一个扩展PROTEUSVSM:
便于包括所有相关的器件的基于微处理器设计的协同仿真。
此外,还可以结合微控制器软件使用动态的键盘,开关,按钮,LEDs甚至LCD显示CPU模型。
支持许多通用的微控制器,如PIC,AVR,HC11以及89C51。
最新支持ARM。
交互的装置模型包括:
LED和LCD显示,RS232终端,通用键盘,I2C,SPI器件。
强大的调试工具,包括寄存器和存储器,断点和单步模式。
IARC-SPY和KeiluVision2等开发工具的源层调试。
应用特殊模型的DLL界面-提供有关元件库的全部文件。
五实物图
实物展示图
六程设计心得体会
通过这次课程设计,我掌握了数码管的识别和测试;熟悉了霍尔传感器的工作原理,了解了独立按键的分配方法;以及如何提高计时精度的性能等等,掌握了proteus应用的方法和技术,通过查询资料,也了解了出租车计价器的工作原理。
课程设计诚然是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门辩思课,给了我许多道,给了我很多思,给了我莫大的空间。
同时,设计让我感触很深。
使我对抽象的理论有了具体的认识。
在这次课程设计中,我一开始是在上网找资料,根据找到的霍尔传感器电路资料。
我们直接按照资料焊了元件,由于我们考虑到了原件的限制,所以对电路做了一些改动。
我们根据实际需要对我们的电路进行改动,而且可以很自信的进行焊接。
但是我们对仿真软件不熟悉,焊电路时没有仿真的支持,出了几次错误。
我把所有可能出错的地方查了一边,结果是电位器出了问题,看来不仿真就不能百分之百的成功,还需要实践来检验。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
动手能力有待提高,对计算机有关软件的使用也应该熟练。
通过本次课程设计,又使我学到了许多书本上无法学到的知识,也使也深该体会到单片机技术应用领域的广泛,不仅使我对学过的单片机知识有了很多的巩固,同时也对单片机这一门课程产生了更大的兴趣。
在本次课程设计过程中,我学会了在网络上查找有关本设计的各硬件的资源,其中包括:
AT89S51单片机及其引脚说明、AT24C02引脚图及其引脚功能等,为本次课程设计提供了一定的资料。
由于平时很少进行课程设计,所以对于课程设计报告的格式也是近期才接触到,经过这两次的设计,为我们以后毕业设计的制作也奠定了一定的基础。
参考文献
【1】《模拟电子技术基础》艾永乐付子义编.北京:
中国电力出版社,2008
【2】王晓明.单片机接口技术.北京航空航天大学出版社,2007
【3】《电子技术实践》阎有运编.北京:
中国矿业大学出版社。
【4】《实用电子电路200例》张庆双等编北京:
机械工业出版社,2003。
【5】王晓敏.传感器检测技术及应用.北京大学出版社,2010.
附1:
源程序代码
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbitdeng1=P1^1;//暂停
sbitdeng2=P1^2;//白天黑夜
sbitdeng3=P1^3;//单双程
sbitkey0=P1^4;//功能键切换
sbitkey1=P1^5;//白天黑夜
sbitkey2=P1^6;//单双程
sbitkey4=P1^7;//确认
sbitp11=P2^1;//数码管各位位选,里程数,总金额,单价
sbitp12=P2^2;
sbitp13=P2^3;
sbitp21=P2^5;
sbitp22=P2^6;
sbitp23=P2^7;
sbitp31=P2^0;
sbitp32=P2^4;
uintzongjine,licheng,licheng_1,zanting,licheng_2;
uintlunquan,aa,bb,dengdai;
uinttemp_1,temp_2,shezhi_1;
uchardanjia1,danjia2,danjia,qiehuan;
ucharmiao,fen;
voiddisplay(void);
/*********************
延时时基为1ms
************************/
voiddelay_ms(uintx)
{
inti,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
/*******************
按键消抖
********************/
ucharread_key(ucharxuanze)
{
ucharshezhi=0,key_wei=0;
key_wei=xuanze;
P1|=0xf0;
if(key_wei==1)//读取白天,黑夜键值
{
while
(1)
{
if(!
key1)
{
delay_ms(5);
if(!
key1)
{
while(!
key1);
shezhi++;
}
if(shezhi==2)shezhi=0;
}
if(!
key4)
{
delay_ms(80);
if(!
key4)
{
while(!
key4);
break;
}
}
if(shezhi==1)deng2=0;
elseif(shezhi==0)deng2=1;
}
}
elseif(key_wei==2)//读取单程,双程键值
{
while
(1)
{
if(key2==0)
{
delay_ms(5);
if(key2==0)
{
while(!
key2);
shezhi++;
}
if(shezhi==2)shezhi=0;
}
if(key4==0)
{
delay_ms(80);
if(key4==0)
{
while(!
key4);
break;
}
}
if(shezhi==1)deng3=0;
elseif(shezhi==0)deng3=1;
}
}
elseif(key_wei==3)//读取显示数据键值
{
if(key0==0)
{
display();
display();
if(key0==0)
{
while(!
key0)display();
shezhi_1++;
}
if(shezhi_1==2)shezhi_1=0;
}
shezhi=shezhi_1;
}
returnshezhi;
}
/*******************
函数初始化
***********************/
voidinit()
{
P1=0xff;
P2=0x00;
P0=table[0];
zongjine=0;
licheng=0;
dengdai=0;
qiehuan=0;
danjia1=read_key
(1);//读取白天,黑夜
danjia2=read_key
(2);//读取单程,双程
danjia=20-(5*danjia2);
EA=1;//开总中断
EX0=1;//开外部中断0
EX1=1;//开外部中断1
IT0=1;//触发方式下降沿
IT1=1;//触发方式下降沿
PX1=1;//外部中断1,暂停设为高优先级
TMOD=0x11;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;//填入1ms初值
ET0=1;//开定时器T0中断
TR0=1;//开定时器T0
}
/*************************
总金额计算
*****************************/
voidjisuan()
{
uinta;
if(licheng>=3)
{
a=licheng_2-60;
zongjine=(danjia*a)/20+50;//金额计算
}
else
zongjine=50;//起步公里内金额计算
}
/**********************************
数码管显示总金额、里程数
***********************************/
voiddisplay_1(uintzongjine_0,uintlicheng_0)
{
ucharjbai,jshi,jge,lshi,lge,lxiao;
jbai=zongjine_0/100;//数码管位置分配
jshi=(zongjine_0%100)/10;
jge=zongjine_0%10;
lshi=licheng_0/100;
lge=(licheng_0%100)/10;
lxiao=licheng_0%10;
P0=0xff;//数码管动态显示
P2=0xff;
p11=0;P0=table[jbai];delay_ms
(1);
p11=1;p12=0;P0=table[jshi]|0x80;delay_ms
(1);
p12=1;p13=0;P0=table[jge];delay_ms
(1);
p13=1;p21=0;P0=table[lshi];delay_ms
(1);
p21=1;p22=0;P0=table[lge]|0x80;delay_ms
(1);
p22=1;p23=0;P0=table[lxiao];delay_ms
(1);
p23=1;
}
/*******************************
数码管显示时间、单价
*********************************/
voiddisplay_2(ucharfen_0,ucharmiao_0,uchardanjia_0)
{
ucharsfen,gfen,smiao,gmiao;
uchardshi,dge;
dshi=danjia_0/10;
dge=danjia_0%10;
sfen=fen_0/10;
gfen=fen_0%10;
smiao=miao_0/10;
gmiao=miao_0%10;
P0=0xff;
P2=0xff;
p31=0;P0=table[sfen];delay_ms
(1);
p31=1;p11=0;P0=table[gfen]|0x80;delay_ms
(1);
p11=1;p12=0;P0=table[smiao];delay_ms
(1);
p12=1;p13=0;P0=table[gmiao];delay_ms
(1);
p13=1;p22=0;P0=table[dshi]|0x80;delay_ms
(1);
p22=1;p23=0;P0=table[dge];delay_ms
(1);
p23=1;
}
/***************
显示内容选择
*******************/
voiddispl