出租车自动计费器Word格式文档下载.docx
《出租车自动计费器Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《出租车自动计费器Word格式文档下载.docx(26页珍藏版)》请在冰豆网上搜索。
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设计方案
复位电路
里程传输
按键电路
数码管显示总费用
锁存器
LCD1602显示行驶里程和等待时间等
AT89S51单片机
图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初始化
LCD默认显示
否否
调价程序
是
是
数码管、LCD显示数据
图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排
可变电阻
极性电容
10uF
非极性电容
33pF
2个
0.1uF
晶振
12MHz
LCD1602
数码管
芯片
AT89S51
74HC573
附录2程序
主程序:
#include<
reg52.h>
#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();
}
}
/******************数码管显示程序*******************/
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):
LSB=1;
LSC=0;
P0=table3[table1[num]];
case
(2):
LSD=0;
}
/******************调价程序*******************/
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按下调节价格
//消除抖动
if(K3==0)
{
if(SetPlace<
{
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;
(SetPlace==1))//单价
}
}
else
{
table[SetPlace]=table[SetPlace]+5;
0x99)&
(SetPlace==2))//等待单价的10倍
}
10)&
(K3==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退出计时并进入计费模式
{//再按下则退出计费模式
if(K5==0)
ET0=1;
//开T0中断
TR0=1;
//启动定时器
flag1=!
flag1;
if(flag1==1)
flag2=1;
flag2=0;
}
if(K4==0)//按K4进入等待计时模式
if(K4==0)
flag2=2;
/*****************LCD1602显示程序*******************/
voidLcdDisplay()//1602显示
LcdWriteCom(0x80);
LcdWriteData('
S'
);
:
'
0'
+table[0]);
//起步价
LcdWriteCom(0x80+0x05);
P'
+table[1]);
//每公里单价1
LcdWriteCom(0x80+0x0a);
W'
+(table[2]/10));
//等待每10分钟单价0.5元
.'
+(table[2]%10));
LcdWriteCom(0x80+0x40);
T'
I'
M'
E'
+((t2/60)/10));
//等待时间(t2/60)0~99
+((t2/60)%10));
LcdWriteCom(0x80+0x48);
L'
O'
LcdW