文档库 最新最全的文档下载
当前位置:文档库 › 毕业论文

毕业论文

应用电子专业毕业设计

题目计程车多功能计价器

作者:连芦敏

班级:04级电子2班

学号:20040303075

指导教师:张清芝

设计时间:2007年4月8日至2007年5月16日

目录

摘要 (2)

关键字 (2)

引言 (2)

一、整体方案设计 (2)

1.1 设计要求及主要技术指标 (2)

1.2 设计方案比较 (2)

1.3 整体设计方案的实现 (3)

二、模块的设计 (4)

2.1时钟频模块 (4)

2.1.1时钟模块的设计思路及原理 (4)

2.1.2 时钟频模块的仿真实现 (4)

2.2I C卡模块 (5)

2.2.1I C卡设计思路及原理 (5)

2.2.2 IC卡模块的仿真实现 (5)

2.3 语音模块 (6)

2.3.1语音模块的设计思路及原理 (6)

2.3.2语音模块的仿真实现 (6)

2.4显示模块 (7)

2.4.1显示模块的设计思路及原理 (7)

2.4.2 显示模块的仿真实现 (7)

2. 5 打印模块 (8)

2. 5 .1 打印模块的思路及原理 (8)

三、软件的制作 (7)

四、系统的测试 (9)

4.1 测试仪器 (9)

4.2 测试方法 (9)

4.1 测试结果 (9)

五、结束语 (9)

参考文献 (9)

附录 (10)

多功能计程车计价器

摘要:介绍了基于8052的多功能计程车计价器的电路设计。该设计采用了可编程逻辑器件FPGA的ASIC设计,并基于超高速硬件描述语言VHDL在Xilinx公司的SpartanⅡ系列的2sc200PQ208-5芯片上编程实现了整个系统的控制部分,整个自动控制系统由四个模块构成:时钟模块、IC卡模块、语音模块、显示模块和打印模块。该设计不仅仅实现了显示计程车计费的功能,其多功能表现在它可以通过选择键选择显示计程车累计走的总路程和乘客乘载的时间。计时、计程、计费准确可靠,应用于实际当中有较好的实用价值和较高的可行性。

关键字:单片机;微型打印机;IC卡;计时;计价;计程

1 引言

随着我国市场经济的发展,交通也越来越便利,特别是计程车,以快捷、方便的特点早已盛行各个城市,成为城市交通的重要工具。计程车市场从90年代初的起步阶段到现在已经进入了高峰期。随着城市化水平的提高和人民生活水平的改善,计程车的服务也就显得越来越重要。因此计程车计价器也就应运而生了。本设计就是针对目前计程车计价器的问题设计的一种基于可编程逻辑器件FPGA的ASIC,并用超高速硬件描述语言VHDL编程实现的可同时显示金额、乘车时间、乘车总路程的“多功能”计价器。有较好的实用价值和较高的可行性。

2整体方案设计

2.1设计要求及主要技术指标

实现计程车的计价器功能。一方面实现基本功能时,包括在行程中满足3公里以内计起步价 10 元,以后以1.6元/公里计费;处于等待的状态下满足2 分钟以内计2元,以后以1.5元/分计费。另一方面多功能的实现,计价器可以根据要求显示需要的内容,可以根据选择键选择显示总费用,总行程数和总乘车时间等等。设计的主要技术指标如下:

1、计价范围: 0~910.0元

计价分辨率: 0.1元。

2、计程范围: 0~99公里

计价分辨率: 1公里。

3、计时范围: 59分59秒

计时分辨率: 1秒(<1小时)

2.2 设计方案比较

方案一:用单片机实现:通过软件编程,仿真,调试,符合要求后将程序用编程器写入到单片机芯片上。利用单片机的中断响应乘客开车或者等待的请求,进行相应的处理。利用寄存器存放计价器系统运行状态,从而可以根据整个行程的状态进行计价。

方案二:用FPGA(可编程门阵列)实现:利用硬件描述语言编程,仿真调试后下载到可编程逻辑器件(CPLD)上实现。可以对计程车整个过程进行判断、处理。整个过程完全实现了自动化和智能化。

