出租车自动计费器.docx

上传人:b****6 文档编号:3405319 上传时间:2022-11-22 格式:DOCX 页数:25 大小:218.85KB
下载 相关 举报
出租车自动计费器.docx_第1页
第1页 / 共25页
出租车自动计费器.docx_第2页
第2页 / 共25页
出租车自动计费器.docx_第3页
第3页 / 共25页
出租车自动计费器.docx_第4页
第4页 / 共25页
出租车自动计费器.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

出租车自动计费器.docx

《出租车自动计费器.docx》由会员分享,可在线阅读,更多相关《出租车自动计费器.docx(25页珍藏版)》请在冰豆网上搜索。

出租车自动计费器.docx

出租车自动计费器

摘要1

1概述1

1.1基本要求1

1.2功能介绍1

2设计方案1

2.1设计原理1

3硬件电路1

3.1单片机最小系统1

3.2按键电路1

3.3数码管显示电路1

3.4LCD1602显示电路1

4软件设计1

4.1单片机I/O资源使用1

4.2单片机软件模块设计1

4.3程序框图1

5PROTEUS仿真1

5.1总仿真电路图1

5.2不调价仿真1

5.3调价仿真1

6心得体会1

参考文献1

附录1原件清单1

附录2程序1

附录3原理图1

出租车自动计费器设计

摘要

近些年来,出租车成为了人们出行重要的交通工具之一,出租车以低价高质的服务给人们带来了不少方便。

基于单片机系统设计的出租车计费器以单片机作为核心的控制元件,具有功能强,性能可靠,电路简单,成本低的特点,加上经过优化的程序,使其具有很高的智能化水平。

本次设计中,硬件设计主电路以AT89S51单片机为核心控制元件,输出采用LCD1602液晶屏和四位一体数码管,显示起价、每公里单价、等待价格、行驶总里程和总金额,并配有多个按键,以供手动调节乘车价格。

关键词:

计费器51单片机LCD1602数码管

1概述

1.1基本要求

①以MCS-51系列单片机为核心,设计出租车自动计费器。

②设计一个出租车自动计费器,具有行车里程计费、等候时间计费、及起价三部分,用四位数码管显示总金额,最大值为99.99元。

③行车里程单价1元/公里,等候时间单价0.5元/10分钟,起价3元(3公里起价)均能通过人工输入。

④行车里程的计费以一个脉冲模拟汽车前进十米,

⑤用LED显示行驶公里数和收费金额。

一、计费功能

费用按行驶里程计费,起步价为3元。

1、当行驶里程小于或等于3公里,按起步价计费

2、当行驶里程大于3公里,每公里收费1元,不足1公里不计

3、等待时间为每10分钟收费0.5元,不足10分钟不计

二、显示功能

1、显示行驶里程:

用LCD1602液晶屏显示,显示方式为“XX”,单位为Km,范围0-99Km

2、显示等候时间:

用LCD1602液晶屏显示,显示方式为“XX”,单位Min,范围0-99Min

3、显示总费用:

用四位数码管显示,显示方式为“XX.X”,单位元,范围3-99.9元

1.2功能介绍

本出租车自动计费,上电后显示默认的起步价,每公里计费单价,等待时间计费单价,可通过按键调整起步价,里程计费单价,等待时间计费单价。

具有运行、暂停、停止状态,可以显示行驶的里程、等待的时间和出租车行驶的总费用。

2设计方案

2.1设计原理

利用单片机的强大功能,可用AT89S51单片机作主控芯片,用来处理计费器的各种数据并控制LCD1602和数码管显示模块,实现基本的里程计费和价格调整。

为模拟汽车行驶,用单片机的T0定时器进行16位定时,每0.05S发射一个信号进入定时中断,20个中断为1S,每秒向单片机发送信号表示前进10米。

2.2设计方案

 

图2-1总体设计框图

3硬件电路

3.1单片机最小系统

该电路单片机最小系统由四个部分组成:

电源、地、复位电路、时钟电路。

