基于51单片机的出租车计价器的设计

引言

在科学技术和经济水平快速发展的21世纪,乘坐出租车和网约车出行已经成为一种非常重要的交通出行方式。行业的转型发展让出租车行业迎来了一场新纪元。但是在出租车行业迅速发展的同时,也出现了很多问题。经营管理不善,司机服务不规范,随意定价收款的现象也是层出不穷。为了根治这种现象,出租车计价器孕育而生。出租车计价器的问世不仅减少了行业的乱象,而且让管理者和经营者更加诚信的服务乘客,在很大程度上改善了行业风气。

但是目前国内广泛使用的出租车计价器功能单一,不能满足人们的需求,人们更致力于一种功能齐全,生产成本低的出租车计价器。伴随着科技水平的提高,出租车计价器也迎来了新的变革,这时第二代出租车计价器问世了。

设计选用宏晶公司生产的STC89C52单片机,加上外围芯片,设计出一个性能稳定,实用性强的出租车计价器。电路主要由测速模块、时钟模块、测温模块组成。设计出功能齐全、实用性强的出租车计价器。此设计能够实现计价器的各项功能要求,使用适当的接口作为输人输出通道,实现对电机驱动模块的运行控制,以达到对出租车各项性能指标的测量,具有很大的市场前景以及开发空间。

  1. 系统概述
    1. 设计要求

运用所学的知识和专业技能,以STC89C52系列单片机为核心设计一个简易的出租车计价器系统,实现出租车计价器的稳定运行。用霍尔传感器测速测量出租车的实时速度,用延时实现调速功能。设计的出租车计价器还需具有显示时钟和测量温度的功能,并且能够自动计算费用、设置起步价、设置每公里价格。设计选用STC89C52单片机作为控制器,自带AD转换,当一边有按键按下时,另一边以数字的形式在LCD12864显示屏上显示出相应的车速、温度、时间以及总价。

(1)能够设置起步价,每公里价格;

(2)能够测量出出租车的速度并显示;

(3)自动计算总费用;

(4)具有时钟和温度测量功能。

    1. 总体设计

总体设计框图如图1-1所示,设计主要由单片机模块,按键控制模块和LCD12864显示模块组成,它们的作用分别为:

单片机模块:数据输入输出的处理。

按键模块:通过按键处理,将相关操作指令传送至单片机处理。

显示模块:用LCD12864显示屏显示出租车计价器的各项性能指标,显示当前车速、温度、总费用、起步价、每公里价格等功能。起步价和每公里价格也能通过按键进行设置并且显示过程。

其中单片机模块包括测速模块、RESET模块、ds1302S时钟模块、测温模块。通过单片机内部转换后在LCD12864显示屏上显示出相关信息。再按下按键使电机开始转动,通过延时进行调速,再通过霍尔传感器模块进行测速并通过显示模块在LCD12864上显示出当前的车速。设置了复位按键,按下复位按键时出租车计价器系统重置至初始状态。设有时钟模块将时间通过LCD12864显示屏显示出来。

系统设计的整体方案

2.1主控芯片的方案论证

方案一:51系列单片机

采用STC89C52作为主控芯片,管脚图如图2-1所示。51单片机的系统指令,内部结构相对简单。同时51单片机的I/O脚的设计和使用非常简单,指令系统规范。

方案二:PIC系列单片机

采用PIC系列为核心控制器。PIC单片机将各种输入输出的接口都集成在一块芯片上,它较适合应用在功能单一的设计中。

综上所述,根据在校所学以及掌握的理论知识,对51系列单片机的掌握更为熟练,同时价格也更为便宜的。51系列的单片机适用于相对简单较为容易实现的电路。51系列单片机比PIC系列单片机更容易实现设计要求,因此选择使用方案一设计。

                            

图2-1 STC89C52管脚图

2.2 显示模块的方案论证

方案一:LED数码管

采用LED数码管为显示模块。数码管能够显示的内容单一,受到一些产品品质要求和影响,不能做很小和显示内容很多的产品。数码管厚大笨重,占用产品结构尺寸较大,同时数码管的消耗电力大,数码管不同于液晶产品,受到视角限制,数码管属于全视角的产品。

方案二:LCD12864显示屏

采用LCD12864为显示模块。LCD12864显示屏具有功耗低的特点,液晶分子由电压驱动,液晶屏基本不用耗电。但由于液晶分子的扭曲特性,导致液晶屏视角上有偏差,只能有一个方向的视角是非常清楚的。LCD液晶显示屏在玻璃中间刻画线路和灌注液晶,可以做到高精度的操作,显示内容多样化,显示颜色也多姿多彩。LCD12864管脚图如图2-2所示。

综上所述,再结合出租车计价器的设计要求,选择LCD显示屏作为设计的显示模块。因为设计需要实现的功能较多,LED数码管能够显示的的内容单一,选用LED数码管,无法满足设计的显示需要。相反LCD12864显示屏具有显示多样化,可承载的内容多,可以做到高精度的操作。综上所述,显示模块采用方案二设计。

                            