比较而言,方案一的开发及制作成本较低,能较大程度地利用资源,但外围电路较多,调试复杂,抗干扰能力差,特别对这种计程车的计价器需要长时间不间断运作的系统,由于主要是软件运作,容易出错,造成系统不稳定。方案二将所有器件集成在一块芯片上,体积

大大减小的同时还提高了稳定性,并且可应用EDA软件仿真,调试,易于进行功能扩展,外围电路较少,采用硬件逻辑电路实现,其最大的优点是稳定性好,抗干扰能力强,非常适合作为计程车的计价器系统的控制核心。基于对以上各个因素的考虑,我们觉得FPGA实现计程车的计价器的设计更设计的要求,提升设计的可行性。因此,决定选用以8052为核心,用V 软件编程来实现计价器的设计。

2.3 整体设计方案的实现

多功能计程车计价器的控制系统以8052为核心控制器。如图1所示,主要分为五个模块。分别为:时钟模块、IC卡模块、语音模块和显示模块. 打印模块。时钟模块使整个系统的同步工作,把系统提供的32M的晶振频率进行分频,得到我们所需要的秒信号(便于在以后的计时中用到)。控制模块是整个系统的核心部分,对各个部分起到了调控的作用。对计程车的工作状态进行具体的定义。计量模块也是系统中一个十分重要的模块,它分为三个部分,分别为计价部分、计时部分和计程部分,是计程车计价器系统多功能实现的保证。最后一个译码显示模块作用在于把计程车的工作情况(价钱、行程数、行程时间)反馈给乘客。五个模块有机地结合在一起,实现了基于8052的多功能计程车计价器的设计。

时钟模块

IC卡模块

语音模块

显示模块

打印模块

计程部分

图1 系统硬件结构图

3模块的设计

3.1时钟模块

要把系统提供的频率为32MHz的晶振应用与实际中,就必须对高频率做一些处理,也就是要对它进行分频。时钟为我们所期望的频率值再投于应用中。所以这里我们就应用到了时钟模块。

3.1.1时钟模块的设计思路及原理

分频模块用于把系统提供的32M的晶振频率进行分频,所得我们所需要的固定的频率值,也就是系统中的sec信号。对它进行32M的分频。所以sec的频率为:

32M Hz/ 32M = 1Hz

也就是说分频为周期为1s的信号,且占空比为50% 。应用于系统中的计时部分,和其他应用的部分。

3.1.2时钟模块的仿真实现

由于分频系数过大,给仿真带来了一定的困难。所以仿真时,我们采用低一点的分频数来实现,其原理是相同的。如下图2.2.1所示,这里采用的是八分频,其中占空比为0.5。在程序中都可以设置需要的任意频率值和占空比值。

图2 DS12887与8052单片机的接口图

3.2 IC卡模块

IC卡模块对整个系统进行控制作用,支配系统的工作状态。描述了多功能计程车计价器整个工作过程的状态。它是计价器工作的核心。

3.2.1 IC卡模块的设计思路及原理

控制模块是整个系统设计的核心内容,描述了计价器最基本的工作状态。实现了对计程车的等待状态和行进状态工作过程的控制。等待过程中实现计时三分钟以内不变价格,以后以分钟的计价;行进过程中实现了三公里以内不变价格,以后每公里计价的功能。它是计程车计价器正常工作的保证。

3.2.2 IC卡模块的仿真实现

IC卡模块中包括时间部分的控制和路程部分的控制。时间部分的控制除了可以对整个控制过程进行计时以外,还表现在计程车处于等待状态时先对前两分钟计时(此时计价2元),然后就以分钟计时(此时1.5元/分)。其仿真图如下2.2.1所示。路程方面的控制也不仅仅是对计程车整个行进的过程的路程进行计算,控制方面的作用还表现在当计程车行进的路程在三公里以内的路程的计算,这里以每公里为计算单位(此时计价1.6/公里)。

3. 3语音模块

2 .

3 1语音模块的设计思路及原理

考虑到计价器产品的微型化、智能化,语音芯片采用了集成度较高的ISDl420芯片,其最大特点是采用EEPROM进行模拟信息直接存取而不必经过A/D和D/A转换。它内部带有话筒放大器、自动增益控制时钟、扬声器驱动电路等,采用+5V电源供电。