电源电路中,电源接单片机,同时连接一个电容接地用于去耦合,稳定电源电压。

复位电路如图3-1所示,共有两种基本形式:

上电复位和按键复位。

单片机上电瞬间会对C1进行充电,此过程C1相当于短路,RST引脚电平升高单片机复位;若要手动复位,则按下RSTK复位按键,RST引脚直接接高电平,单片机复位。

图3-1复位电路

图3-2为单片机时钟电路,AT89S51内部有一个用于构成振荡器的高增益反相放大器,它的输入端为芯片引脚XTAL1,输出端为XTAL2,。

这两个引脚跨接石英晶体和微调电容,构成一个稳定的自激振荡器,微调电容的典型值通常为30pF。

图3-2时钟电路

3.2按键电路

本设计共有6个独立按键:

复位按键RSTK,进入退出设置键K1,光标移动键K2,数值增加键K3,等待计时键K4,开始暂停计费键K5。

1.复位或者程序跑飞,可用RSTK键进行复位;

2.调整计费单价,按K1进如设置状态,设置完后再按下K1退出设置状态;

3.按K2可移动光标,分别调整各收费单价;

4.按K5键开始计费,中间需要停车等待,可直接按K4进行等待计时计费,等待完毕直接按K5继续行驶计费。

按键电路如图3-3所示。

图3-3按键电路

3.3数码管显示电路

数码管用于显示计费总价,显示方式为“XX.X”,单位元,显示范围为3-99.9元。

为保证数码管显示的稳定性,在段选端前接锁存器74HC573,数码管电路如图3-4所示。

图3-4数码管显示电路

由于单片机P0口没有上拉能力,所以数码管的段选口高电平由锁存器提供。

3.4LCD1602显示电路

LCD1602液晶屏是字符型液晶屏,并且带字符库的,不需要查找代码,英文字符可直接输入显示。

液晶电路使用时,如果发现液晶不亮可以调节连接液晶的变阻器,改变液晶的亮度。

每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形。

LCD1602显示电路如图3-5所示。

图3-5LCD显示电路

另外,系统供电由P1口外接的5V电源供电,如图3-6。

图3-6电源接口

4软件设计

4.1单片机I/O资源使用

此设计中P10到P13口和P32口连接按键控制输入,P0口和P14、P15、P16、P17口用于控制数码管,P2口和P34、P35、P36口用于控制LCD1602液晶屏。

4.2单片机软件模块设计

一、LCD1602显示模块

由于LCD1602程序比较复杂,所以专门创建一个1602的头文件,将1602的使用程序存放于头文件中,在主程序中只要声明了1602头文件,即可调用1602子程序。

头文件下包含的子程序有:

延时程序、LCD1602初始化程序、写命令程序和写数据程序。

由于只是使用LCD1602进行显示,所以不需要读命令数据程序。

二、中断程序模块

程序共使用三个中断:

INT0、T0、T1中断。

INT0中断用于进入或退出调价模式,打开计费器后进行计费之前,随时可以利用INT0中断进行调价,开始计费之后则关闭INT0中断,不能调价。

T0定时中断形成行车脉冲,模拟汽车行驶,每0.05s产生一次中断,每20次中断为1s,每秒行驶10米距离。

程序中设置一个变量flag2用来表示按下的是K4还是K5,按下K5键T0中断中的t1开始计时,模拟汽车行驶,再次按下则暂停计时,即停止行驶;按下K4,T0中的t2开始计时,计算等待的时间。

T1中断用于数码管显示,由于数码管是动态显示,所以在此较为复杂的主程序中运行会产生闪烁,将数码管显示程序置于T1中断程序中,就不会再闪烁。

三、其它程序模块

其它程序模块主要包括数码管显示模块、数据计算模块、调价模块、按键扫描模块等。

数码管显示模块用于显示总费用,使用四位一体数码管显示,但只用其中后三位,显示0到99.9。

数据计算模块主要计算行车里程、等待时间、等待收费、总收费。

