基于单片机的出租车计价器设计Word格式.docx
《基于单片机的出租车计价器设计Word格式.docx》由会员分享,可在线阅读,更多相关《基于单片机的出租车计价器设计Word格式.docx(41页珍藏版)》请在冰豆网上搜索。
一、计费功能
费用的计算是按行驶里程收费,设起步价为5元。
1、当里程<
3km时,按起价计算费用。
2、当里程>
3km时,按以下规则计费:
白天(6:
00-18:
00):
每公里按2元计费;
晚上(18:
00-6:
每公里按3元计费。
二、显示功能
1、显示行驶总里程:
用三位数字显示,显示方式为“XXX”,单位为公里。
计价范围0-999公里,精确到1公里。
2、显示总费用:
总费用显示用三位数字显示,显示方式为“XXX”,单位为元。
计价范围0-999元,精确到1元;
3、显示单价:
单价显示用一位数字显示,显示方式为“X”,单位为元。
计价范围0-9元,精确到1元。
4、时钟显示:
显示方式为“XXXXXX”,分别对应“时分秒”[5]。
1.3功能要求
出租车计价器的主要功能有:
数据的复位、白天/晚上转换、数据输出、计时计价、单价输出及调整、路程输出、实现在系统掉电的时候保存单价等信息等功能[6]。
输出采用8段数码管显示,系统通电后默认显示原始的起步价,通过按键(S1—S4)可以调节起步价,计费单价等。
另外还具有系统运行和停止等状态,可以显示系统运行的路程、费用以及时钟,具有计费累加的功能。
在出租车停止后数据显示部分能够显示行驶路程以及总费用等。
1.4设计方案
采用单片机控制方案,如下图所示。
单片机控制方案有较大的活动空间,不但能实现所要求的功能而且能在很大的程度上扩展功能,而且还可以方便的对系统进行升级。
利用单片机丰富的I/O端口,及其控制的灵活性,实现基本的里程计价功能,单价显示和调整,时钟显示等不同功能。
图1-1单片机控制方案图
第2章出租车计价器硬件设计
系统硬件设计主要包括单片机AT89C52、数据显示部分、A44E霍尔传感器电路、AT24C02掉电存储单元、DS1302时钟芯片、里程计算及计价单元的设计。
在硬件设计过程中,充分利用各部件的功能,实现多功能的出租车计价器设计。
2.1系统的硬件组成及相关功能介绍
出租车计价器的单片机控制方案图如单片机控制方案图所示。
组成部分:
单片机AT89C52、数据显示部件、键盘控制部件,AT24C02掉电存储控制单元、里程计算单元、显示驱动电路等[7,8]。
利用单片机丰富的IO端口,及其控制的灵活性,实现基本的里程计价功能和价格调节功能[9]。
2.2AT89C52单片机
图2-1AT89C52引脚图
AT89C52是带8K字节闪烁可编程可擦除只读存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器[10]。
它的外围电路简单,具有很高的性价比[11]。
而且它与MCS-51的指令和引脚兼容,为嵌入式控制系统提供了一个灵活有效的解决方案。
2.3AT24C02掉电存储单元
图2-2AT24C02引脚配置图
AT24C02掉电存储单元的作用是在电源断开的时候,存储当前信息。
AT24C02掉电存储单元是ATMEL公司生产的2KB字节的电可擦除存储芯片,采用的是两线串行的总线和单片机通信。
最低电压可达到2.5V,额定电流为1mA,静态电流为10µ
A(5.5V)[12]。
芯片内所存储的数据可以在断电情况下存储长达40年以上,而且是采用8脚的DIP封装,使用非常的方便。
图2-3掉电存储单元电路原理图
上图中R1、R2均是上拉电阻,作用是降低AT24C02掉电存储单元的静态功耗,由于AT24C02的数据线、地址线是复用的,采用串口的方式传输数据,所以仅用两根线SCL(移位脉冲)和SDA(数据/地址)与单片机传送数据信息。
每设定一次单价,系统就会自动调用存储程序,并将单价信息保存于芯片内;
当系统重新上电时,会自动调用读存储器程序,将存储器内的单价等信息读到缓存单元中,以供主程序的使用。
2.4键盘单元的设计
键盘单元电路共采用了五个按键S1、S2、S3、S4、S5,其功能分别是:
(1)S1按键的功能:
默认总费用显示,S1按第一次显示总路程,按第二次显示单价,按第三次时钟显示,按第四次返回默认总费用显示。
(2)S2按键的功能:
调整位设置按键。
(3)S3按键的功能:
调整位加一。
(4)S4按键的功能:
调整位减一。
(5)S5按键的功能:
新乘客上车时使用,对之前的数据初始化。
2.5里程计算计价单元
里程计算是通过安装在车轮上的霍尔传感器A44E将检测到的信号送到单片机内部进行处理计算,并送给数据显示单元显示出来,其原理如下图所示。
图2-4传感器测距示意图
所谓霍尔效应,是指若把通有电流I的导体放于垂直它的磁场中,则在该导体的两侧P1、P2会产生一个电势差U,它正比于电流I及磁感应强度B,反比于导体厚度D,即:
U=k(IB/D),其中k为霍尔系数。
k越大,说明霍尔效应越显著;
k越小,说明霍尔效应越微弱。
人们通常利用一些半导体材料(如锗、锑化铟)的显著的霍尔效应这个性质来制成直流和低频磁场/电压变换器。
霍尔电流传感器是根据霍尔效应原理制作而成的。
它有两种工作方式,即磁平衡式和直式。
霍尔电流传感器一般是由原边电路、聚磁环、霍尔器件、次级线圈)和放大电路等部件组成[13]。
由于A44E属于开关型的霍尔元器件,其工作电压范围比较大(4.5~18V),其输出的信号符合TTL电平标准,可以将其直接接到单片机的I/O端口上,而且其最高检测频率可以达到1MHZ。
选择P3.2口作为信号的输入端,采用外部中断0(INT0),汽车车轮转一圈(假设车轮的周长是1米),当霍尔传感器检测到一次信号,就会向单片机传输一次数据,如此周而复始不断向单片机传输数据,引起单片机的中断,对脉冲计数,当计数达到1000次时,也就是1公里,单片机就控制将金额自动的变更相应的数值,计算公式为“总费用=起步价+当前单价×
(公里数—起步公里数)”。
2.6DS1302时钟单元设计
DS1302是美国DALLAS公司生产的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。
采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302内部有一个31×
8的用于临时性存放数据的RAM寄存器。
它是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。
图2-5DS1302的结构与引脚图
DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。
在主电源关闭的情况下,也能保持时钟的连续运行。
X1和X2是振荡源,外接32.768kHz晶振。
RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。
当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。
如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。
SCLK为时钟输入端。
2.7数据显示单元设计
1.数字时钟显示(23时12分31秒):
2.总费用显示(32元):
3.
总里程显示(12公里):
4.单价显示(3元):
5.LED数码管的结构:
若采用共阳极接法,则它们的阳极为一个公共点,接电源的正极。
八只发光二极管的阴极相互独立,哪一个阴极接地,哪一段即可以发光,阴极也接高电平者便呈暗淡。
如果采用共阴极接法,那么阴极作为一个公共点接地,各阳极相互独立,且接高电平者发光,阳极接地者呈暗淡。
此次设计采用共阴极接法。
(a)LED的结构和引脚(b)共阴极接法(c)共阳极接法
图2-6LED的结构与引脚图
6.LED显示器显示方式:
LED数码管显示器与单片机的接口一般有静态显示和动态显示两种方式。
LED采用静态显示与单片机接口时,其阴极作为一个公共点接地。
静态显示器接口电路,在显示位数较多时,电路比较复杂,需要的接口芯片也比较多,成本也会也较高;
而LED动态显示接口电路,由于各个数码管共用一个段码输出口,分时轮流通电的,从而大大简化了硬件线路,降低了生产成本。
本次设计就采用动态扫描显示[14]。
2.8系统电路总体设计
系统电路图如下图所示:
图2-6系统电路图
第3章出租车计价器软件设计
3.1总体程序流程图
在主程序单元中,需要对各接口芯片进行初始化、出租车起步价和单价的初始化设置、中断向量的设计以及开中断、循环等待等工作。
另外,在主程序单元中还需要设置启动/清除标志寄存器、里程寄存器和价格寄存器,并进行初始化。
然后,主程序将会根据各标志寄存器的内容,分别完成启动、清除、计程和计价等不同操作[15]。
主程序流程图如下图所示。
图3-1主程序流程图
打开电源后,就默认启动计费显示,将根据里程寄存器中的内容计算和判断行驶里程是否已超过起步价包含的公里数。
若已超出,则根据里程值、单价数和起步价数来计算出当前的累计价格,并将计算结果存储于价格寄存器中,然后将运行时间和当前累计价格送给显示电路显示出来。
当到达目的地时,由于霍尔开关不再有脉冲信号送来,系统就停止计价,显示当前所应该付的总金额,到下次启动计价时,系统自动对显示清零,并重新进行初始化过程。
3.2子程序
1.里程计数中断服务子程序
每当霍尔传感器输出一个低电平就使单片机产生一次中断,当里程计数器对里程脉冲信号计满1000次时,使单片机进入到里程计数中断服务子程序中。
在该子程序中,需要完成对当前行驶总里程数以及总费用的累加操作,并将累加结果存入里程和费用寄存器中。
图3-2里程中断服务子程序
2.键盘服务子程序
键盘服务子程序采用查询的方式,放在主程序中,当没有按下按键的时候,单片机就循环主程序,一旦有按键按下,便会转向相应的子程序处理,处理结束再返回。
3.定时中断服务子程序
在定时中断服务子程序中,每隔100ms产生一次中断,当产生10次中断的时候,时间就是1s,将数据送到相应的显示缓冲单元,并调用显示子程序进行实时显示。
图3-3定时中断服务子程序
4.显示服务子程序
由于是要实现分屏显示各数据,所以就会用到5个显示子程序,分别是:
时钟显示子程序、单价显示子程序、单价调节子程序、路程显示子程序以及费用显示子程序。
第4章出租车计价器系统调试与分析
4.1编程软件介绍
德国Keil公司开发的KeiluVision是基于Windows平台的开发软件,在全球已经得到广泛使用,它是基于仿真引擎SPICE的混合电路仿真软件[16]。
它不但能仿真模拟电路、数字电路、模数混合电路,更具有特色的是它能够模拟仿真基于单片机的电子设计系统。
它完全支持MCS-51及其派生系列单片机的设计系统[17]。
KeiluVision支持8051的所有Keil工具,包括C编译器、宏汇编器、链接器/定位器和目标文件转换至HEX格式的转换器,其中KeilC51是专门为单片机设计的一种高效率C语言编译器,符合ANSI标准,生成的程序代码运行速度极高,所需要的存储器空间极小,完全可以与汇编语言媲美。
图4-1KeiluVision软件界面
具体C程序间附录。
4.2单片机开发板测试
单片机技术自发展以来已有近20年的历史。
单片机技术的发展以微处理器(MPU)技术及超大规模集成电路技术的发展为先导,以广泛的应用领域拉动,表现出较微处理器更具个性的发展势头[18]。
小到遥控电子玩具,大到航空航天技术等行业都涉及到单片机的应用。
针对单片机技术在电子行业自动化方面的重要应用,为满足广大学生、爱好者、产品开发者迅速学会掌握单片机这门技术,于是产生单片机开发板也称单片机学习板、单片机实验板[19]。
将Keil中的C程序下载至开发板中的单片机内,并运行,结果如下图所示(以已行驶五公里,白天单价为三元为例):
图4-2总费用显示
图4-2总路程显示
图4-3白天单价显示
图4-4夜晚单价显示
图4-5时钟显示
参考文献
[1]郑晓峰.出租车多功能计价器安装与调试[J].计量与测试技术,2009,(5):
31-33.
[2]张颖.多功能出租车计价器的设计[J].计算机与信息技术,2009,(9):
96-97.
[3]魏宋扬.出租汽车计价器常见故障及分析处理[J].中国测试,2009,(5):
17-19.
[4]孙晓琳.16位单片机在出租车计价器中的应用[J].计量与测试技术,2009,
(1):
39.
[5]张辉杰.基于单片机的出租车计费器设计[J].榆林学院学报,2010,(6):
51-57.
[6]陈爱文.基于AT89C51单片机的多功能出租车计价器[J].机电工程技术,2008,(11):
15-19.
[7]陈光东.微型计算机原理与接口技术[M].武汉:
华中理工大学出版社,1999.17-23.
[8]陈渭红.多功能的出租车计价器的设计与实现[J].科技信息,2011,(22)102-103.
[9]舒涛.基于AT89S51单片机的出租车计价器系统设计[J].计算机应用技术,2010,(22):
55-57.
[10]蔡美琴.MCS-51系列单片机系统及其应用[M].北京:
高等教育出版社,2004.114-121.
[11]ChirsJ.Georgopoulos.InterfaceFundamentalsInMicroprocessor-ControlledSystem[M].D.ReidelPublishingCompany,1985.122-145.
[12]张友德.单片微型机原理、应用与实验[M].上海:
复旦大学出版社,2005:
83-106.
[13]张小虎,刘洁.基于单片机的出租车计价器编码传感器的设计[J].自动化技术与应用,2005,(24):
44-47.
[14]Dabis.W.S.PCBandDesign:
AStructuredApproach[M].Addison-WesleyPub,2003.157-186.
[15]马忠梅.单片机的C语言应用程序设计[M].北京:
北京航空航天大学出版社,2003.78-93.
[16]王威.基于Proteus和Keil的单片机虚拟仿真平台的设计[J].上海电力学院学报,2009,25(6):
16-19.
[17]李芳.基于Proteus_Keil的单片机实验仿真平台[J].中国教育技术装备,2009,(4):
67-69.
[18]吴凌燕.基于Proteus的单片机仿真设计[J].仪表技术,2011,(7):
31-37.
[19]郭天祥.新概念51单片机C语言教程[M].北京:
电子工业出版社,2009:
144-149.
附录
一、主程序:
#include"
display.h"
//
AT24C02.h"
ds1302.h"
sbits1=P3^4;
//界面切换按键
sbits2=P3^5;
sbits3=P3^6;
sbits4=P3^7;
sbitledla=P2^5;
uintcost,meter,distance;
ucharprice,hour,minute,second,s1_count;
ucharcost_div[3];
uchardistance_div[3];
ucharclk_time[3];
//时,分,秒寄存器初始值
ucharclock_div[6];
//时,分,秒分离后的值
voidinit();
voidds1302_proc();
//ds1302时分秒BCD码分离函数同时更新了hour、minute、second
voidselect_price();
//选择单价只在新乘客上车时调用
voidrenew_distance();
//更新路程distance显示数据
voidrenew_cost();
//更新总费用及其显示数据根据distance和price
voidadjust_price();
//调整单价程序
voidadjust_time();
voiddisplay_cost();
//显示总费用函数
voiddisplay_distance();
//显示总路程函数
voiddisplay_price(uchardat);
//显示单价函数
voiddisplay_time();
//显示时间函数
voidmain()
{
/***************只写一次********************/
//DS1302write();
//写入初始时间
//i2c_w(0,0);
//写入路程高八位
//i2c_w(1,5);
//写入路程低八位
//i2c_w(2,2);
//白天价格
//i2c_w(3,3);
//夜间价格
/*******************************************/
init();
while
(1)
{
if(s1==0)
{
delay(10);
//延时消抖
if(s1==0)
{
while(s1==0)//松手检测
{
switch(s1_count)
{
case0:
display_cost();
break;
case1:
display_distance();
case2:
display_price(price);
case3:
ds1302_proc();
display_time();
}
}
s1_count++;
if(s1_count>
=4)
s1_count=0;
}
}
if(s1_count==0)//显示总费用
display_cost();
if(s1_count==1)//显示总路程
display_distance();
if(s1_count==2)//显示单价
display_price(price);
if(s2==0)
delay(10);