语音模块与主系统的接口如图2所示,主系统通过8155扩展芯片的PA口与ISDl420芯片相连。设计过程中,先将固定语音部分(上、下车用语)信息存储到ISDl420内部的不同起点地址中。营运过程中根据上、下车的不同营运状态来实现不同语音功能播放。语音芯片工作时,系统首先将主程序指针转入放音处理程序,根据发音地址寻找ISDl420中的发音单元,然后将信号送到扬声器发出声音。主CPU完成送音程序后,立刻转入其他子程序。

图4 语音模块接口电路

3.4显示模块

译码显示模块是建立在内部系统和观测人之间的桥梁。通过译码显示模块,人们才能得到想要的信息。可见,它也是系统中一个必不可少的部分。

3.4.1译码显示模块的设计思路及原理

这里的译码显示模块包括四个译码器和四个七段显示数码管。用于显示需要的信息

。需要说明的是它可以根据需要在价格、时间、路程三者之间互相转换。通过对输入模块的选择信号判断,而显示计程车运行的状态,比如说计价多少、走了多长时间、走了多少路程等。具体的状态转换图如下2.4.1。显示内容由一个选择键来控制,发出选择信号C,当C=‘11’时,表示显示乘车的时间;当C=‘01’时,表示显示乘车的费用;当C=‘11’时,表示显示乘车的总路程。他们之间的切换同样也是通过这个选择键、选择信号来实现的。

3.4.2显示模块的仿真

仿真图如下图2.4.2所示:可以看到该七段译码显示器是低电平有效的。点亮而显示相应的数据。

3.5打印模块

3. 5. 1打印模块的设计思路及原理

打印出租车专用发票,包括车牌号、上车时间、下车时间、等候时间、营运里程、单价、金额及日期等。

本系统单独设计了智能微打电路:采用接口插板方式与主机相连,这—特点使得计价器的票据打印在功能上与主系统一体化,而在检查、维修时又可单独进行。本系统中所用微打的打印头是EPSON公司生产的Model——15 0Ⅱ型打印头。它是一种机械点阵式4针打印机构,有4个水平安装、且在同一滑架上的电磁铁打针。该微打采用了单独的单片机系统,考虑到微打自身的性能要求,使用Intel公司的8 051芯片。微打与主单片机通过并行接口相连,其接口图如图5所示。当所需要打印的数据出现在打印机I/O0~I/O7上时,STB只要从高电平转到低电平,再从低电平转到高电平,就可把数据送入打印机。这时打印机将BUSY 线置为忙(高电平),禁止新数据输入,当打印机取走数据并处理完毕后,BUSY线被置为闲(低电平),同时送出回答脉冲ACK通知系统,可以再次输入数据。

图6微打系统与主单片机的接口

4软件的制作

我们在Windows XP的平台上,用Xilinx公司生产的Xilinx4.2的软件进行VHDL硬件描述语言编程实现控制器的功能。用来进行系统测试的是清华同方股份有限公司生产的TPG —FPGA 。TPG1AC0007实验箱,选用的是saprtan2系列的xc2s200—5pq208芯片烧制.

下面介绍基于EDA软件的FPGA开发流程(VHDL是EDA软件中的一部分):

第一步:安装Xilinx4.2软件和modelsim XE 5.3d仿真软件.

第二步:在Xilinx4.2软件进行程序设计,新建一个工程,用硬件描述语言编程来完成所设计的实物功能.

第三步:综合和适配.综合过程是把软件设计的HDL描述与硬件结构挂钩,是文字描述与硬件实现的一座桥梁.综合就是将电路的高级语言(如行为描述)转换成低级的,可与FPGA 的基本结构相映射的网表文件或程序.适配器也称结构综合器,它的功能是将由综合器产生的网表文件配置于指定的目标器件中,使之产生最终的下载文件.

第四步:仿真.在编程下载前必须利用软件工具对结构综合器生成的结果进行模拟测试,就是所谓的仿真.有两种不同级别的仿真测试,分别是时序仿真和功能仿真.