调价模块用于调整起价、每公里单价和等待收费单价。

按键扫描模块用于检测用户按下了哪些功能键。

4.3程序框图

本设计中,软件设计采用模块化操作,利用各个模块之间的相互联系,在设计中采用主程序调用子程序的方法,使程序通俗易懂。

在main函数开始,要对系统初始化,和对硬件设备进行初始化,并使硬件处于就绪状态。

通过判断是否计费,调价,清零等状态,来分别调用不同的子程序,使程序在设计之前,就有了很强的逻辑关系。

这些对应于硬件就是通过按下各个控制开关,来分别进行不同的动作,最后显示屏根据输入的信息,来显示不同的数据信息,这就达到了软件控制硬件,同时输入信息控制输出信息的目的。

整个程序的流程图如下:

 

TO、T1、INT0初始化

LCD1602初始化

否否

 

图4-1程序流程图

从图中可以看出,程序开始就对LCD1602、T0T1计数器和INT0进行了初始化,1602显示器开始显示计费标准,之后判断是否进行调整收费标准,如需调整则进入调整程序进行价格调整,若不需要调整则判断是否开始计费或者计时,若开始则进入数据处理程序进行各数据计算,计算结果显示在LCD1602和数码管上,若不开始计价或者计时,则只用LCD1602显示收费标准。

5PROTEUS仿真

5.1总仿真电路图

使用PROTEUS搭建好电路,下载程序进行仿真。

仿真电路包含AT89S51单片机、按键控制电路、74HC573锁存器、四位共阴极数码管和LCD1602液晶屏。

总电路如图5-1所示。

 

图5-1仿真电路图

5.2不调价仿真

先使用默认的价钱进行仿真,即起步价3元,每公里1元,每等待10分钟0.5元。

通过计算,行驶10公里且不等待收费10块钱,对比仿真结果图5-2发现电路运行正常。

图5-2仿真一

再仿真等待收费。

行驶7公里,等待10分钟,通过计算应收费7.5元,对比仿真结果图5-3,运行结果也正确。

图5-3仿真二

5.3调价仿真

这次先进行调价,再开始计费,检查调价程序是否能够正常运行。

将起步价调为6元,每公里单价调为3元,按K5开始行驶计费,行驶10公里,计算得费用为27元,对比仿真结果图5-4,结果相同。

图5-4仿真三

再将起步价调为5元,每公里单价调为2元,每10分钟等待单价调为1.5元进行仿真,等待10分钟,显示计费12.5元,与计算结果图5-5相同。

图5-5仿真四

6心得体会

出租车计费器系统的设计已经全部完成,能按预期的效果进行模拟汽车启动,停止,暂停等功能,并能够通过LCD和数码管显示车费数目。

本款出租车计价器包括单价输出、单价调整、显示当前总费用等功能。

另外,多功能出租车计价器还具有性能可靠、电路简单、成本低、实用性强等特点,加上经过优化的程序,使其有很高的智能化水平。

经过自己努力,基本上完成了设计要求的内容,在系统可行性分析、原理图设计等方面都作了许多实际工作,取得了一些成绩,同时也遇到了一些问题,存在一些不足。

经过这几天的学习和工作,我觉得自己不论是在理论知识方面还是在动手能力方面都有了不小的进步,自己从中受益匪浅。

这次设计很好的把以前学到的理论知识应用于实践,使我认识到理论知识与实践之间有一定的差距,只有通过不断的努力学习和实践才能很好的把理论知识应用到实践当中,也只有通过不断的实践才能对理论知识的理解。

通过这次设计不仅学会了如何去查找相关资料,更重要的是通过查找资料和翻阅书籍学到了不少知识,扩大了知识面,提高了知识水平。

经过单元设计和系统设计巩固了以前所学的专业知识,自己真正认识到理论联系实际的重要性,为以后的学习和工作提供了很多有价值的经验。

