课设报告河南理工大学单片机 出租车计价器.docx
《课设报告河南理工大学单片机 出租车计价器.docx》由会员分享,可在线阅读,更多相关《课设报告河南理工大学单片机 出租车计价器.docx(30页珍藏版)》请在冰豆网上搜索。
课设报告河南理工大学单片机出租车计价器
摘要
出租车已经是城市交通的重要组成部分,从加强行业管理以及减少司机与乘客的纠纷出发,具有良好性能的计价器对出租车司机和乘客来说都是很必要的。
而采用模拟电路和数字电路设计的计价器整体电路的规模较大,用到的器件多,造成故障率高,难调试。
而采用单片机进行的设计,相对来说功能强大,用较少的硬件和适当的软件相互配合可以很容易地实现设计要求,且灵活性强,可以通过软件编程来完成更多的附加功能。
本设计主要通过利用STC单片机作为主控制器,霍尔传感器模拟测定车速,采取缩距法来对出租车的行驶里程、计费时间、应交钱数进行智能显示。
该设计为了能够更加精确地显示各个计数值,利用缩距法对不同情况下车费进行了编程及显示:
(1)可设定单程和往返的不同价格,单程价格为2元/公里,往返价格为1.5元/公里,则显示收费不同;
(2)等待时间的计费标准为车速<5公里/小时的时间累积为总等待时间,每5分钟等待时间相当于里程数增加1公里;
(3)起步公里数为3公里,价格为5元,若实际距离大于3公里,按”规则3”计算价格。
出租车计价器的设计含有复位电路,时钟电路,键盘电路等多个电路。
通过按键模拟出租车的运行,暂停,停止。
在出租车上需要一个能准确获得车轮转动即路量信号的装置,该设计中的霍尔传感器3144则很好地实现了这一功能。
利用霍尔传感器感应小电机带动磁片转动的圈数,来模拟实际生活中车轮转动。
可以精确将收集来的标准脉冲信号送入单片机的定时/计数器。
在八位数码管上可以显示不同情况下运行的时间和总的路程,通过计算可以得出总共的费用。
1概述………………………………………………………………………………
1.1(宋体、小四,行间距固定值18磅。
以下相同要求)……………………
1.2
1.3
附2:
系统原理图2
1.2功能能要求4
2系统总体方案及硬件设计(宋体、小四,加粗,固定值18磅。
以下相同要求)
2.1
2.2
2.3
3软件设计
3.1
3.2
3.3
4Proteus软件仿真
5课程设计体会
参考文献
附1:
源程序代码
附2:
系统原理图
1概述
1.1课题简介
出租车已经是城市交通的重要组成部分,从加强行业管理以及减少司机与乘客的纠纷出发,具有良好性能的计价器对出租车司机和乘客来说都是很必要的。
为此,我们采用单片机系统设计了一款符合大众化的计费系统。
本方案以STC10单片机为中心、配合LED数码管,实现对出租车计价统计。
本方案可以实现:
1.系统接收里程传感器的脉冲输入,并对脉冲进行计数,继而转换为里程。
2.采用现行出租车的计价系统的计算方法,并对行驶里程进行计费,提供友好的用户界面,并具有发光二极管指示操作状态功能。
1.2功能能要求
利用STC10片机配合LED数码管,实现基本的出租车计价功能,具体设计规格如下:
1.用前4位数码管实时显示里程数,单位为公里,最后一位为小数位;用后4位数码管时时显示金额数,单位为元,最后一位为小数位。
2.规定出租车单程价格为2元/公里,往返则价格为1.5元/公里;单程/往返分别由“单程”按键和“往返”按键设定。
3.车速<5公里/小时的时间累积为总等待时间,每5分钟等待时间相当于里程数增加1公里。
4.起步公里数为3公里,价格为5元;若实际运行大于3公里,按“规则3”计算价格。
5.到达目的地后,按“暂停”键,计价器可暂停计价。
6.按“清除”键,计价器能将记录数据(里程、等待时间与价格等)自动清0。
7.按“查询”键,能自动显示总等待时间,再按下该键回到显示里程数、金额状态。
8.扩展:
空车指示、语音提示、信息存储等
2出租车计价器的设计课设要求与实现方案
2.1出租车计价器设计要求
(1)能显示里程,单位为公里,最后一位为小数位。
(2)能显示金额数,单位为元,最后一位“元”。
(3)可设定单程价格和往返价格,单程价格为2元/公里,往返价格为1.5元/公里。
(4)车速<5公里/小时的时间累积为总等待时间,每5分钟等待时间相当于程数增加1公里。
(5)起步公里数为3公里,价格为5元,若实际距离大于3公里,按”规则3”计算价格。
(6)按暂停键,计价器可暂停计价,按查询键,可显示总等待时间。
扩展:
空车指示、语音提示、信息存储等
缩距法要求:
出租车金额每次加1元,变价点为:
“起步里程+n*1元/单价”(n=0,1,2…)。
例如,起步里程为3公里,起步金额为5元,单价为2元/公里。
则:
0-2.9公里
3公里(变价点)
3-3.4公里
3.5公里(变价点)
3.5-3.9公里
5元
6元
6元
7元
7元
显示内容:
显示方式:
采用LED数码管显示
显示内容:
金额、里程、等待时间
正常显示:
“里程”、“金额”,“等待时间”仅在查询时显示
数码管数量:
2个四合一数码管
按键操作:
按键设置“单程”、“双程”、“白天”、“晚上”
按键查询“等待时间”
按键“暂停”
按键“清零”
指示显操作状态:
LED指示单程、双程
LED指示查询
LED指示空车
2.2出租车计价器实现方案
方案一:
采用数字电子技术,利用555定时芯片构成多谐振荡器,或采用外围的晶振电路作为时钟脉冲信号,采用计数芯片对脉冲尽心脉冲的计数和分频,最后通过译码电路对数据进行译码,将译码所得的数据送给数码管显示,下是该方案的流程框图,方案一如下图所示:
方案
方案一
方案二:
出租车行驶总路程可以通过车轮的周长乘车轮旋转圈数得到。
即可计算得到车轮旋转几周出租车能行驶一公里的路程。
因此,使用霍尔传感器就可以方便地计量车轮旋转的圈数。
可在车轮转盘上粘一个小磁钢,当转轮转动时,霍尔传感器检测到磁场及其变化,产生脉冲信号。
输出的脉冲信号被接入到STC10单片机系统中,通过计算接收到的脉冲个数,计算出当前所行驶的路程。
同时,根据不同的收费标准,选择相应的起步价、单价等收费标准进行计算。
再配置上键盘和数码显示,通过键盘能够实现启动、暂停计价器、切换显示当前的行驶里程和需支付的车费。
方案二如下图所示:
方案二
方案比较:
通过两个方案的比较,本次采用方案二,不但控制简单,而且成本低廉,设计电路简单且设计要求需要用单片机以及霍尔传感器。
至于方案一在课余时间可以自行设计完成,以对自己能力的提高。
2.3出租车计价系统的硬件设计
2.31STC10单片机介绍
其引脚如下图所示;
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行。
校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89S52的一些特殊功能口,P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电
平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:
当/EA保持低电平时,则在此期间选择外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
P3口也可作为AT89C51的一些特殊功能口,其功能如下:
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2/INT0(外部中断0)
P3.3/INT1(外部中断1)
P3.4T0(记时器0外部输入)
P3.5T1(记时器1外部输入)
P3.6/WR(外部数据存储器写选通)
P3.7/RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
最小系统1:
晶振
最小系统2:
复位电路
通过复位电路控制单片机工作与关闭
最小系统三:
程序传输接口
2.32出租车计价器路程模拟(霍尔传感器)
里程计算是通过安装在车轮上的霍尔元件检测到的信号,送到单片机,经过处理计算,送给显示显示单元的。
霍尔传感器是一种磁传感器。
用它可以检测磁场及其变化,可在各种与磁场有关的场合中使用。
霍尔传感器以霍尔效应为其工作基础,是由霍尔元件和它的附属电路组成的集成传感器。
霍尔传感器分为线性型霍尔传感器和开关型霍尔传感器两种。
我们所用的是开关型霍尔传感器。
其原理图如下图所示:
3144属于开关型的霍尔器件,其工作电压范围比较宽(4.5~24V),其输出的信号符合TTL电平标准,可以直接接到单片机的IO端口上,而且其最高检测频率可达到1MHZ。
3144集成霍耳开关由稳压器A、霍耳电势发生器(即硅霍耳片)B、差分放大器C、施密特触发器D和OC门输出E五个基本部分组成。
在输入端输入电压Vcc,经稳压器稳压后加在霍尔电势发生器的两端,根据霍尔效应原理,当霍尔片处在磁场中时,在垂直于磁场的方向通以电流,则与这二者相垂直的方向上将会产生霍尔电势差VH输出,该VH信号经放大器放大后送至施密特触发器整形,使其成为方波输送到OC门输出。
当施加的磁场达到工作点(即Bop)时,触发器输出高电压(相对于地电位),使三极管导通,此时OC门输出端输出低电压,三极管截止,使OC门输出高电压,这种状态为关。
这样两次电压变换,使霍尔开关完成了一次开关动作。
3144霍尔传感器内部连接图
3144霍尔传感器输出电压图
2.33出租车计价器显示模块
两块四合一共阴极数码管
A1、A2、A3、A4分别为四位数码管的位选码。
a、b、c、d、e、f、g、dp分别是四位数码管段码。
在本次课程设计中两块数码管的断码均与单片机P1口相接。
位码选择:
一个数码管与单片机P0^0-P0^3相连,另一数码管位码与P2^0-P2^3相接。
2.34按键控制模块
按键1:
暂停键,可以暂停所有数码管的显示,按一次暂停,再按一次恢复
按键2:
单价为2.0元设置键
按键3:
单价为1.5元设置键
按键4:
路程与与时间切换键
按键5:
空车指示控制键
按键6;数码管清0,系统复位键
2.35状态指示
LED1:
暂停状态指示
LED2:
单价为2.0元状态指示
LED3:
单价为1.5元状态指示
LED4:
空车状态指示
3出租车计价器的软件设计
3.1系统主程序
在主程序模块中,需要完成对各参量和接口的初始化、出租车起步价和单价的初始化以及中断、计算、循环等工作。
当汽车运行起来时,就启动计价,根据里程寄存器中的内容计算和判断行驶里程是否已超过起步价公里数。
若已超
附2:
系统原理图2
1.2功能能要求4
小于定值时,开始进行等待时间计时,并把等待价格加到总金额里,然后将总金额、里程送数码管显示出来。
3.2中断服务程序
(1)里程中断服务程序
每当霍尔传感器输出一个低电平信号就使单片机中断一次,当里程计数器对里程脉冲计满50次时,进入里程计数中断服务程序中,里程变量加一。
主函数中总金额也相应地变化。
3.3总价计算程序
计算程序根据里程数分别进入不同的计算公式。
如果里程大于3公里,则执行公式:
总金额=起步价+(里程-3)*单价+等待时间*等待单价;否则,执行公式:
总金额=起步价+等待时间*等待单价。
3.4数码管显示程序
显示程序利用定时器每1ms产生一次中断,相应变量置位,点亮一个数码管,显示一位数据,利用主函数内的循环,实现动态扫描显示,同时根据数码管余辉和人眼暂留现象,即可实现显示。
4出租车计价器的仿真与结果
上图是单价为2元每公里,路程为1.5公里,等待时间为15分钟的仿真结果
仿真数据:
单程:
单价为2.0元每公里,每半公里变一次金额
0-2.9公里
3公里
3-3.4公里
3.5公里
3.5-3.9公里
......
5元
6元
6元
7元
7元
......
往返:
单价为1.5元每公里,每一公里变一次金额
0-2.9公里
3公里
3-3.9公里
4公里
4-4.9公里
......
5元
7元
7元
8元
8元
......
等待时间,每五分钟相当于一公里路程,即为两元。
假设初始金额为7元则:
0-4分钟59秒
5分钟
5分钟-9分钟59秒
10分钟
......
7元
9元
9元
11元
......
5心得体会
出租车计费器系统的设计已经全部完成,能按预期的效果进行模拟汽车启动,停止,暂停等功能并能够通过数码管显示车费数目。
本款出租车计价器包括单价输出、单价调整、显示当前的行驶里程等功能。
另外,多功能出租车计价器还具有性能可靠、电路简单、成本低、实用性强等特点,加上经过优化的程序,使其有很高的智能化水平。
一个周来,经过自己努力,基本上完成了设计要求的内容,在系统可行性分析、原理图设计等方面都作了许多实际工作,取得了一些成绩,同时也遇到了一些问题,存在一些不足。
经过这一个月的学习,我觉得自己不论是在理论知识方面还是在动手能力方面都有了不小的进步,自己从中受益匪浅。
这次设计很好的把以前学到的理论知识应用于实践,使我认识到理论知识与实践之间有一定的差距,只有通过不断的努力学习和实践才能很好的把理论知识应用到实践当中,也只有通过不断的实践才能对理论知识的理解。
通过这次设计不仅学会了如何去查找相关资料,更重要的是通过查找资料和翻阅书籍学到了不少知识,扩大了知识面,提高了知识水平。
经过单元设计和系统设计巩固了以前所学的专业知识,自己真正认识到理论联系实际的重要性,为以后的学习和工作提供了很多有价值的经验。
通过这次设计不仅增强了自己的动脑能力和动手能力,也提高了我思考问题、分析问题、解决问题的能力,更重要的是学会用工程化的思想来解决问题。
这在以前的学习过程中是不曾学到的。
并且这次设计还使我认识到完整、严谨、科学分析问题、解决问题的思想是多么的重要,只有拥有了科学的态度才能设计出有用的产品。
通常在不同的方式,不同的情况下都会有不同的收费标准;单程、白天和中途等待,考虑后首选用开关来实现这些切换功能,简单方便,同时显示器会显示相应的指示。
最大的方便了司机的计费控制。
并且能根据市场经济的变化而发生相应的跳动计价。
但是在设计和调试的过程中,也发现了一些问题,譬如计价的金额数有限,实际的里程可能会很远,会超出实际的显示范围;计价过程出现突然断电时如何处理这些问题,因此对此方案还可以进行进一步改进,如:
实现白天、晚上计费自动切换和具有记忆功能,也可以加上语音提示功能,防作弊功能等,这样可能会更让乘客放心乘坐出租车,并得到广泛的应用。
参考文献:
《C语言程序设计》人民邮电出版社贾宗璞、许合利主编(河南理工大学)
《微机原理与单片机接口》煤炭工业出版社余发山、杨凌霄、王莉主编(河南理工大学)
附录1:
源程序
#include
#defineucharunsignedchar
#defineuintunsignedint
unsignedcharcodet[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//七段码
sbitled1=P3^5;//定义指示灯
sbitled2=P2^4;
sbitled3=P2^7;
sbitled4=P3^4;
sbitL1=P0^5;//定义按键
sbitL2=P0^6;
sbitL3=P0^7;
sbitH1=P3^6;
sbitH2=P3^7;
uchara,b,c,qian,bai,shi,ge,fen,miao,money,num,sum,zh;//定义变量和中间变量
bitkey1_flag;//按键标志位
bitkey2_flag;
bitkey3_flag;
bitkey4_flag;
voiddelay(uintx)//延时
{
inti,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
voidjinqian()//金钱显示子程序
{
P0=0xfb;
P2=0xff;
P1=t[money/10];
delay(3);
P0=0xf7;
P2=0xff;
P1=t[money%10];
delay(3);
}
voidlicheng()//路程显示子程序
{
P0=0xff;
P2=0xfe;
P1=t[qian];
delay(3);
P0=0xff;
P2=0xfd;
P1=t[bai];
delay(3);
P0=0xff;
P2=0xfb;
P1=t[shi]|0x80;//添加小数点
delay(3);
P0=0xff;
P2=0xf7;
P1=t[ge];
delay(3);
}
voiddanjia()//单价显示子程序
{
P0=0xfe;
P2=0xff;
P1=t[b/10]|0x80;
delay(3);
P0=0xfd;
P2=0xff;
P1=t[b%10];
delay(3);
}
voidshijian()//时间显示子程序
{
P0=0xff;
P2=0xfe;
P1=t[fen/10];
delay(3);
P0=0xff;
P2=0xfd;
P1=t[fen%10]|0x80;
delay(3);
P0=0xff;
P2=0xfb;
P1=t[miao/10];
delay(3);
P0=0xff;
P2=0xf7;
P1=t[miao%10];
delay(3);
}
voiddisplay()
{
if(zh==0)
licheng();
elseif(zh==1)
shijian();
}
voidkeyscan()//键盘扫描子程序
{
H1=0;
H2=1;
L1=1;
L2=1;
L3=1;
if(L1==0)//暂停按键
{
delay(3);
if(L1==0)
{
EA=~EA;
key1_flag=!
key1_flag;//暂停指示灯
while(!
L1);
}
}
if(L2==0)//单价2元选择键
{
delay(3);
if(L2==0)
{
b=20;
EX0=~EX0;
key2_flag=!
key2_flag;//单价2元指示灯
while(!
L2);
}
}
if(L3==0)//单价1.5元选择键
{
delay(3);
if(L3==0)
{
b=15;
EX1=~EX1;
key3_flag=!
key3_flag;//单价1.5元指示灯
while(!
L3);
}
}
H1=1;
H2=0;
L1=1;
L2=1;
L3=1;
if(L1==0)
{
delay(3);//路程时间切换键
if(L1==0)
{
TR1=~TR1;
zh++;
while(!
L1);
}
if(zh==2)
zh=0;
}
if(L2==0)
{
delay(3);
if(L2==0)
{
key4_flag=!
key4_flag;//空车指示灯
while(!
L2);
}
}
if(L3==0)//清零复位键
{
delay(3);
if(L3==0)
{
EX0=0;
EX1=0;
qian=0;
bai=0;
shi=0;
ge=0;
fen=0;
miao=0;
money=5;
a=0;
b=0;
key1_flag=1;
key2_flag=1;
key3_flag=1;
key4_flag=0;
while(!
L3);
}
}
led1=key1_flag;
led2=key2_flag;
led3=key3_flag;
led4=key4_flag;
}
voidmain()//主函数
{
P1M1=0x00;
P1M0=0xff;//推挽
EA=1;//总中断
EX0=0;//外部中断0
IT0=1;//边沿触发
EX1=0;//外部中断1
IT1=1;//边沿触发
TMOD=0x10;//定时器1
TH1=(65536-46080)/256;
TL1=(65536-46080)%256;//定时器装入初值
ET1=1;
TR1=0;//定时器控制
key1_flag=1;//按键标志位
key2_flag=1;
key3_flag=1;
key4_flag=1;
zh=0;
money=5;
while
(1)
{
keyscan();
danjia();
jinqian();
display();
}
}
voidint0(void)interrupt0//外部中断0(每公里2元)
{
num++;
if(num==30)//电机旋转30圈相当于0.1千米
{
num=0;
a++;
ge++;
}
if(ge==10)
{
shi++;
ge=0;
}
i