第五步:编程下载.把适配后生成的下载或配置文件,通过编程器向FPGA进行下载,以便进行硬件调试和验证.

第六步:硬件测试.将含有载入了设计的FPGA的硬件系统进行统一测试,以便最终验证设计项目在目标系统上的实际工作情况,以排除错误,改进设计.

从FPGA(现场可编程门阵列)的实验箱上可以知道所设计的程序是否能实现我们所要的功能,最后制作电路板做出实物.程序流程图如下图3.1.1所示。计程车启动时发出启动信号,此时计量模块中的计时部分、计价部分和计程部分同时工作。计时部分,由内部时钟对乘车的时间进行计数,同时计程部分开始计算路程,计价部分先判断计程车的状态是等待还是行进,然后分别由计时、计程部分对计价部分进行相应的控制,最后再将整个过程中的计价相加。由输入选择信号选择显示的内容,是金额、乘车时间还是乘车路程。

5系统的测试

5.1测试仪器

Xilinx公司的SpartanⅡ系列的XC2S2005PQ-208芯片

清华同方TPG-FPGA教学实验箱

5.2测试方法

首先用Xilinx公司的仿真工具Modelsim Xilinx Edition进行对系统的仿真。功能仿真用于综合前检查设计的逻辑功能是否符合设计要求。仿真过程中可以通过观察检测设计的输入信号,输出信号以及内部信号以检测设计的逻辑功能。如果仿真都通过的话就可以进行引脚锁定,然后下载程序,烧制出功能芯片,在实验箱上可以直观的看到结果。

5.3 测试结果

从实验结果的仿真可以看出,系统完全遵照预期的结果运行符合设计要求。需要说明的是由于分频系数过大,给仿真带来了一定的困难。所以仿真时,我们采用低一点的分频数来实现,其原理是相同的。整体的仿真图如下图4.3.1。

6结束语

通过对系统的测试结果分析符合预期结果,满足题目要求。基于FPGA所设计的多功能计程车计价器趋于简单、开发时间短;整个控制系统的所需元器件少、集成度较高、所占的空间小且可靠性也很高。不仅仅实现了计程车计费的功能,其多功能表现在它可以通过选择键来选择显示计程车累计走的总路程和乘客乘载的时间。应用于实际当中,比较有实用价值,可行性也较高,是个不错的创意。此外,如果实现软、硬件的相互结合还可以实现很多功能比如可以

集成计算机网络、IC卡、语音报价、自动打印等新技术实现运营数据存储管理和税费计算控制。实现计价器的计费显示、自动打印发票、语音报价等功能一体化,有待进一步发展。

参考文献

[ 1 ]高书莉、罗朝霞. 《可编程逻辑设计技术及应用》[M].北京:人民邮电出版社,

2001年(第一版)。

[ 2 ] 黄正谨、徐坚、章小丽等. 《CPLD系统设计技术入门与应用》[M].北京:电子工

业出版社,2002年(第一版)。

[ 3 ] 潘松、黄继业. 《EDA技术实用教程》[M].北京:科学出版社,2002年(第一版)。

[ 4 ]赵俊超《集成电路设计VHDL教程》 [M] 北京:北京希望电子出版社 2002年8

月(第一版)

[ 5 ] 张友德,等.单片微型机原理、应用与实验[M].复旦大学出版社,1996.

[ 6 ]王卓人,等.IC卡的技术与应用[M].电子工业出版社,1999.

[ 7 ]刘向东,等.打印机结构原理与使用维修[M].机械工业出版社,1998.

附录(程序) ---- 计程车计价器试验

----

********************************************************************************

*********************

---- 功能:模拟实际计程车计价器功能

----

---- 文件名:出租车.doc ----

---- 设计者:连芦敏

----

---- 说明:

----

整个自动控制系统由四个模块构成:时钟模块、IC卡模块、语音模块和显示模块、打

印模块。实现了计程车的计价功能。还以通过选择信号选择显示计程车的行程总时间和总路

程。

---- 最后修改日期:2007年5月10日

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity taxi is