图2-2 LCD12864管脚图

2.3电动机的方案论证

方案一:直流电机

采用直流电机为动力元件。安装较为简单,价格较为便宜。在给定的负载条件下,可以根据设计需要人为改变电机转速,更加有利于出租车计价器调速测速功能的实现。

方案二:步进电机

采用步进电机为动力元件。步进电机不会以连续的方式旋转,而是以离散的步长或增量移动,不适合模拟出租车的运行速度。步进电机适用于对精度要求大的设计。

综上所述,由于本设计需要稳定的改变速度,同时速度变化较大。另一方面直流电机较为便宜,因此设计选择方案一,用直流电机作为电动机。

2.4  电机驱动模块的方案论证

方案一:L298N驱动

采用L298N电机驱动为控制器。如果改变输入,能够实现电机的转向。更适用于模拟小车行驶。它拥有双通道输出,A输出和B输出,可以实现两路电机进行不同的控制与操作。

方案二:ULN2003驱动

采用ULN2003芯片作为控制器。ULN2003能够承受高压,内部是非门,输入与输出是相反的。它的电压增益高,温度范围宽。在工作时电压高。

综上所述,电机选用5V直流电机,设计只需要用电机模拟车轮转动,对电机的控制与操作要求低。用ULN2003驱动较为简单,更容易实现要求,因此选用ULN2003驱动作为本次设计的电机驱动模块。

3  测速模块的方案论证

方案一:霍尔传感器测速

采用霍尔传感器测速。霍尔传感器具有获取信息准确、体积小、测量范围广、精度高等优点。霍尔传感器对环境的要求低,同时结构简单。但是该方案利用线圈切割磁感线产生感应电动势,易受到电磁波干扰。

方案二:采用光电式转速传感器,

采用光电式测速。主要原理是将光信号转化为电信号。它获取信息准确,但对环境的要求较高,容易受到环境中的光干扰。

综上所述,由于光电转速传感器对环境的要求较大同时需要光源才能进行测速,相反霍尔传感器测速对环境要求较低,结构简单,再加上学习过霍尔传感器的相关理论知识,对霍尔传感器掌握程度远高于光电式转速传感器。因此选用霍尔传感器作为设计的测速模块。

  1. 系统硬件电路设计
    1. 单片机最小系统的电路设计
      1. STC89C52芯片模块电路设计

依据所选的方案,选用STC89C52作为出租车计价器的主控芯片,利用STC89C52的各个端口,实现设计所需要的各个功能。单片机端口可以控制显示模块、驱动电机模块、温度传感器模块、霍尔传感器模块以及DS1302时钟模块,还能控制各个按键的功能。设计使用单片机的P10,P11接口和直流电机驱动模块相连。使用P37接口与温度传感器模块相连。使用P12,P13,P14接口连接K1,K2,K3按键。用P32接口连接霍尔传感器模块。用P20,P21,P22接口连接DS1302时钟芯片。P9接口连接复位电路。P18,P19接口连接晶振电路。电路设计简单,STC89C52芯片模块电路设计如图3-1所示。

                   

图3-1 STC89C52电路设计图

3.1.2 系统晶振电路设计

晶振电路能够产生和时钟一样准确的振荡电路,产生时钟脉冲信号,用于控制单片机程序执行的节拍和时序。Y1两端接入单片机的XTAL1和XTAL2,接入两个大小为30PF的电容。晶振电路设计如图3-2所示。

                         

图3-2 晶振电路设计图

3.1.3 复位电路设计

使用单片机的RST接口连接复位电路,设计的复位电路由10uF的电容和10k的电阻接入RESET按键组成复位电路,设计如图3-3所示。

                               

图3-3 复位电路设计图

​​​​​​​3.1.4 电源电路设计

本设计采用经典的5V电源供电,为单片机提供电源,保障单片机工作电压的温度。电源电路设计如图3-4所示。

    

​​​​​​​3.2 按键控制电路设计

根据设计功能要求,设置三个控制按键,分别命名K1、K2、K3。利用单片机的P12,P13,P14接口实现对出租车计价器设计的各个功能要求。通过编写软件代码,当通电时,初始状态为空车,初始状态会显示时钟和温度。按下K2按键可以驱动直流电机转动,通过延时实现调速,再长按K2实现加速,长按K3实现减速。在电机转动的同时可以利用霍尔传感器测速,并且将速度显示在LCD12864显示屏上,这就实现了出租车计价器的测速并且显示的功能。按下K1按键进入乘客已上车界面,在电机转动的同时进行测速,自动计算总费用并且将费用显示在LCD12864显示屏上。再次按下K1按键进入乘客已下车界面并且显示总费用。再按下K1将进入设置起步价的界面按下K2起步价加1,按下K3起步价减1,设置完起步价后按下K1保存退出,这样就实现了设置起步价的功能。继续按下K1进入设置每公里价格界面,按K2加一,按K3减一。设置完成后按下K1保存退出。按键控制电路设计如图3-5所示。

               