通过这次设计不仅增强了自己的动脑能力和动手能力,也提高了我思考问题、分析问题、解决问题的能力,更重要的是学会用工程化的思想来解决问题。

这在以前的学习过程中是不曾学到的。

在短短的三个月时间内完成设计内容,在很大程度上得益于老师的帮助。

这次设计是我认真认识到完整、严谨、科学分析问题、解决问题的思想是多么的重要,只有拥有了科学的态度才能设计出有用的产品。

另外通过本次设计,使我认识到自己理论知识的应用能力有很大的欠缺,需要在以后的学习中进一步提高。

参考文献

[1]张毅坤等.单片微型计算机原理及应用.西安电子科技大学出版社

[2]李建忠.单片机原理及应用.西安电子科技大学出版社

[3]张毅刚,彭喜元,彭宇.单片机原理及应用.高等教育出版社

[4]康华光.电子技术基础数字部分.高等教育出版社

[5]刘坤,赵红波,张宪栋.51单片机开发技术大全.人民邮电出版社

[6]李广弟,朱月秀,冷祖祁.单片机基础.北京航空航天大学出版社

附录1原件清单

名称

规格

数量

电阻

10K

1个

排阻

1K

1排

可变电阻

1个

极性电容

10uF

1个

非极性电容

33pF

2个

0.1uF

2个

晶振

12MHz

1个

LCD1602

1个

数码管

1个

芯片

AT89S51

1个

74HC573

1个

附录2程序

主程序:

#include

#include"1602.h"

#defineuintunsignedint

#defineucharunsignedchar

uchartable[3]={3,1,5};//起步价,单价,等待单价

uchartable1[3];

ucharcodetable2[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f};//0~9

ucharcodetable3[]={

0xbf,0x86,0xdb,0xcf,

0xe6,0xed,0xfd,0x87,

0xff,0xef};//0~9带小数点

ucharSetPlace,SetState=0;//设置位置,设置状态

uchartime1,time2;//用于定时器计时

ucharkilometre;//行走里程

doublemin;

doublewaitm=0.0,money=0.0;//等待计费、总计费

ucharflag1=0,flag2;//用于K4和K5按键状态

ucharnum=0;

uintx;

uintt1,t2;//t1为T0定时,表示汽车行走了t1秒

//t2为T1定时,表示等待了t2秒

sbitK1=P3^2;//设置

sbitK2=P1^2;//移动光标

sbitK3=P1^3;//循环增加

sbitK4=P1^0;//打开关闭等待计时器

sbitK5=P1^1;//打开关闭计价器

sbitLSA=P1^4;//数码管位选

sbitLSB=P1^5;

sbitLSC=P1^6;

sbitLSD=P1^7;

voidKey();//按键选择计费或计时

voidSMG();//数码管显示

voidData();//计算行走里程、等待收费、总收费

voidtiaojia();//按K1K2K3调整收费标准

voidLcdDisplay();//1602显示

voiddelay(uintc);//延时c毫秒

voidInt0Configuration();//外部0中断初始化

voidT_0Config();//定时器0中断初始化

voidT_1Config();//定时器1中断初始化

/*********************主程序*********************/

voidmain()

{

LCD1602init();

T_0Config();

T_1Config();

Int0Configuration();

while

(1)

{

if(SetState==1)

{

tiaojia();//按下K1则调整价格,不按则跳过

}

else

{

Key();//按键选择计费或计时

}

Data();//数据处理

LcdDisplay();//1602显示

}

}

/******************数码管显示程序*******************/

voidSMG()//共阴极数码管

{

for(num=0;num<3;num++)

{

switch(num)//table1[]存放的是总金额数

{

case(0):

LSA=1;LSB=0;LSC=1;LSD=1;

P0=table2[table1[num]];delay

(1);P0=0;

break;

case

(1):

LSA=1;LSB=1;LSC=0;LSD=1;

P0=table3[table1[num]];delay

(1);P0=0;

break;

case

(2):

LSA=1;LSB=1;LSC=1;LSD=0;

P0=table2[table1[num]];delay

(1);P0=0;

break;

}

}

}