Port ( clk,st,clr,d_in,choose : in std_logic;

--st:计程车启动/等候;

--d_in:“里”输入;--choose:选择显示;

--clr:清零;

--L_x:译码显示;

L_1 : out std_logic_vector(6 downto 0);

L_2 : out std_logic_vector(6 downto 0);

L_3 : out std_logic_vector(6 downto 0);

L_4 : out std_logic_vector(6 downto 0) );

end taxi;

architecture Behavioral of taxi is

signal M_15,M_20,d_xx,sec,fen : std_logic;

--M_15、M_20分别表示1.5元和2元

--d_xx 表示超出基础的公里数

-- fen表示分钟位

signal L1,L2,L3,L4 : integer range 0 to 10;

signal Ll1,Ll2,Ll3,Ll4 : integer range 0 to 10;

signal Lll2,Lll3 : integer range 0 to 10;

signal Led1,Led2,Led3,Led4 :

integer range 0 to 10;

signal d : integer range 0 to 3000;

begin

*************************************

时钟模块

----把系统提供的32MHz的频率分频为1Hz *************************************

div_sec:process(clr,clk)

variable c : integer range 0 to 32000000;

begin

if clr='1' then c:=0;

elsif rising_edge(clk) then

if c<32000000 then c:=c+1;

else c:=1;

end if;

end if;

if c>16000000 then sec<='1';

else sec<='0';

end if;

end process;

*************************************

IC卡

----描述计价器整个工作过程,系统的核心。

*************************************

taxi_time:process(clr,sec,st)

variable c : integer range 0 to 180;

begin

if clr='1' or st='1'then c:=0;

elsif rising_edge(sec) then

if c<180 then c:=c+1;

else c:=121;

end if;

end if;

if c=120 then M_20<='1';M_15<='0';

elsif c=180 then M_20<='0';M_15<='1';

else M_20<='0';M_15<='0';

end if;

end process;

road:process(clr,d_in,sec,st)

variable c : integer range 0 to 7;

begin

if clr='1' then c:=0;

elsif rising_edge(sec) then

if st='1' then

if d_in='1' then

if c<8 then c:=c+1;

else c:=7;

end if;

end if;

end if;

end if;

if c=8 then d_xx<='1';

else d_xx<='0';

end if;

end process;

*************************************

语音模块

营运过程中根据上、下车的不同营运状态来实现不同语音功能播放。语音芯片工作时,系统首先将主程序指针转入录音处理程序*************************************

-------------------------------------------------------- ---- 计价 ----

--------------------------------------------------------

money:process(d_xx,M_15,M_20,clr,sec)

variable a,b,c : integer range 0 to 3000;

begin

if clr='1' then a:=0;b:=0;c:=0;

elsif rising_edge(sec) then

if d_xx='1' then a:=a+16;

elsif m_15='1' then b:=b+15;

elsif m_20='1' then c:=c+20;

end if;

end if;

d<=a+b+c+100; --10元起步费

end process;

money_led:process(clr,d,clk,sec)

-- 价格换算

variable c : integer range 0 to 9100;

variable i,t,j,k : integer range 0 to 10;

begin

if clr='1' then i:=0;t:=0;j:=0;k:=0;c:=0;

elsif rising_edge(clk) then

if sec='1' then c:=d;i:=0;t:=0;j:=0;k:=0;

elsif c>999 then c:=c-1000; i:=i+1;

--对百元计数

elsif c<=999 and c>99 then

c:=c-100; j:=j+1;

--对十元计数

elsif c<=99 and c>9 then c:=c-10; k:=k+1; --对元计数

else t:=c ; --对角计数

l1<=t ; l4<=I ; l3<=j ; l2<=k;

end if;

end if;

end process;

-------------------------------------------------------- ---- 计时 ----

-------------------------------------------------------- ALL_time_m:process(clr,sec)

variable m,mm : integer range 0 to 10;

--mm表示秒计数的十位

-- m表示秒计数的个位

begin

if clr='1' then m:=0;mm:=0;

elsif rising_edge(sec) then

if mm<6 then

if m<9 then m:=m+1;

else m:=0;mm:=mm+1;

end if;

else mm:=0;

end if;

