出租车计费器设计
A. 出租车计价器的设计
http://www.bbww.net/SoftView/SoftView_11755.html
http://www.happycampus.com.cn/pages/2005/07/06/D174249.html
http://bbs.mcustudy.com/printpage.asp?BoardID=5&ID=2662
B. 数字逻辑课程设计出租车计价器
74161+74248+7404+7400+LED数码管+光电计数器
流程就是光电计数器---74161
C. 出租车计价器的设计(用Multisim画的设计图)
本方案围绕项目招投标全过程的造价管理工作,为工程项目各个参与方在招标、投标、评标阶段提供专业、易用、高效的软件产品、专业咨询及服务,实现“计量、询价、计价、招/投标文件编制、自动评标和招投标信息发布、数据积累”等招标投标核心业务的一体化智能解决,建立起共享、协同、整合、高效的动态招投标业务系统,推动业务管理进步。
http://www.grandsoft.com.cn/channels/17.aspx
D. 出租车计价器程序设计与原理图
目录
前言
1、 系统工作原理
1.1 功能说明
1.2 基本原理
2、 硬件设计
2.1 单片机最小系统单元
2.2 A44E霍尔传感器检测单元
2.3 AT24C01存储单元
2.4 键盘调整单元
2.5 显示单元
3、 软件设计
3.1 系统主程序
3.2 中断程序
3.2.1 里程计数中断程序
3.2.2 中途等待中断程序
3.3 计算程序
3.4 显示程序
3.5 键盘程序
4、 总结
参考文献
附录A 系统原理图
附录B 系统源程序
前言
随着出租车行业的发展,出租车已经是城市交通的重要组成部分,从加强行业管理以及减少司机与乘客的纠纷出发,具有良好性能的计价器对出租车司机和乘客来说都是很必要的。而采用模拟电路和数字电路设计的计价器整体电路的规模较大,用到的器件多,造成故障率高,难调试。而采用单片机进行的设计,相对来说功能强大,用较少的硬件和适当的软件相互配合可以很容易地实现设计要求,且灵活性强,可以通过软件编程来完成更多的附加功能。本设计采用AT89S52单片机为主控器,以A44E霍尔传感器测距,实现对出租车的多功能的计价设计,并采用AT24C01实现在系统掉电的时候保存单价等信息,输出采用8段数码显示管。本电路设计的计价器不但能实现基本的计价,而且还能根据白天,黑夜和中途等待来调节单价。
第一章 系统工作原理
1.1 功能说明
出租车计价器根据乘客乘坐汽车行驶距离和等候时间的多少进行计价,并在行程中同步显示车费值。从起步价开始,当汽车程行驶未满3公里时,均按起步价计算。过3公里后,实现每1公里单价收费,中间遇暂停时,计程数不再增加,开始计时收费,测距收费和测时收费的和便构成了一位乘客的车费。同时,白天和夜晚价格不同,可以进行切换。白天单价、夜晚单价、等待单价和起步价格都可通过独立键盘进行调节。(默认起步价为5元/3公里,里程单价白天为1.5元/公里,夜晚为1.8元/公里,等待计时单价为0.5元/5分钟)
1.2 基本原理
计数器系统主要由五部分组成:A44E霍尔传感器、AT89S52单片机、独立键盘、EEPROM AT24C01和显示数码管。
霍尔传感器安装在车轮上,主要检测汽车行进的公里数,并产生一系列相应的脉冲输出,脉冲送到单片机进行处理,单片机根据程序设定通过计算脉冲数换算出行驶公里数,再根据从EEPROM中读取的价格等相关数据进行金额的计算,计算好的金额、里程和单价都实时地显示在数码管上。独立键盘可以调节价格等相关数据,按下相应的按钮,产生信号交由单片机处理并实时显示出来,调节好的数据存储到EEPROM中,掉电后可以使调好的数据不丢失,下次得电后直接从EEPROM读到单片机,系统结构图如图1。
图1 系统结构图
第二章 硬件设计
2.1 单片机最小系统单元
主控机系统采用了Atmel 公司生产的 AT89S52单片机,它含有256 字节数据存储器,内置8K 的电可擦除FLASH ROM,可重复编程,大小满足主控机软件系统设计,所以不必再扩展程序存储器。复位电路和晶振电路是AT89S52 工作所需的最简外围电路。单片机最小系统电路图如图2所示。
图2 单片机最小系统图
AT89S52 的复位端是一个史密特触发输入,高电平有效。RST端若由低电平上升到高电平并持续2个周期,系统将实现一次复位操作。在复位电路中,按一下复位开关就使在RST端出现一段时间的高电平,外接11.0592M 晶振和两个30pF 电容组成系统的内部时钟电路。
2.2 A44E霍尔传感器检测单元
A44E 属于开关型的霍尔器件,其工作电压范围比较宽(4.5~18V),其输出的信号符合TTL电平标准,可以直接接到单片机的IO 端口上,而且其最高检测频率可达到1MHZ。
A44E 集成霍耳开关由稳压器A、霍耳电势发生器(即硅霍耳片)B、差分放大器C、施密特触发器D和OC门输出E五个基本部分组成。
在输入端输入电压Vcc,经稳压器稳压后加在霍尔电势发生器的两端,根据霍尔效应原理,当霍尔片处在磁场中时,在垂直于磁场的方向通以电流,则与这二者相垂直的方向上将会产生霍尔电势差VH输出,该VH信号经放大器放大后送至施密特触发器整形,使其成为方波输送到OC门输出。当施加的磁场达到工作点(即Bop)时,触发器输出高电压(相对于地电位),使三极管导通,此时OC门输出端输出低电压,三极管截止,使OC门输出高电压,这种状态为关。这样两次电压变换,使霍尔开关完成了一次开关动作。A44E霍尔传感器原理如图3所示。
图3 A44E霍尔传感器原理
里程计算是通过安装在车轮上的霍尔传感器检测到的脉冲信号,送到单片机产生中断,单片机再根据程序设定,计算出里程。其原理如图4所示。
图4 传感器测距示意图
本系统选择了将A44E的脉冲输出口接到P3.3口外部中断1作为信号的输入端(这样可以减少程序设计的麻烦),车轮每转一圈(设车轮的周长是1米),霍尔开关就检测并输出信号,引起单片机的中断,对脉冲计数,当计数达到1000次时,即1公里,单片机就控制将金额自动增加,如图5。
图5 A44E霍尔元件接线图
2.3 AT24C01存储单元
存储单元的作用是在电源断开的时候,存储当前设定的单价信息。AT24C01 是Ateml公司的1KB的电可擦除存储芯片,采用两线串行的总线和单片机通讯,电压最低可以到2.5V,额定电流为1mA,静态电流10uA(5.5V),芯片内的资料可以在断电的情况下保存40年以上,而且采用8 脚的DIP 封装,使用方便。
AT24C02芯片引脚配置如图6所示。
存储单元电路连接如图7所示。
图 7 存储单元电路原理图
图中R4、R5 是上拉电阻,其作用是减少AT24C01 的静态功耗。由于AT24C01的数据线和地址线是复用的,采用串口的方式传送数据,所以只用两根线SCL(时钟脉冲)和SDA(数据/地址)与单片机P2.2和P2.3口连接,进行传送数据。
每当设定一次单价,系统就自动调用存储程序,将单价信息保存在芯片内;当系统重新上电的时候,自动调用读存储器程序,将存储器内的单价等信息,读到缓存单元中,供主程序使用。
2.4 键盘调整单元
当单价等信息需要进行修改时,就要用到键盘进行修改。由于调节信息不多,故采用4个独立键盘即可,分别实现清零、切换、增大、减小和功能等作用。电路原理如图8所示。
图8 键盘调整单元接线图
S1:接P1.0口,对上一次的计费进行清零,为下次载客准备
S2:接P1.1口,实现白天和夜晚单价的切换;当功能键S4按下时,S2可对数据进行增大。
S3:接P1.2口,当功能键S4按下时,S3可对数据进行减小。
S4:接P1.3口,按1次,进入调整白天单价;按2次,进入调整夜晚单价;按3次,进入调整等待单价;按4次,进入调整起步价;按5次,返回。
2.5 显示单元
显示单元由7个8段共阳数码管组成,采用动态扫描进行显示。前三个数码管分别接P3.0、P3.1和P3.2,用于显示总金额;中间两个分别接P3.4和P3.5,用于显示里程;后边两个分别接P3.6和P3.7,用于显示单价。电路如图9所示。
图9 数码管显示图
第三章 软件设计
3.1 系统主程序
在主程序模块中,需要完成对各参量和接口的初始化、出租车起价和单价的初始化以及中断、计算、循环等工作。另外,在主程序模块中还需要设置启动/清除标志寄存器、里程寄存器和价格寄存器,并对它们进行初始化。然后,主程序将根据各标志寄存器的内容,分别完成启动、清除、计程和计价等不同的操作。
当汽车运行起来时,就启动计价,根据里程寄存器中的内容计算和判断行驶里程是否已超过起步价公里数。若已超过,则根据里程值、每公里的单价数和起步价数来计算出当前的总金额,并将结果存于总金额寄存器中;中途等待时,无脉冲输入,不产生中断,当时间超过等待设定值时,开始进行计时,并把等待价格加到总金额里,然后将总金额、里程和单价送数码管显示出来。程序流程如图10所示。
图10 主程序流程图 图11 计算程序流程图
3.2 中断程序
3.2.1 里程计数中断程序
每当霍尔传感器输出一个低电平信号就使单片机中断一次,当里程计数器对里程脉冲计满1000次时,进入里程计数中断服务程序中,里程变量加一。主函数中总金额也相应地变化。
3.2.2 中途等待中断程序
在中途等待中断程序中,每1ms产生一次中断,将当前里程值送入某个缓存变量,每5分钟将缓存变量中的值和当前里程值比较,当汽车停止,霍尔传感器5分钟没有输出信号,当前里程值和缓存变量内的值相同,则进入等待计时,每5分钟记一次价格。
3.3 计算程序
计算程序根据里程数分别进入不同的计算公式。如果里程大于3公里,则执行公式:总金额=起步价+(里程-3)*单价+等待时间*等待单价;否则,执行公式:总金额=起步价+等待时间*等待单价。程序流程图如图11所示。
3.4 显示程序
显示程序利用定时器每1ms产生一次中断,相应变量置位,点亮一个数码管,显示一位数据,利用主函数内的循环,实现动态扫描显示,同时根据数码管余辉和人眼暂留现象,即可实现显示。
3.5 键盘程序
键盘采用查询的方式,放在主程序中,当没有按键按下的时候,单片机循环主程序,一旦右按键按下,便转向相应的子程序处理,处理结束再返回。流程图如图12。
图12 键盘程序流程图
第四章 总结
经过这些天有关于出租车计价器的课程设计,使我对单片机的应用有了更深的了解。在课程设计的过程中,还是碰到了许多的问题。比如,对于数码管动态扫描显示和键盘的延时防抖的综合编程不能较好地解决;对于代码的前后顺序及调用掌握得还不够好;对于一些相关的应用软件没能熟练掌握。通过这几天晚上的苦想和反复调试,以及参考网上的程序,最终还是把问题解决了。
通过这次课程设计,我最大的收获就是自己的动手能力和独立解决问题的能力得到了很大的提高,也充分体会到了自己设计东西的乐趣、学会查阅资料和对别人的东西融会变通的重要性,也明白了很多知识光靠趴在书本上学是学不到其中的精髓的,必须亲自去试着实践,亲自去经历才能对它们真正的掌握,凡事都要自己去动下手,去实践一下,遇到困难,永远不要沮丧气馁。在动手的过程中,不仅能增强实践能力,而且在理论上可以有更深的认识;这次设计给了我极大的鼓舞和信心,相信在以后的学习中可以通过不断的摸索和实践来提高其他方面的知识。
参考文献
[1] 马淑华,王凤文,张美金编著. 单片机原理与接口技术(第二版). 北京:北京邮电大学出版社,2007.
[2] 谭浩强著. C程序设计(第三版). 北京:清华大学出版社,2005.
附录A 系统原理图
附录B 系统源程序
算了图贴不上去 给你个网址吧http://blog.sina.com.cn/s/blog_609003ef0100dt1o.html
挺全的去看看
E. 出租车计价器设计
实验任务及要求
1.能实现计费功能,计费标准为:按行驶里程收费,起步费为10.00元,并在车行3公里后再按1.6元/公里,车暂停时,停车一分钟之后开始加价,每分钟增加2.5元。
2. 实现预置功能:能预置起步费、每公里收费、车行加费里程。
3. 实现模拟功能:能模拟汽车启动、停止、暂停等状态。
4. 设计动态扫描电路:将车费及暂停时间显示出来。
5. 用VHDL语言设计符合上述功能要求的出租车计费器,并用层次化设计方法设计该电路。
6. 综合仿真验证,并通过有关波形确认电路设计是否正确。
7. 完成电路全部设计后,通过GW48系统实验箱下载验证设计的正确性。
二、实验原理
图1出租车计价器流程图
图2系统结构图
接口部分定义如下:
输入:clk_240,系统时钟,频率为240Hz;
Start,启动信号,当start=1时,汽车启动,开始计价; 当start=0时,清零;
Stop,暂时计时信号,当stop-1时,中途暂停,开始计时;当stop=0时,再次出发;
Fin,汽车车速脉冲信号,是一个与随着车速变化而变化的脉冲信号。
输出:cha2,cha1,cha0,分别为价钱的十位,个位和角位;
Km1,km0,分别为行驶公里数的十位,个位;
Min0,暂时分钟数输出。
接口部分源程序如下:
port ( clk_240 :in std_logic; --频率为240Hz的时钟
start :in std_logic; --计价使能信号
stop:in std_logic; --等待信号
fin:in std_logic; --公里脉冲信号
cha2,cha1,cha0:out std_logic_vector(3 downto 0); --费用数据
km1,km0:out std_logic_vector(3 downto 0); --公里数据
min0: out std_logic_vector(3 downto 0)); --等待时间
计价部分原理如下:
起步价10元,3公里内10元,超出3公里部分,每公里1.6元,车暂停时,2分钟内不加价,超出2分钟部分,每分钟2.5元;
计费部分源程序如下:
feipin:process(clk_240,start)
begin
if clk_240'event and clk_240='1' then
if start='0' then q_15<=0;q_16<=0;f_15<='0';f_16<='0';f_1<='0';f<='0';
else
if q_15=15 then q_15<=0;f_15<='1'; --此IF语句得到频率为15Hz的信号
else q_15<=q_15+1;f_15<='0';
end if;
if q_16=14 then q_16<=0;f_16<='1'; --此IF语句得到频率为16Hz的信号
else q_16<=q_16+1;f_16<='0';
end if;
if q_1=239 then q_1<=0;f_1<='1'; --此IF语句得到频率为1Hz的信号
else q_1<=q_1+1;f_1<='0';
end if;
if en1='1' then f<=f_15; --此IF语句得到计费脉冲f
elsif en0='1' then f<=f_16;
else f<='0';
end if;
end if;
end if;
end process;
process(f_1)
begin
if f_1'event and f_1='1' then
if start='0' then
w<=0;en1<='0';en0<='0';m1<="000";m0<="0000";k1<="0000";k0<="0000";
elsif stop='1' then
if w=59 then w<=0; --此IF语句完成等待计时
if m0="1001" then m0<="0000"; --此IF语句完成分计数
if m1<="101" then m1<="000";
else m1<=m1+1;
end if;
else m0<=m0+1;
end if;
if m1&m0>"0000001"then en1<='1'; --此IF语句得到en1使能信号
else en1<='0';
end if;
else w<=w+1;en1<='0';
end if;
elsif fin='1' then
if k0="1001" then k0<="0000"; --此IF语句完成公里脉冲计数
if k1="1001" then k1<="0000";
else k1<=k1+1;
end if;
else k0<=k0+1;
end if;
if k1&k0>"00000010" then en0<='1'; --此IF语句得到en0使能信号
else en0<='0';
end if;
else en1<='0';en0<='0';
end if;
cha3<=c3;cha2<=c2;cha1<=c1;cha0<=c0; --费用数据输出
km1<=k1;km0<=k0;min1<='0'&m1;min0<=m0; --公里数据、分钟数据输出
end if;
end process;
process(f,start)
begin
if start='0' then c3<="0000";c2<="0001";c1<="0000";c0<="0000";
elsif f'event and f='1' then
if c0="1001" then c0<="0000"; --此IF语句完成对费用的计数
if c1="1001" then c1<="0000";
if c2="1001" then c2<="0000";
if c3<="1001" then c3<="0000";
else c3<=c3+1;
end if;
else c2<=c2+1;
end if;
else c1<=c1+1;
end if;
else c0<=c0+1;
end if;
end if;
end process;
end behav;
F. QUARTUS可编程逻辑器件课程设计:出租车计价器设计
纯数字设计指的大多是74系列那样的通用芯片,有点是组建方便,简单系统成本低,是可编程逻辑器件的基础,早期单板机就用这个,现在led光屏也有很多,缺点是复杂应用成本高,设计复杂,功耗大,部分效率较低。PLD成本高,但是功耗较低,另外较稳定易维护,方便量产。设计开发过程随着技术的进步也越来越简便快捷。单片机功耗低应用灵活,但是执行并行任务效率低。不过一般的应用对实时性要求不高,所以应用特别特别特别广泛…收发器,收音机,充电器,显示屏,无所不在,而且沾了单片机也能显得高端不少(其实不止是显得,因为软件部分很能显示出设计者的水平)个人见解,有不全面的楼下补充
G. 求出租车计价器数字电路课程设计原理图!!(纯数字电路)
设计原理与实现方案论证1.里程计数及显示
在出租车转轴上加装传感器,以便获得“行驶里程信号”。
设汽车每走1Km发一个脉冲,里程的计数显示,可用十进制、译码显示。该模块涉及时序电路相关知识,如计数器(74ls60,74ls90等)、译码驱动器、显示器等中规模芯片相关知识。
侯时模块设计类似于里程计数模块,不同的是脉冲信号可由石英晶振经分频后获得。简易的也可用555定时器近似获得,涉及脉冲信号产生相关知识。但在这个实验中使用直接的脉冲信号。
2.加法器模块电路
该模块功能为计价,由两部分组成:
H. EDA课程设计,用VHDL编程做出租车计费器
课程设计内容与要求
1,用开关按键表示脉冲,每个脉冲代表100米,10个脉冲1公里,每公里1.4元,能同步显示里程和费用;
2,低于2公里5元计费,高于2公里总费用=起步费用+(里程-2公里)*里程单价+
等候时间*等后单价;
3,等候时间大于2分钟,按每分钟1.3元计费;
4,可以设定起步价和里程单价。
一、设计原理与技术方法:
包括:电路工作原理分析与原理图、元器件选择与参数计算、电路调试方法与结果说明;
软件设计说明书与流程图、软件源程序代码、软件调试方法与运行结果说明。
根据设计要求,系统的输入信号clk,计价开始信号start,等待信号stop,里程脉冲信号fin。系统的输出信号有:总费用数C0—c3,行驶距离k0—k1,等待时间m0—m1等。系统有两个脉冲输入信号clk_750k,fin,其中clk_750k将根据设计要求分频成14hz,15hz和1hz分别作为公里计费和超时计费的脉冲。两个控制输入开关start,stop;控制过程为:start作为计费开始的开关,当start为高电平时,系统开始根据输入的情况计费。当有乘客上车并开始行驶时,fin脉冲到来,进行行驶计费,此时的stop需要置为0;如需停车等待,就把stop变为高电平,
并去除fin输入脉冲,进行等待计费;当乘客下车且不等待时,直接将start置为0,系统停止工作;价格开始归为起步价5.0元。
整个设计由分频模块,计量模块,计费模块,控制模块和显示模块五个部分组成。
其中计量模块是整个系统实现里程计数和时间计数的重要部分;控制模块是实现不同计费方式的选择部分,根据所设计的使能端选择是根据里程计费还是根据等待时间计费,同时设计通过分频模块产生不同频率的脉冲信号来实现系统的计费。计量模块采用1hz的驱动信号,计费模块采用14hz,13hz的驱动信号;计量模块每计数一次,计量模块就实现14次或者13次计数,即为实现计时的1.3元/min,计程时的1.4元/km的收费。组成框图如下所示:
1.百进制模块:
实现百米脉冲的驱动信号,元件框图如图3所示:
图3 百进制模块框图
源程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity jin is
port(start,clk2: in std_logic; --秒脉冲
a: out std_logic_vector(3 downto 0));
end jin;
architecture rt1 of jin is
signal count_1:std_logic_vector(3 downto 0);
begin
a<=count_1;
process(start,clk2)
begin
if(start='0')then
count_1<="0000";
elsif(clk2'event and clk2='1')then
if(count_1="0111")then
count_1<="0000";
else
count_1<=count_1+'1';
end if;
end if;
end process;
end rt1
2.计费模块
; 实现里程和等候时间的计费并输出到显示,元件框图4如下:
图4 计费模块框图
源程序如下:
Library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity jifei is
port(clk2:in std_logic; --计费驱动信号
start:in std_logic; --计费开始信号
c0,c1,c2,c3:buffer std_logic_vector(3 downto 0));
end jifei;
architecture rt1 of jifei is
begin
process(clk2,start)
begin
if start='0'then c3<="0000";c2<="0000";c1<="0101";c0<="0000"; --起步价5元
elsif clk2'event and clk2='1'then
if c0="1001" then c0<="0000";
if c1="1001" then c1<="0000";
if c2="1001" then c2<="0000";
if c3="1001" then c3<="0000";
else c3<=c3+1;
end if;
else c2<=c2+1;
end if;
else c1<=c1+1;
end if;
else c0<=c0+1;
end if;
end if;
end process;
end rt1;
3.公里模块
实现历程的计数和输出计费脉冲,元件框图5如下:
图5 公里模块框图
源程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity gongli is
port(clk1,start: in std_logic; --百米脉冲
k1,k2,k3,k4: out std_logic_vector(3 downto 0); --里程显示
temp2 : out std_logic);
end gongli;
architecture rt1 of gongli is
signal count_1: std_logic_vector(3 downto 0);
signal count_2: std_logic_vector(3 downto 0);
signal count_3: std_logic_vector(3 downto 0);
signal count_4: std_logic_vector(3 downto 0);
begin
k1<=count_1;
k2<=count_2;
k3<=count_3;
k4<=count_4;
process(start,clk1)
begin
if(start='0')then
count_1<="0000";
count_2<="0000";
count_3<="0000";
count_4<="0000"; ---公里清零
elsif(clk1'event and clk1='1')then
if(count_1="1001")then --公里计数器
count_1<="0000";count_2<=count_2+1;temp2<='1';
if(count_2="1001")then
count_2<="0000";count_3<=count_3+'1';
if(count_3="1001")then
count_3<="0000";count_4<=count_4+'1';
end if;
end if;
else
count_1<=count_1+'1';temp2<='0';
end if;
end if;
end process;
end rt1;
4.输出模块
实现所有数据的输出,元件框图6如下:
图6 输出模块框图
源程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity shuchu is
port(y: in std_logic_vector(3 downto 0);
e: out std_logic_vector(6 downto 0));
end shuchu;
architecture rt1of shuchu is
begin
process
begin
case y is
when"0000"=>e<="0111111";
when"0001"=>e<="0000110";
when"0010"=>e<="1011011";
when"0011"=>e<="1001111";
when"0100"=>e<="1100110";
when"0101"=>e<="1101101";
when"0110"=>e<="1111101";
when"0111"=>e<="0000111";
when"1000"=>e<="1111111";
when"1001"=>e<="1100111";
when others=>e<="0000000";
end case;
end process;
end rt1;
5.显示模块
实现所有数据的显示,元件框图7如下:
图7 显示模块框图
源程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity xianshi is
port(start: in std_logic;
a:in std_logic_vector(3 downto 0); --选择信号
c1,c2,c3,c4,out1,out2,out3,out4:in std_logic_vector(3 downto 0); --里程显示,时间显示输入
y:out std_logic_vector(3 downto 0)); --里程显示,时间显示输出
end xianshi;
architecture rt1 of xianshi is
begin
process
begin
if(start='0')then
y<="0000";
else case a is
when "0000"=> y<=c1 ;
when "0001"=> y<=c2 ;
when "0010"=> y<=c3 ;
when "0011"=> y<=c4 ;
when "0100"=> y<=out1 ;
when "0101"=> y<=out2;
when "0110"=> y<=out3 ;
when "0111"=> y<=out4;
when others =>y<= "0000";
end case;
end if;
end process;
end rt1;
6.dian模块
图8 dian模块框图
源程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity dian is
port(a: in std_logic_vector(3 downto 0);
e: out std_logic);
end dian;
architecture rt1 of dian is
begin
process
begin
case a is
when "0001"=>e<='1';
when "0101"=>e<='1';
when others=>e<='0';
end case;
end process;
end rt1;
三、中各个模块设计分析
系统总体顶层框图如下:
系统总体顶层框图
程序最终功能实现波形仿真
1. 分频模块
由于实验箱上没有14hz和13hz的整数倍时钟信号,因此采用频率较大的750khz进行分频,以近似得到14hz,13hz和1hz的时钟频率。通过以上三种不同频率的脉冲信号实行出租车行驶,等待两种情况下的不同计费。模块元件如下:
分频模块框图
源程序如下:
Library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity fenpin is
port(clk_750k:in std_logic; --系统时钟
clk_14:buffer std_logic; --14分频
clk_13:buffer std_logic; --13分频
clk_1 : buffer std_logic); --1分频
end fenpin ;
architecture rt1 of fenpin is
signal q_14:integer range 0 to 53570; --定义中间信号量
signal q_13:integer range 0 to 57691;
signal q_1:integer range 0 to 749999;
begin
process(clk_750k)
begin
If(clk_750k' event and clk_750k='1')then
If q_14=53570 then q_14<=0;clk_14<=not clk_14;
else q_14<=q_14+1;
end if; --得14hz频率信号
If q_13=57691 then q_13<=0;clk_13<=not clk_13;
else q_13<=q_13+1;
end if; --得13hz频率信号
If q_1=749999 then q_1<=0;clk_1<=not clk_1;
else q_1<=q_1+1;
end if; --得1hz频率信号
end if;
end process;
end rt1;
2. 计量模块
计量模块主要完成计时和计程功能。
计时部分:计算乘客的等待累积时间,当等待时间大于2min时,本模块中en1使能信号变为1;当clk1每来一个上升沿,计时器就自增1,计时器的量程为59min,满量程后自动归零。
计程部分:计算乘客所行驶的公里数,当行驶里程大于2km时,本模块中en0使能信号变为1;当clk每来一个上升沿,计程器就自增1,计程器的量程为99km,满量程后自动归零。
元件框图为:
计量模块框图
计量模块仿真波形为:
源程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity jiliang is
port(start:in std_logic; --计费开始信号
fin:in std_logic; --里程脉冲信号
stop:in std_logic; --行驶中途等待信号
clk1:in std_logic; --驱动脉冲
en1,en0:buffer std_logic; --计费单价使能信号
k1,k0:buffer std_logic_vector(3 downto 0); --行驶公里计数
m1,m0:buffer std_logic_vector(3 downto 0)); --等待时间计数
end jiliang;
architecture rt2 of jiliang is
signal w:integer range 0 to 59; --计时范围0~59
begin
process(clk1)
begin
if(clk1'event and clk1='1')then
if start='0' then
w<=0;en1<='0';en0<='0';m1<="0000";
m0<="0000";k1<="0000";k0<="0000";
elsif stop='1' then --计时开始信号
if w=59 then
w<=0;
else w<=w+1;
end if;
if m0="1001" then
m0<="0000";
if m1="0101" then
m1<="0000";
else m1<=m1+1;
end if;
else m0<=m0+1;
end if;
if stop='1' then en0<='0';
if m1&m0>"00000001" then en1<='1'; --若等待时间大于2min则en1置1
else en1<='0';
end if;
end if;
elsif fin='1' then --里程计数开始
if k0="1001" then k0<="0000";
if k1="1001" then k1<="0000"; --计程范围0~99
else k1<=k1+1;
end if;
else k0<=k0+1;
end if;
if stop='0' then
en1<='0';
if k1&k0>"00000001" then
en0<='1'; --若行使里程大于2km,则en0置1
else en0<='0';
end if;
end if;
end if;
end if;
end process;
end rt2;
3. 控制模块
本模块主要是通过计量模块产生的两个不同的输入使能信号en0,en1,对每个分频模块输出的14hz,13hz的脉冲进行选择输出的过程;本模块实现了双脉冲的二选一;最终目的为了计费模块中对行驶过程中不同的时段进行计价。
模块元件如下:
控制模块框图
控制模块仿真波形为:
源程序如下:
Library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity kong is
port(en0,en1:in std_logic; --使能选择信号
clk_in1:in std_logic; --14分频输入信号
clk_in2:in std_logic; --13分频输入信号
clk_out:out std_logic); --输出信号
end kong;
architecture rt3 of kong is
begin
process(en0,en1)
begin
if en0='1' then --实现二选一功能
clk_out<=clk_in1;
elsif en1='1' then
clk_out<=clk_in2;
end if;
end process;
end rt3;
4.计费模块
当计费信号start一直处于高电平即计费状态时,本模块根据控制模块选择出的信号从而对不同的单价时段进行计费。即行程在2km内,而且等待累计时间小于2min则为起步价5元;2km外以每公里1.4.元计费,等待累积时间超过2min则按每分钟1.3元计费。c0,c1,c2,c3分别表示费用的显示。
模块元件为:
计费模块框图
计费模块仿真波形为:
源程序如下:
Library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity jifei is
port(clk2:in std_logic; --计费驱动信号
start:in std_logic; --计费开始信号
c0,c1,c2,c3:buffer std_logic_vector(3 downto 0));
end jifei;
architecture rt4 of jifei is
begin
process(clk2,start)
begin
if start='0'then c3<="0000";c2<="0000";c1<="0101";c0<="0000"; --起步价5元
elsif clk2'event and clk2='1'then
if c0="1001" then c0<="0000";
if c1="1001" then c1<="0000";
if c2="1001" then c2<="0000";
if c3="1001" then c3<="0000"; --计价范围0~999.9
else c3<=c3+1;
end if;
else c2<=c2+1;
end if;
else c1<=c1+1;
end if;
else c0<=c0+1;
end if;
end if;
end process;
end rt4;
5.显示模块
显示模块完成计价,计时和计程数据显示。计费数据送入显示模块进行译码,最后送至以百元,十元,元,角为单位对应的数码管上显示。计时数据送入显示模块进行译码,最后送至以分为单位对应的数码管上显示。计程数据送入显示模块进行译码,最后送至以km为单位的数码管上显示。
模块元件为:
显示模块框图
源程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all; --定义库包
entity xianshi is --定义实体
port(
clk_scan:in std_logic; --扫描时钟信号端口设置
c3,c2,c1,c0:in std_logic_vector(3 downto 0); --总费用输入端口
k0,k1:in std_logic_vector(3 downto 0); --里程输入端口
m0,m1:in std_logic_vector(3 downto 0); --等待时间输入端口
sel:out std_logic_vector(2 downto 0); --控制数码管位选信号的扫描信号输出端口
led:out std_logic_vector(6 downto 0); --数码管的控制端口
led_dp:out std_logic --数码管的小数点输出端口
);
end xianshi;
architecture rt5 of xianshi is
signal an:std_logic_vector(6 downto 0); --数码显示管中间变量
signal shuju:std_logic_vector(3 downto 0); --选择输入端的中间变量
signal cnt:std_logic_vector(2 downto 0); --控制数码管的中间变量
signal xiaodian:std_logic; --小数点的中间变量
begin
process(clk_scan) --开始进程
begin
if clk_scan'event and clk_scan='1' then
cnt<=cnt+1; --每有一个扫描信号上升沿实现加1扫描
end if;
end process; --结束进程
process(cnt) --开始进程(选择扫描显示数码管)
begin
case cnt is --扫描时给每个数码管赋值
when "000"=>shuju<=c0;
when "001"=>shuju<=c1;
when "010"=>shuju<=c2;
when "011"=>shuju<=c3;
when "100"=>shuju<=k0;
when "101"=>shuju<=k1;
when "110"=>shuju<=m0;
when "111"=>shuju<=m1;
when others=> null;
end case;
if (cnt="001" or cnt="110")
then xiaodian<='1'; --在里程和总费用的个位处显示小数点
else xiaodian<='0';
end if;
end process; --结束进程
process(shuju) --开始进程(译码显示)
begin
case shuju is
when "0000"=>an<="0111111"; --0
when "0001"=>an<="0000110"; --1
when "0010"=>an<="1011011"; --2
when "0011"=>an<="1001111"; --3
when "0100"=>an<="1100110"; --4
when "0101"=>an<="1101101"; --5
when "0110"=>an<="1111101"; --6
when "0111"=>an<="0000111"; --7
when "1000"=>an<="1111111"; --8
when "1001"=>an<="1101111"; --9
when others=>null;
end case;
end process;
sel<=cnt;
led<=an;
led_dp<=xiaodian;
end rt5;
二、课程设计工作记录:
包括:设计步骤与时间安排、调试步骤与时间安排、课题完成结果说明
2.课题完成结果说明:
此计费器能实现起步价是5元;实现实验要求的1公里计费一次单价,行驶公里大于2km时每公里按1.4元计费并能显示里程和总共的费用。当行驶了6公里,等待了4分钟时,费用显示为15.8元。与计算公式总费用=起步费用+(里程-2公里)*里程单价+等候时间*等后单价;即15.8=5+(6-2)*1.4+4*1.3。实验结果与理论结果完全一致,实验设计成功。