/******************调价程序*******************/

voidtiaojia()//调整价格程序

{

uchari;

if(K2==0)//检测按键K2按下光标移动

{

delay(10);

if(K2==0)

{

SetPlace++;//光标向前移一位

if(SetPlace>2)

SetPlace=0;

}

while((i<50)&&(K2==0))//检测按键是否松开

{

delay(10);

i++;

}

i=0;

}

if(K3==0)//检测按键K3按下调节价格

{

delay(10);//消除抖动

if(K3==0)

{

if(SetPlace<2)

{

table[SetPlace]=table[SetPlace]+1;

if((table[SetPlace]&&0x0f)>9)//换成BCD码。

{

table[SetPlace]=table[SetPlace]+6;//转换为BCD码之后,就相当于十进制数了

}

if((table[SetPlace]>0x9)&&(SetPlace==0))//起步价

{

table[SetPlace]=0;

}

if((table[SetPlace]>0x9)&&(SetPlace==1))//单价

{

table[SetPlace]=0;

}

}

else

{

table[SetPlace]=table[SetPlace]+5;

if((table[SetPlace]&&0x0f)>9)//换成BCD码。

{

table[SetPlace]=table[SetPlace]+6;//转换为BCD码之后,就相当于十进制数了

}

if((table[SetPlace]>0x99)&&(SetPlace==2))//等待单价的10倍

{

table[SetPlace]=0;

}

}

}

while((i<10)&&(K3==0))//检测按键是否松开

{

delay(10);

i++;

}

i=0;

}

}

/******************数据处理计算程序*******************/

voidData()//计算行走里程、等待收费、总收费

{

kilometre=(10*t1)/100;//1000!

!

!

!

!

!

!

!

!

min=t2/600;//t2/600是等待了多少个10分钟

waitm=min*table[2];//不/10,在money处也不*10,正好抵消

if(kilometre<=3)

{

money=10*table[0]+waitm;

}

else

{

money=10*table[0]+10*(kilometre-3)*table[1]+waitm;

}

x=money;

table1[0]=x/100;

table1[1]=x%100/10;

table1[2]=x%10;

}

/*******************按键程序*******************/

voidKey()//按键选择计费或计时

{

if(K5==0)//按K5退出计时并进入计费模式

{//再按下则退出计费模式

delay(10);

if(K5==0)

ET0=1;//开T0中断

TR0=1;//启动定时器

flag1=!

flag1;

if(flag1==1)

{

flag2=1;

}

else

{

flag2=0;

}

}

if(K4==0)//按K4进入等待计时模式

{

delay(10);

if(K4==0)

ET0=1;

TR0=1;

flag2=2;

}

}

/*****************LCD1602显示程序*******************/

voidLcdDisplay()//1602显示

{

LcdWriteCom(0x80);

LcdWriteData('S');

LcdWriteData(':

');

LcdWriteData('0'+table[0]);//起步价

LcdWriteCom(0x80+0x05);

LcdWriteData('P');

LcdWriteData(':

');

LcdWriteData('0'+table[1]);//每公里单价1

LcdWriteCom(0x80+0x0a);

LcdWriteData('W');

LcdWriteData(':

');

LcdWriteData('0'+(table[2]/10));//等待每10分钟单价0.5元

LcdWriteData('.');

LcdWriteData('0'+(table[2]%10));

LcdWriteCom(0x80+0x40);

LcdWriteData('T');

LcdWriteData('I');

LcdWriteData('M');

LcdWriteData('E');

LcdWriteData(':

');

LcdWriteData('0'+((t2/60)/10));//等待时间(t2/60)0~99

LcdWriteData('0'+((t2/60)%10));

LcdWriteCom(0x80+0x48);

LcdWriteData('L');

LcdWriteData('O');

LcdWriteData('N');

LcdWriteData('T');

LcdWriteData('H');

LcdWriteData(':

');

LcdWriteData('0'+kilometre/10);/

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1