end if;

if mm=6 then mm:=0;m:=0;fen<='1';

else fen<='0';

end if;

Ll1<=m ; Ll2<=mm;

end process;

ALL_time_f:process(clr,fen)

variable f,ff : integer range 0 to 10;

begin

if clr='1' then f:=9;ff:=3;

elsif rising_edge(fen) then

if ff<6 then

if f<9 then f:=f+1;

else f:=0;ff:=ff+1;

end if;

else ff:=0;

end if;

end if;

if ff=6 then ff:=0;f:=0;

end if;

Ll3<=f;Ll4<=ff;

end process;

-------------------------------------------------------- ----- 计程 ----

--------------------------------------------------------

process(clr,d_in,sec,st)

variable f,ff : integer range 0 to 10;

begin

if clr='1' then f:=0;ff:=0;

elsif rising_edge(sec) then

if st='1' then

if d_in='1' then

if ff<10 then

if f<9 then f:=f+1;

else ff:=ff+1;f:=0;

end if;

else ff:=0;

end if;

end if;

end if;

end if;

if ff=10 then ff:=0; end if;

Lll2<=f;Lll3<=ff;

end process;

*************************************

显示模块

----用四个七段译码显示管实现系统功能显示。

*************************************

process(sec,clr,choose,L1,L2,L3,L4,LL1,LL2,LL3,LL4,LLL2,LLL3) variable c : std_logic_vector (1 downto 0);

--译码显示;

--“01”:总价格;

--“10”:总路程;

--“11”:总乘车时间;

begin

if clr='1' then c:="01";

elsif rising_edge(sec) then

if choose='1' then

if c<"11" then c:=c+1;

else c:="01"; end if;

else null;

end if;

end if;

if c="01" then led1<=L1;led2<=L2;

led3<=L3;led4<=L4;

elsif c="10" then led1<=10;led2<=LLL2;

led3<=LLL3;led4<=10;

else led1<=LL1;led2<=LL2;

led3<=LL3;led4<=LL4;

end if;

end process;

LED_1:process(Led1)

begin

case Led1 is

when 0=> L_1 <="0000001";

when 5=> L_1 <="0100100";

when 1=> L_1 <="1001111";

when 6=> L_1 <="1100000";

when 2=> L_1 <="0010010";

when 7=> L_1 <="0001111";

when 3=> L_1 <="0000110";

when 8=> L_1 <="0000000";

when 4=> L_1 <="1001100";

when 9=> L_1 <="0001100";

when others => L_1 <="1111111"; end case;

end process;

LED_2:process(Led2)

begin

case Led2 is

when 0=> L_2 <="0000001";

when 5=> L_2 <="0100100";

when 1=> L_2 <="1001111";

when 6=> L_2 <="1100000";

when 2=> L_2 <="0010010";

when 7=> L_2 <="0001111";

when 3=> L_2 <="0000110";

when 8=> L_2 <="0000000";

when 4=> L_2 <="1001100";

when 9=> L_2 <="0001100";

when others => L_2 <="1111111"; end case;

end process;

LED_3:process(Led3)

begin

case Led3 is

when 0=> L_3 <="0000001";

when 5=> L_3 <="0100100";

when 1=> L_3 <="1001111";

when 7=> L_3 <="0001111";

when 2=> L_3 <="0010010";

when 6=> L_3 <="1100000";

when 3=> L_3 <="0000110";

when 8=> L_3 <="0000000";

when 4=> L_3 <="1001100";

when 9=> L_3 <="0001100";

when others => L_3 <="1111111"; end case;

end process;

LED_4:process(Led4)

begin

case Led4 is

when 0=> L_4 <="0000001";

when 5=> L_4 <="0100100";

when 1=> L_4 <="1001111";

when 6=> L_4 <="1100000";

when 2=> L_4 <="0010010";

when 7=> L_4 <="0001111";

when 3=> L_4 <="0000110";

when 8=> L_4 <="0000000";

when 4=> L_4 <="1001100";

when 9=> L_4 <="0001100";

when others => L_4 <="1111111"; end case;

end process;

end Behavioral;

相关文档
相关文档 最新文档