出租车计价器模拟装置的设计报告电子课程设计Word文档格式.docx
《出租车计价器模拟装置的设计报告电子课程设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《出租车计价器模拟装置的设计报告电子课程设计Word文档格式.docx(44页珍藏版)》请在冰豆网上搜索。
(1)设计并制作一个出租车计价器的模拟装置,示意图如图1-1所示。
如图1-1出租车计价器示意图
(2)8位数码管显示器的前4位数码管用于实时显示行车里程数(000.0),单位为公里;
后4位数码管用于实时显示金额数(000.0),单位为元。
(3)规定出租车单程价格为2元/公里,往返则价格为1.5元/公里。
单程与往返分别由“单程”按键和“往返”按键设定。
行车里程可用一按键模拟,规定每按一次键,行车里程加0.1公里。
(4)起步公里数为3公里,价格为8元,若实际运行大于3公里,按“基本要求2”计算价格。
(5)到达目的地后,按“暂停”键,计价器可暂停计价;
反复按“查询”键,计价器能依次显示总等待时间,里程数和金额数;
按“清除”键,能将记录的数据(里程、等待时间与价格等)清0。
(6)再增加8位数码管显示器,前4位数码管用于实时显示车速(000.0),单位为公里/小时;
后4位数码管用于实时显示累计等待时间(00:
00),单位为分:
秒。
(7)设计并制作一个能模拟出租车车速的装置。
要求采用单片机控制电机使转盘转动,用光电传感器检测转盘转动,车速与转数成正比。
规定转盘转速为5转/分对应车速5公里/小时,转盘转速为50转/分对应车速50公里/小时,依此类推。
转速可以通过键盘预置。
(8)能按上述模拟装置的转数计算行车里程,并依此作为计价依据,计价误差的绝对值小于10%。
(9)增加等待时间计价功能。
规定总等待时间为车速<
5公里/小时的累积时间,总等待时间每增加5分钟,相当于里程数增加1公里进行计价。
(10)增加起步价、起步价里程和每公里价格的预置功能。
价格预置功能要求密码确认,价格的默认值与基本要求一致。
第二章系统设计
2.1方案论证与比较
2.1.1方案一
方案一的系统框图如图2-1所示。
该方案拟采用单片机AT89C51为控制器,附加以数据存储模块,速度检测模块,LED显示模块,键盘模块等。
图2-1 方案一系统框图
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。
单片机的可擦除只读存储器可以反复擦除100次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器。
AT89C51单片机易学易懂,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
但是AT89C51单片机是一种比较低端的单片机,片上资源偏少。
例如本设计中要求存储数据功能,AT89C51单片机没有内部EEPROM,只能外加数据存储芯片,导致硬件线路和软件编程显得复杂。
另外,AT89C51单片机的软件开发平台不够人性化,软件开发比较繁琐。
2.1.1方案二
方案二的系统框图如图2-2所示。
该方案拟采用单片机ATMEGA16为控制器,附加以内部数据存储,速度检测模块,LED显示模块,键盘模块等。
图2-2 方案二系统框图
ATmega16有如下特点:
16K字节的系统内可编程Flash(具有同时读写的能力,即RWW),512字节EEPROM,1K字节SRAM,32个通用I/O口线,32个通用工作寄存器,用于边界扫描的JTAG接口,支持片内调试与编程,三个具有比较模式的灵活的定时器/计数器(T/C),片内/外中断,可编程串行USART,有起始条件检测器的通用串行接口,8路10位具有可选差分输入级可编程增益(TQFP封装)的ADC,具有片内振荡器的可编程看门狗定时器,一个SPI串行端口,以及六个可以通过软件进行选择的省电模式。
ATmega16单片机具有强大而丰富的片上资源和灵活方便的人性化软件开发平台,大大地简化了硬件线路的设计和软件的开发过程,减了软硬件的开发时间,并完全符合本设计的要求。
综上,通过分析论证,本次设计采用方案二。
2.2系统总体方案
方案二的系统框图如图2-3所示。
系统仿真图见附件。
图2-3 系统总体设计方案
该方案由ATMEGA16单片机为核心控制器,用以检测速度脉冲并计算转化为实际速度输出显示;
检测模拟装置的状态(包括空车状态、单程状态、等待状态、返程状态)并作出相应的动作;
检测模拟动作(包括里程加一模拟按键、速度模拟加减按键、数据清除按键);
检测参数修改于数据储存(包括起步里程的修改、起步价的修改、单程单价的修改、返程单价的修改);
检测参数修改时应通过的密码确认;
速度控制输出;
参数提取并送到LED数码管扫描显示;
工作状态指示输出等等。
2.3单元电路方案
2.3.1系统电源输入与转换模块
稳定的电源供应是单片机嵌入式系统的稳定工作的必要前提,所以电源的转换设计必须有较高的可靠性和抗干扰能力。
本设计所采用的电源输入与转换方案如图2-4所示。
该方案采用LM7805线性电源稳压芯片,加以前后两级电容滤波以及5个平波小电容,所构成的电源转换方案具有输出平稳,高压隔离,平波抗干扰等优点,具有较高的可靠性和抗干扰能力,保证了所设计系统的电源的稳定供应。
图2-4 电源输入与转换电原理图
2.3.2单片机控制核心模块
本设计所采用的核心控制芯片为Atmel公司生产的8位高性能单片机ATmega16,单片机控制核心模块电原理图如图2-5所示。
其中包括单片机工作必不可少的晶振电路、复位电路。
由于ATmega16单片机四个IO端口均是标志双向IO,具有输入内部可设置上拉电阻,故系统的按键不必外界上拉电阻,大大简化了硬件线路的设计。
速度检测原理是:
直接将速度传感器反馈的脉冲信号输入到ATmega16单片机的外部中断(INT1)输入端。
当速度传感器返回一个脉冲信号时,单片机读出其内部定时器从上一个脉冲信号到该返回脉冲信号所经过的定时时间,两个速度反馈脉冲直接的路程除以该时间间隔即为瞬时速度。
速度控制输出原理:
是利用单片机内部8位的定时器2的脉宽调制功能产生占空比可变的PWM信号去控制速度。
2.3.3LED数码管动态扫描显示模块
LED数码管的动态扫描显示是本出租车计价器模拟装置的核心功能之一,LED数码管扫描显示是否稳定直接关系系统的工作效果。
LED数码管动态扫描显示电原理图如图2-5所示。
图2-5 LED数码管扫描显示电原理图
LED数码管动态扫描显示的原理是:
采用四位共阴极LED数码管,其位选信号引脚接到低电平输出有效的3-8线译码器74HC138的输出端,单片机控制译码器的输出端来选通某一位数码管工作,达到动态扫描显示的效果。
LED数码管的段选信号引脚接到8位以为寄存器74HC164的并行输出端,单片机将要显示的字型码信息串行输入到移位寄存器,再又移位寄存器并行输出到LED数码管的段选引脚,使得已选通的数码管某一位显示特定的数字。
第三章相关芯片介绍
3.1ATmega16单片机
ATmega16是基于增强的AVRRISC结构的低功耗8位CMOS微控制器。
由于其先进的指令集以及单时钟周期指令执行时间,ATmega16的数据吞吐率高达1MIPS/MHz,从而可以缓减系统在功耗和处理速度之间的矛盾。
ATmega16AVR内核具有丰富的指令集和32个通用工作寄存器。
所有的寄存器都直接与算逻单元(ALU)相连接,使得一条指令可以在一个时钟周期内同时访问两个独立的寄存器。
这种结构大大提高了代码效率,并且具有比普通的CISC微控制器最高至10倍的数据吞吐率。
ATmega16有如下特点:
ATmega16单片机管脚图如图3-1所示。
图3-1 ATmega16管脚图
工作于空闲模式时CPU停止工作,而USART、两线接口、A/D转换器、SRAM、T/C、SPI端口以及中断系统继续工作;
掉电模式时晶体振荡器停止振荡,所有功能除了中断和硬件复位之外都停止工作;
在省电模式下,异步定时器继续运行,允许用户保持一个时间基准,而其余功能模块处于休眠状态;
ADC噪声抑制模式时终止CPU和除了异步定时器与ADC以外所有I/O模块的工作,以降低ADC转换时的开关噪声;
Standby模式下只有晶体或谐振振荡器运行,其余功能模块处于休眠状态,使得器件只消耗极少的电流,同时具有快速启动能力;
扩展Standby模式下则允许振荡器和异步定时器继续工作。
本芯片是以Atmel高密度非易失性存储器技术生产的。
片内ISPFlash允许程序存储器通过ISP串行接口,或者通用编程器进行编程,也可以通过运行于AVR内核之中的引导程序进行编程。
引导程序可以使用任意接口将应用程序下载到应用Flash存储区(ApplicationFlashMemory)。
在更新应用Flash存储区时引导Flash区(BootFlashMemory)的程序继续运行,实现了RWW操作。
通过将8位RISCCPU与系统内可编程的Flash集成在一个芯片内,ATmega16成为一个功能强大的单片机,为许多嵌入式控制应用提供了灵活而低成本的解决方案。
ATmega16具有一整套的编程与系统开发工具,包括:
C语言编译器、宏汇编、程序调试器/软件仿真器、仿真器及评估板。
3.23-8线译码器74HC138
74HC138是一款高速CMOS器件,74HC138引脚兼容低功耗肖特基TTL(LSTTL)系列。
74HC138译码器可接受3位二进制加权地址输入(A0,A1和A2),并当使能时,提供8个互斥的低有效输出(Y0至Y7)。
74HC138特有3个使能输入端:
两个低有效(E1和E2)和一个高有效(E3)。
除非E1和E2置低且E3置高,否则74HC138将保持所有输出为高。
利用这种复合使能特性,仅需4片74HC138芯片和1个反相器,即可轻松实现并行扩展,组合成为一个1-32(5线到32线)译码器。
任选一个低有效使能输入端作为数据输入,而把其余的使能输入端作为选通端,则74HC138亦可充当一个8输出多路分配器,未使用的使能输入端必须保持绑定在各自合适的高有效或低有效状态。
74HC138的管脚图如图3-2所示。
图3-2 74HC138管脚图
本设计中用于显示的LED数码管是四位共阴极数码管,即每四位LED数码管显示计价器模拟装置的一个参数。
当动态扫描显示的时候,用74HC138来选通LED数码管的位选管脚,既达到增强LED数码管的驱动电流的效果,也能节省单片机的IO端口,使硬件设计变得简洁。
3.3移位寄存器74HC164
74HC164、74HCT164是高速硅门CMOS器件,与低功耗肖特基型TTL(LSTTL)器件的引脚兼容。
74HC164、74HCT164是8位边沿触发式移位寄存器,串行输入数据,然后并行输出。
数据通过两个输入端(DSA或DSB)之一串行输入;
任一输入端可以用作高电平使能端,控制另一输入端的数据输入。
两个输入端或者连接在一起,或者把不用的输入端接高电平,一定不要悬空。
时钟(CP)每次由低变高时,数据右移一位,输入到Q0,Q0是两个数据输入端(DSA和DSB)的逻辑与,它将上升时钟沿之前保持一个建立时间的长度。
主复位(MR)输入端上的一个低电平将使其它所有输入端都无效,同时非同步地清除寄存器,强制所有的输出为低电平。
74HC164的管脚图如图3-3所示。
图3-3 74HC164管脚图
当动态扫描显示的时候,用74HC164来将要显示的字型码数据通过串入并出的方式传送到LED数码管的段选管脚,大大的节省了单片机的IO端口,使硬件设计变得简洁。
第四章软件设计
主控制器芯片为Atmega16,由于处理器速度较快,所以采用C语言编程方便简单。
软件编写使用AVR单片机软件开发平台CVAVR编译器,改编译器有丰富的AVR单片机常用函数模块、常用外设硬件驱动动态链接库,使用极其方便,具有高度的人性化。
软件流程图如图4-1所示。
图4-1 软件流程图
第五章系统测试
由于时间不允许,设计的出租车计价器模拟装置只在电子仿真平台PROTEUS7.0仿真测试通过。
测试结果表明,设计的出租车计价器模拟装置具有设计要求提出的绝大部分功能,并且全部仿真测试通过。
仿真电子线路图见附件。
结论/展望
在这段时间里,经过自己努力,基本上完成了设计要求的内容,在系统可行性分析、原理图设计、PCB绘制等方面都作了许多实际工作,取得了一些成绩,同时也遇到了一些问题,存在一些不足。
经过这段时间的学习和工作,我觉得自己不论是在理论知识方面还是在动手能力方面都有了不小的进步,自己从中受益匪浅。
这次设计很好的把以前学到的理论知识应用于实践,使我认识到理论知识与实践之间有一定的差距,只有通过不断的努力学习和实践才能很好的把理论知识应用到实践当中,也只有通过不断的实践才能对理论知识的理解。
通过这次设计不仅学会了如何去查找相关资料,更重要的是通过查找资料和翻阅书籍学到了不少知识,扩大了知识面,提高了知识水平。
经过单元设计和系统设计巩固了以前所学的专业知识,自己真正认识到理论联系实际的重要性,为以后的学习和工作提供了很多有价值的经验。
通过这次设计不仅增强了自己的动脑能力和动手能力,也提高了我思考问题、分析问题、解决问题的能力,更重要的是学会用工程化的思想来解决问题。
这在以前的学习过程中是不曾学到的。
这次设计是我认真认识到完整、严谨、科学分析问题、解决问题的思想是多么的重要,只有拥有了科学的态度才能设计出有用的产品。
另外通过本次设计,使我认识到自己理论知识的应用能力有很大的欠缺,需要在以后的学习中进一步提高。
附录
附录1出租车计价器模拟装置仿真测试线路图
附录2出租车计价器模拟装置电原理图
附录3出租车计价器模拟装置印制PCB图
附录4出租车计价器模拟装置程序清单
/*****************************************************
Thisprogramwasproducedbythe
CodeWizardAVRV2.05.0Professional
AutomaticProgramGenerator
?
Copyright1998-2010PavelHaiduc,HPInfoTechs.r.l.
Project:
出租车计价器
Version:
1
Date:
2011/12/5
Author:
曾宪金陈志强黄宝生
Company:
广西大学电气工程学院
Chiptype:
ATmega16
Programtype:
Application
AVRCoreClockfrequency:
8.000000MHz
Memorymodel:
Small
ExternalRAMsize:
0
DataStacksize:
256
*****************************************************/
//所需头文件
#include<
mega16.h>
delay.h>
//预定义移位寄存器所用端口
#defineHC164_data1PORTC.0
#defineHC164_clk1PORTC.1
#defineHC164_data2PORTC.2
#defineHC164_clk2PORTC.3
#definekey_onewayPINC.4
#definekey_pausePINC.5
#definekey_roundtripPINC.6
#definekey_clearPINC.7
#definekey_lichengPIND.0
#definekey_jiancePIND.1
#definekey_shezhiPIND.2
#definekey_shezhi_jiaPIND.4
#definekey_shezhi_jianPIND.5
//预定义出租车状态所用变量
#definezhunbei0
#definedancheng1
#definezanting2
#definewangfan3
#definejiance4
#defineshezhi5
#definemimaqueren6
#definelunzi_kongshu8//轮子边沿所开的孔数,即轮子每转一圈所产生的脉冲数
//#definelunzi_banjing20//轮子的半径(单位:
mm),用于计算累加里程2*3.14*lunzi_banjing即为轮子转过一圈时里程的累加量(单位也是:
mm)
//定义数码管扫描字型码及位选码
flashunsignedcharled_7[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
flashunsignedcharposition[]={0x00,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x80,0x90,0xa0,0xb0,0xc0,0xd0,0xe0,0xf0};
//定义taxi结构体
structtaxi{
unsignedintlicheng;
unsignedintfeiyong;
unsignedcharstate;
//出租车当前状态,包括单程
(1)、往返
(2)、暂停三个状态(0)
unsignedintsudu;
unsignedintdengdaishijian[2];
unsignedcharfujia_dengdai;
unsignedchardancheng_danjia;
unsignedcharwangfan_danjia;
unsignedintqibujia;
unsignedcharqibulicheng;
};
structtaximytaxi;
//声明mytaxi结构体
unsignedchardis_buff[];
//声明显示缓存区
bitkeyflag_oneway=1;
bitkeyflag_pause=1;
bitkeyflag_roundtrip=1;
bitkeyflag_licheng=1;
bitkeyflag_jiance=1;
bitkeyflag_clear=1;
bitkeyflag_shezhi=1;
bitkeyflag_shezhi_jia=1;
bitkeyflag_shezhi_jian=1;
bitflag_dancheng=0;
bitflag_wangfan=0;
bitflag_zanting=0;
bitflag_jiance=0;
bittime_lichengleijiajia_ok=0;
unsignedcharqibujia_from_epprom=0;
unsignedinttimecounter=0;
unsignedintinterrupt_timecounter=0;
//每两个车速检测脉冲中断之间的时间间隔(ms)
unsignedintspeed_time=0;
//轮子转过一圈(轮子边沿所开的孔数个脉冲累计)所需要的时间
unsignedcharinterrupt_cishu=0;
//判断是否转过一圈
unsignedintleijia_licheng=0;
//通过速度来累加里程数(中间变量)
//unsignedintlicheng_timecounter=0;
//多长时间更新累加里程数(因为里程累加是用这个定时时间乘以当时的瞬时速度得到的,所以这个定时时间必须足够小才能保证里程累加的准确性)
voideeprom_write(unsignedintuiAddress,unsignedcharucData)//写EEPROM函数
{
whi