图3-5 按键控制电路设计

3.3 显示电路设计

根据设计的性能要求,设计了显示灯电路设计,显示灯电路由1K电阻R4和LED灯组成,当出租车超速时,红灯亮起提示超速。显示电路设计如图3-6所示。

系统设计采用ULN2003模块作为电机的驱动模块。ULN2003由七个NPN组成,如果直接用芯片的管脚驱动直流电机的话会使直流电机烧坏或者无法驱动。IN1-IN7是输入接口,OUT1-OUT7是输出接口。其内部是一个非门,输入与输出相反,ULN2003芯片不能直接输出高电平,需在外部接入上拉电阻,但是设计没有采用接入上拉电阻的方案。因此设计的电机电路在COM公共端接高电平,IN1输入通道连接单片机的P10接口接入高电平信号,IN2输入通道连接单片机P11接口,OUT1输出通道输出低电平,这样就能完成对电机的驱动,设计的电路图如图3-7所示。      

                       

图3-7 直流电机驱动电路设计图

4 系统软件设计

4.1主函数软件设计

系统需要使用到一下五种模式:无乘客、乘客以上车、乘客已下车、设置起步价、设置每公里价格。系统主函数程序设计流程如图4-1所示。前三个模式下操作基本相同,模式一的基本参数比模式二和模式三少,因为后面两种模式涉及到计算公里数和总价等等参数。基本参数包括温度、时间、起步价、是否有乘客乘坐或乘客上下车状态。以上所有模式按下K1都是切换到下一个模式,区别不同的是前三种模式下K2和K3是用于调速使用,后两种模式是用于调节价格。初始化系统采集时钟参数采集温度参数显示基本参数,接到乘客开始计费,乘客下车设置下一次起步价和设置下一次每公里价格。

 部分程序:

#include "lcd12864.h"

#include "pwm.h"

#include "ds1302.h"

#include "key.h"

#include "ds18b20.h"

sbit MOTER=P1^0;                

sbit LED=P1^1;

u8 t=0;                                    

u8 key_value=0;                     

u8 flag=0;                 

u8 Ttemp_value=0;                

u8 PF=5;                                        

u8 duty=0;                       

u8 time=0;                       

float zprice=0;                        

void show_base();                  

void flagzero();               

void flagone();   

void flagtwo();

void flagthree();

void getandshow();          

void main()

{

       lcd12864_init();       

       ds18b20_init();         

       PWM_Init();                                  

       Exter0_Init();                   

       Timer1_Init();                  

//     ds1302_init();

       while(1)                                         

       {

              if(flag==0)   flagzero();

              else if(flag==1)  flagone();

              else if(flag==2)  flagtwo();

              else if(flag==3)  flagthree();

       }           

}

void flagzero()

{

      

       u8 flag0key=0;

       zprice=0;

       duty=0;

       MOTER=0;

       TR0=0;                                    

      

       show_base();

       lcd12864_show_string(4,1,"乘客未上车!");

       while(flag==0)

       {

              if(t==255)    getandshow();                                

             

              flag0key=key_scan(0);                                              

              if(flag0key==1)  flag++;                             

              else if(flag0key==2&&duty<=90)       

              {

                     duty+=10;

              }

              else if(flag0key==3&&duty>=10)

              {

                     duty-=10;

              }

              if(duty>=time)    MOTER=1;

              else MOTER=0;

              if(duty>=80)

              {

                     LED=1;

              }

              else

              {

                     LED=0;

              }

             

              t++;

       }

       lcd12864_clear();                                                                    

}

void flagone()

{

       u8 flag1key=0;

       MOTER=0;

       duty=0;

       TR0=0;

       show_base();

       lcd12864_show_string(4,1,"乘客已上车!");

       while(flag==1)

       {

              if(t==255)    getandshow();

             

              flag1key=key_scan(0);

              if(flag1key==1)  flag++;

             

             

              else if(flag1key==2&&duty<=90)

              {

                     duty+=10;

              }

              else if(flag1key==3&&duty>=10)

              {

                     duty-=10;

              }

              if(duty>=time)    MOTER=1;

              else MOTER=0;

             

              if(duty>=80)

              {

                     LED=1;

              }

              else

              {

                     LED=0;

              }

             

              t++;

       }

       lcd12864_clear();

}

void flagtwo()

{

       u8 flag2key=0;

       MOTER=0;

       duty=0;

       LED=0;

       TR0=0;

       show_base();

       lcd12864_show_string(4,1,"乘客已到达!");

       while(flag==2)

       {

              if(t==255)    getandshow();

             

              flag2key=key_scan(0);

              if(flag2key==1)  flag++;

             

              t++;

       }

       lcd12864_clear();

}

内容包括:

 

 需要完整的资料可在我的资源里下载,也可以加入我的纷传圈子,里面有资源压缩包的百度网盘下载地址及提取码。

纷传点击用微信打开即可,过程有点繁琐请见谅。

  • 11
    点赞
  • 111
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白茶丫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值