基于STM32F103ZE的出租车计价器.docx
- 文档编号:7923571
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:24
- 大小:443.88KB
基于STM32F103ZE的出租车计价器.docx
《基于STM32F103ZE的出租车计价器.docx》由会员分享,可在线阅读,更多相关《基于STM32F103ZE的出租车计价器.docx(24页珍藏版)》请在冰豆网上搜索。
基于STM32F103ZE的出租车计价器
摘要
本设计以STM32F103ZE为控制核心处理器,实现了矩阵键盘输入、五方向控制手柄信息输入、中文LCD显示、8位数码管显示屏显示;并具有电机速度测量、双屏显示、立体声音频等功能;完成了题目中所有的基本要求和发挥要求,并具有出租车速度测量与控制、支持休眠节能等鲜明的特色。
系统采用STM32F103ZE-EK开发板为核心控制器,完成了简易出租车计价器的各项功能要求。
我们实现了8位数码管的显示行车里程数(000.0),实时显示金额数(000.0),单程与往返分别由“单程”按键和“往返”按键设定。
行车里程可用一个按键模拟每按一次键,行车里程加0.1公里。
按“暂停”键,计价器可暂停计价,反复按“查询”键,计价器能依次显示总等待时间,里程数和金额数。
除基本功能外,实现电机的调速和测速,并据此计算的价格误差小于10%,同时实现了LCD和LED双显示屏。
此外,我们利用开发板上优良的语音播放功能,增加收银机的语音播放特色。
关键词:
STM32F103ZE出租车计价LCD中文显示LED数码显示矩阵键盘
第1章前言
1.1、研究背景
嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。
它一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户的应用程序等四个部分组成,用于实现对其他设备的控制、监视或管理等功能。
嵌入式系统一般指非PC系统,它包括硬件和软件两部分。
硬件包括处理器/微处理器、存储器及外设器件和I/O端口、图形控制器等。
软件部分包括操作系统软件(OS)(要求实时和多任务操作)和应用程序编程。
有时设计人员把这两种软件组合在一起。
应用程序控制着系统的运作和行为;而操作系统控制着应用程序编程与硬件的交互作用。
嵌入式系统的核心是嵌入式微处理器。
嵌入式微处理器一般具备以下4个特点:
1)对实时多任务有很强的支持能力,能完成多任务并且有较短的中断响应时间,从而使内部的代码和实时内核心的执行时间减少到最低限度。
2)具有功能很强的存储区保护功能。
这是由于嵌入式系统的软件结构已模块化,而为了避免在软件模块之间出现错误的交叉作用,需要设计强大的存储区保护功能,同时也有利于软件诊断。
3)可扩展的处理器结构,以能最迅速地开展出满足应用的最高性能的嵌入式微处理器。
4)嵌入式微处理器必须功耗很低,尤其是用于便携式的无线及移动的计算和通信设备中靠电池供电的嵌入式
嵌入式计算机系统同通用型计算机系统相比具有以下特点:
1.嵌入式系统通常是面向特定应用的嵌入式CPU与通用型的最大不同就是嵌入式CPU大多工作在为特定用户群设计的系统中,它通常都具有低功耗、体积小、集成度高等特点,能够把通用CPU中许多由板卡完成的任务集成在芯片内部,从而有利于嵌入式系统设计趋于小型化,移动能力大大增强,跟网络的耦合也越来越紧密。
2.嵌入式系统是将先进的计算机技术、半导体技术和电子技术与各个行业的具体应用相结合后的产物。
这一点就决定了它必然是一个技术密集、资金密集、高度分散、不断创新的知识集成系统。
3.嵌入式系统的硬件和软件都必须高效率地设计,量体裁衣、去除冗余,力争在同样的硅片面积上实现更高的性能,这样才能在具体应用中对处理器的选择更具有竞争力。
4.嵌入式系统和具体应用有机地结合在一起,它的升级换代也是和具体产品同步进行,因此嵌入式系统产品一旦进入市场,具有较长的生命周期。
5.为了提高执行速度和系统可靠性,嵌入式系统中的软件一般都固化在存储器芯片或单片机本身中,而不是存贮于磁盘等载体中。
6.嵌入式系统本身不具备自举的开发能力,即使设计完成以后用户通常也是不能对其中的程序功能进行修改的,必须有一套开发工具和环境才能进行开发。
嵌入式硬件系统DSP处理器,英文名称:
DigitalSignalProcessor,DSP处理器是专门用于信号处理方面的处理器,其在系统结构和指令算法方面进行了特殊设计,具有很高的编译效率和指令的执行速度。
在数字滤波、FFT、谱分析等各种仪器上DSP获得了大规模的应用。
1.2、研究目的与意义
嵌入式技术应用主要就业方向和前景:
嵌入式技术及应用是计算机应用技术的新发展,具有广泛的应用领域和发展前景,就业形势看好。
该专业毕业生适于IT行业、信息家电和机电类产品中的计算机应用设计开发岗位就业,担任嵌入式产品及应用系统的设计与开发工程师,从事嵌入式技术的应用项目设计开发、产品维护与技术服务等工作。
第2章整体设计方案
根据方案的要求,我们对出租车计价器所需方案的各个部分进行设计如下:
图1-1整体框图
在满足系统需要的情况下,我们首先要确定系统实现的功能:
(1)8位数码管显示器的前4位数码管用于实时显示行车里程数(000.0);后4位数码管用于实时显示金额数(000.0)。
(2)单程与往返分别由“单程”按键和“往返”按键设定。
行车里程可用一按键模拟,规定每按一次键,行车里程加0.1公里。
(3)按“基本要求2”计算价格。
(4)按“暂停”键,计价器可暂停计价;反复按“查询”键,计价器能依次显示总等待时间,里程数和金额数;按“清除”键,能将记录的数据(里程、等待时间与价格等)清0。
(5)增加8位数码管显示器,前4位数码管用于实时显示车速(000.0),;后4位数码管用于实时显示累计等待时间(00:
00)。
(6)制作一个能模拟出租车车速的装置。
用光电传感器检测转盘转动,车速与转数成正比,转速可以通过键盘预置。
(7)能按上述模拟装置的转数计算行车里程,并依此作为计价依据,计价误差的绝对值小于10%。
(8)增加等待时间计价功能。
规定总等待时间为车速<5公里/小时的累积时间,总等待时间每增加5分钟,相当于里程数增加1公里进行计价。
(9)增加起步价、起步价里程和每公里价格的预置功能。
价格预置功能要求密码确认,价格的默认值与基本要求一致。
第3章模块的选型
3.1、控制器模块选型
方案一:
采用传统的8位的51系列单片机作为系统控制器。
P89C51RD2单片机是一款具有ISP/IAP功能的单片机,它的片内具有64K字节Flash程序存储器、1K字节数据存储器、3个16位定时/计数器,6个中断、1个全双工串行口等资源。
无论是从内部构造还是编程方面51系列单片机都相对简单,容易掌握和使用。
但其端口资源和功能相对不够丰富,难以满足我们的设计需要。
方案二:
采用32位的STM32F103ZE作为计价器的控制核心。
该控制芯片具有ARM最新的Cortex-M3内核,优先级抢占的中断控制器,支持中断自动嵌套,硬件完成现场保护与恢复,中断嵌套时,装备了可编程的掉电监测器,带电池供电的数据备份寄存器,芯片进入低功耗模式后可以通过“事件”唤醒,而无须执行中断子程序,GPIO刷新速率可设定,可检测PWM脉宽和频率(硬件直接支持),SPI还带硬件的CRC校验高达18Mb/s的通讯速度,特别是如此强大的处理器价格只要十几块钱。
STM32的这些特点非常有利于进行本设计,而且将来可以安装操作系统,实现远程监控和调整,信息采集和呼救,开发成一个数字中心。
综上分析,由于STM32F103ZE的强大功能,并且可以移植各种操作系统,是控制器工作可靠,因此,控制器模块选择方案二。
3.2、键盘模块方案选择
方案一:
用一块74LS138译码输出8路扫描信号,3路扫描返回信号线接I/O口输入(我们设计的是3*8的键盘)。
这种设计方案电路设计非常的简单,但是软件的编写要考虑软件去抖等,会比较复杂而且占用大量的CPU资源。
方案二:
系统采用矩阵键盘。
键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。
在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。
这样,一个端口就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,本计价器要求键盘资源比较丰富,正好切合本设计的需要。
基于以上两种方案比较,采用方案二。
3.3、液晶模块方案选择
方案一:
LED显示设计采用164驱动电路实现的LED作为液晶显示器。
该显示模块8-位串行显示器,可直接和SPI总线进行互联,编程实现容易,但是显示界面难以满足我们要求多功能扩展的需要。
方案二:
采用QTM4001WQVGA触摸屏作为液晶显示器。
WQVGA液晶显示模块是400×240点阵的汉字图形型液晶显示模块,可显示汉字及图形,内容15x8行,内含7602个简体中文字型,支持4/8位6800/8080MPU接口,提供中/英文文字对齐功能,内建粗体字形与行距设定,对比度软件调节,用户可自建字库。
通过后续开发可扩展功能,实现手写和触摸操作。
比较两种方案,第一种是设计要求,第二种可以增强其功能,所以我们选择两种方案。
3.4、存储模块方案选择
鉴于改计价器要求存储内容不多,我们采用开发板自带的FLASH存储器和自身的数据备份寄存器存储,如有需要可以扩展SD卡增加存储空间。
此外,FLASH本身还具有加密功能,可以保证数据资料的安全性和程序的防反汇编破解功能。
综上所述,我们选择以32位的STM32103FZE作为出租车计价器的控制核心,扩展通用的矩阵键盘、扩展LED和QTM4001WQVGA中文点阵液晶触摸显示屏实现汉字及图形显示、使用系统FLASH存储资源、扩展单片机控制步进电机调速系统和测速系统实现出租车服务价格的计算。
最终方案确定:
功能细分表
功能模块
功能描述
备注
STM32
总控芯片,型号为STM32F103ZET6,大容量、高性能微处理器
车速检测电路
采用反射式对管光电传感器
光强检测电路
采用普通的光敏电阻来搭建,用来检测周围环境的光强,以便实时调节LCD背光强度降低显示上的功耗
数码管显示
采用4组4位一体数码管,分别实时显示行车里程数、金额数、当前车速、累计等待时间。
液晶屏显示
采用3.0寸、分辨率为400×240的TFT液晶屏,提供更具人性化的界面,系统可以在数码管和液晶屏两种显示方案之间选择
功能按键
分别有单程、往返、里程增加、暂停、查询、清除、10个数字键(用于输入密码)、一个确定键、一个取消键、一个LCD背光使能
按键太多,与实际的出租车计价器有差距
蜂鸣器+LED状态指示
用于指示当前的状态,包括正常情况下的各种指示、异常情况下的报警
存储设备
外接的NANDFlash和NORFlash
第4章硬件电路设计
根据题目要求和本系统的设计思想,系统主要包括图2.1所示的模块。
图2-1系统结构框图
4.1、液晶显示设计
采用TM4001WQVGA触摸屏作为液晶显示器。
WQVGA液晶显示模块是400×240点阵的汉字图形型液晶显示模块,可显示汉字及图形,内容15x8行,内含7602个简体中文字型,支持4/8位6800/8080MPU接口,提供中/英文文字对齐功能,内建粗体字形与行距设定,对比度软件调节,用户可自建字库。
通过后续开发可扩展功能,实现手写和触摸操作。
液晶与I/O口线的实物连接图如下:
图2-2QTM4001WQVGA液晶实物电路连接图
4.2、LED显示设计
采用164驱动电路实现的LED作为液晶显示器。
该显示模块8-位串行显示器,可直接和SPI总线进行互联,编程实现容易,但是显示界面难以满足我们要求多功能扩展的需要。
图2-3LED数码显示管
4.3、键盘输入设计
在本系统中,针对出租车计价器对键盘的特殊需要,我们采用矩阵键盘。
键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。
在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。
这样,一个端口就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,本计价器要求键盘资源比较丰富,正好切合本设计的需要。
图2-4键盘电路原理图
4.4、存储模块接口电路设计
SD卡拥有高记忆容量、快速数据传输率、极大的移动灵活性以及很好的安全性。
通过9针的接口界面与专门的驱动器相连接,不需要额外的电源来保持其上记忆的信息。
在SPI模式下,主机使用SPI总线直接对卡进行访问。
下图为SD卡与LPC2138通讯的接口电路连接图(SPI模式)
图2-5NORFLASH存储引线连接图
图2-6NANDFLASH原理图
4.5、速度控制与测量接口电路设计
如下图所示,
图2-7直流电机的硬件连接图
图2-8检测接口原理图
第5章系统软件设计
5.1、主程序流程:
图3-1主程序流程图
5.2、键盘输入流程
图3-键盘输入流程图3-3中断处理流程
5.3、计价程序流程
出租车计价过程比较麻烦,计算程序流程如下图:
5.4、日历时钟程序流程
图3.6日历时钟部分程序流程
第6章理论分析与计算
6.1、出租车计价规则:
根据资料和对日常生活出租车收费调查得:
出租车行驶里程:
m;
出租车服务金额:
p;
单程单价:
s1;
返程单价:
s2;
出租车起步价:
8元;
出租车起步距离:
3公里;
一次载客累计等待时间:
wt;
车速:
s;
则当单程任务下行驶距离M大于3公里时总的价格为:
p总价格=p等待计费+p距离计费+起步价
=
当返程任务下行驶距离M大于3公里时总的价格为:
p总价格=p等待计费+p距离计费+起步价
=
当单程或返程任务下行驶距离M小于3公里时总的价格为:
p总价格=p等待计费+p距离计费
=
6.2、电机调速模块的设计和测速计算:
要求5转/分对应车速5公里/小时,50转/分钟对应车速50公里每小时,则据此可计算:
当测速系统测的转数为n时,则出租车服务价格应为:
(注:
实际程序中等待时间不予考虑,如果考虑,只需在程序中加入虚线部分公式即可,但考虑到无实际意义,实际程序中并未考虑。
)
K=
则:
当返程任务下行驶距离M大于3公里时总的价格为:
p总价格=p总价格=p等待计费+p距离计费+起步价
=
p总价格=p等待计费+p距离计费+起步价
=
第7章编写程序
7.1、主程序:
while
(1)
{
CPU_IDLE();
//if(CheckTimer
(1))
//{
//StartTimer(1,10);
//
//}
if((TimeDisplay==1)||(fRefresh==1))
{
TimeDisplay=0;
RTC_Updata(&g_calendar,&g_time);
//if(S_taxiCaseStatus)
//{
Taxi_UpdataTaxiCase(&g_taxiCase,&g_taxiValu,&g_time,1);
//}
DisplayCurTime(status);
printf("\n\rcase=%d,wait=%d,key=%d",S_taxiCaseStatus,S_waitStatus,keyCode);
}
/*刷新屏幕*/
if(fRefresh==1)
{
fRefresh=0;
switch(status)
{
case0:
DisplayCurTaxiInfo();/*显示旅客乘车信息*/
break;
case1:
DisplayTaxiDriverInfo();/*显示出租车司机信息*/
break;
default:
DisplayTaxiValuation(keyCode);/*显示计价信息*/
break;
}
}
keyCode=GetKey();
if(keyCode>0)
{
switch(keyCode)
{
caseKEY_DOWN_USER:
status++;
status=(status%DEMO_COUNT);
fRefresh=1;/*请求刷新LCD*/
printf("\nKEY_DOWN_USER,status=%d",status);
break;
caseKEY_DOWN_JOY_LEFT:
g_taxiCase.tripType=SingleTrip;
status=0;
fRefresh=1;/*请求刷新LCD*/
printf("\nKEY_DOWN_JOY_LEFT");
break;
caseKEY_DOWN_JOY_RIGHT:
g_taxiCase.tripType=RoundTrip;
status=0;
fRefresh=1;/*请求刷新LCD*/
printf("\nKEY_DOWN_JOY_RIGHT");
break;
caseKEY_DOWN_JOY_UP:
S_taxiCaseStatus=1;
Taxi_InitTaxiCaseInfo(&g_taxiCase,&g_calendar);
Taxi_StartTaxiCase(&g_taxiCase,&g_time);
printf("\n\rcase=%d,key=%d",S_taxiCaseStatus,keyCode);
status=0;
fRefresh=1;/*请求刷新LCD*/
break;
caseKEY_DOWN_JOY_DOWN:
S_taxiCaseStatus=0;
Taxi_EndTaxiCase(&g_taxiCase,&g_time);
printf("\n\rcase=%d,key=%d",S_taxiCaseStatus,keyCode);
status=0;
fRefresh=1;/*请求刷新LCD*/
break;
caseKEY_DOWN_JOY_OK:
S_waitStatus++;
S_waitStatus=(S_waitStatus%2);
printf("\nKEY_DOWN_JOY_OK,wait=%d",S_waitStatus);
break;
default:
break;
}
}
7.2、出租车计价程序(部分):
/*************************************************************************/
/**
*@brief更新乘车实例的当前计价信息
*@paramP_caseInfo:
一个乘车实体指针
*@paramP_valu:
计价规定信息的实例指针
*@paramP_time:
当前时间
*@paramWiatFlag:
当代状态,0为不等待,1为等待
*@retval:
None
*/
voidTaxi_UpdataTaxiCase(TaxiCaseInfo*P_caseInfo,
constTaxiValuation*P_valu,
constTime*P_time,
uint8_tWaitFlag)
{
/*更新总时间*/
(P_caseInfo->totalTime).hour=((P_time->hour+24)-(P_caseInfo->startTime).hour)%24;
(P_caseInfo->totalTime).minute=((P_time->minute+60)-(P_caseInfo->startTime).minute)%60;
(P_caseInfo->totalTime).second=((P_time->second+60)-(P_caseInfo->startTime).second)%60;
/*如果出于等待状态则记录等待时间*/
if(WaitFlag)
{
s_waitTimeCounter++;
(P_caseInfo->waitTime).hour=s_waitTimeCounter/3600;
(P_caseInfo->waitTime).minute=(s_waitTimeCounter%3600)/60;
(P_caseInfo->waitTime).second=(s_waitTimeCounter%3600)%60;
}
/*更新价格,分别考虑起步价、单程/往返、等待时间过长的情况*/
if(P_caseInfo->mileage>P_valu->startMileage)
{
if(P_caseInfo->tripType==SingleTrip)
{
P_caseInfo->price=P_valu->startPrice+
(P_caseInfo->mileage-P_valu->startMileage)*P_valu->singleTripPrice;
/*处理等待时间每增加5分钟相当于里程数增加1公里的计价*/
if((s_waitTimeCounter/60)>5)
{
P_caseInfo->price+=(s_waitTimeCounter/(60*5))*P_valu->singleTripPrice;
}
}
else
{
P_caseInfo->price=P_valu->startPrice+
(P_caseInfo->mileage-P_valu->startMileage)*P_valu->roundTripPrice;
/*处理等待时间每增加5分钟相当于里程数增加1公里的计价*/
if((s_waitTimeCounter/60)>5)
{
P_caseInfo->price+=(s_waitTimeCounter/(60*5))*P_valu->roundTripPrice;
}
}
}
else
{
P_caseInfo->price=P_valu->startPrice;
}
}
7.3、计时部分主要程序:
/***@b
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 STM32F103ZE 出租车 计价器
![提示](https://static.bdocx.com/images/bang_tan.gif)