出租车计价器设计
实验任务及要求
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<=0q_16<=0f_15<='0'f_16<='0'f_1<='0'f<='0'
else
if q_15=15 then q_15<=0f_15<='1' --此IF语句得到频率为15Hz的信号
else q_15<=q_15+1f_15<='0'
end if
if q_16=14 then q_16<=0f_16<='1' --此IF语句得到频率为16Hz的信号
else q_16<=q_16+1f_16<='0'
end if
if q_1=239 then q_1<=0f_1<='1' --此IF语句得到频率为1Hz的信号
else q_1<=q_1+1f_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<=0en1<='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+1en1<='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<=c3cha2<=c2cha1<=c1cha0<=c0 --费用数据输出
km1<=k1km0<=k0min1<='0'&m1min0<=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
“单程”和“往返”是两种不同的计费标准。
1、“单程”:考虑到出租车行驶可能出现从市区走到郊区,郊区打车人少的现象,有些市开始有出租车的时候就设计了“回程费”这样一个设计。也就是说,在“单程”计价的状态下,一定里程内(比如15公里)按照标准价格收取(比如2元/公里)。
超过规定的里程时(比如超过了15公里以上),每公里则多收取50%的回程费用(如果标准价格是每公里2元,这时就要再加上1元的回程费用,与租价一起计算为3元/公里)。
2、“往返”:指的是乘客乘坐出租车到目的地之后返回,因此超过规定的里程之后依然按照标准价格收费,因为这种情况下司机不需要空驶返回,因此乘客不用多负担50%的回程费。
扩展资料:
出租车计价器原理
车速信号为脉冲信号,采集脉冲信号的频率就可以得到车速,可以用到芯片的定时器捕获。如果车速大于一定的值,采用公里数计算价格,如果车速小于这个值,就可以用时间计算。
通过测量轮胎实际走过的路程,调节供计价器抄显示的脉冲数,使计价器显示的里程与轮胎实际走过的里程相符。
设计原理与实现方案论证1.里程计数及显示
在出租车转轴上加装传感器,以便获得“行驶里程信号”。
设汽车每走1Km发一个脉冲,里程的计数显示,可用十进制、译码显示。该模块涉及时序电路相关知识,如计数器(74ls60,74ls90等)、译码驱动器、显示器等中规模芯片相关知识。
侯时模块设计类似于里程计数模块,不同的是脉冲信号可由石英晶振经分频后获得。简易的也可用555定时器近似获得,涉及脉冲信号产生相关知识。但在这个实验中使用直接的脉冲信号。
2.加法器模块电路
该模块功能为计价,由两部分组成:
2 系统设计方案
该系统的设计可以采用分立元件来搭建,也可以通过单片机来设计,而使用可编程FPGA来设计,具有设计周期短、易于修改等明显特点,而且随着可编程逻辑器件和EDA软件的飞速发展,越来越多的电子系统采用FPGA来设计,一旦该系统达到一定的量产规模,也比较容易转化为ASIC芯片设计。因此,基于FPGA来设计一个出租车的计价器。本系统在EDA工具软件MAX+plusⅡ中,采用硬件描述语言Verilog HDL和原理图设计相结合的方法,进行各个模块的设计,最终将各个模块组成整个系统。
出租车能够显示行驶的里程,可以通过车轮的转动产生脉冲,然后通过计数器对脉冲进行计数来实现。假设出租车每行驶2 m就产生一个脉冲。由于里程数要精确到O.1 km,也就是100m,因此每经过50个脉冲就要输出一个新的脉冲信号,这里称为100 m脉冲信号,作为里程计数器的时钟信号,可以通过一个模为50的计数器进行分频而得到。
里程计数器可以用一个三位BCD码计数器来实现,最大能显示到999。以前两位为整数,第三位为小数,也就是最大能显示里程99.9 km,因为出租车都在市区和近郊活动,三位BCD码计数器是可以实现里程计数的。里程计数器每计数1 km还会周期性地输出一个脉冲信号,称为1 km脉冲信号,可以通过一定的组合电路来实现。
系统最核心的部分就是计费如何实现。这里就需要设计一个BCD码的加法器,在起步价的基础上,根据行驶里程的不同,依据计费标准,每增加1 km加上一个单价,单价的产生可以用Verilog HDL编写程序来实现。系统的总体设计框图如图1所示。
2.1 单价产生模块
单价产生模块的Verilog HDL源程序如下:
其中输入信号bai和shi就是里程计数器输出的两位整数里程,输出信号jia就是根据计费标准而产生的单价,以三位BCD码的形式输出,以前两位为整数,第三位为小数。即里程在3 km以内时,jia=0;里程在3~7 km之间时,jia=016(1.6元);超过7 km时,jia=024(2.4元)。
用Verilog HDL编写程序来实现模块功能的优点在于,当出租车的计费标准发生变化时,可以很容易地通过改写程序来完成新的设计,比起硬件电路的修改要方便得多,这也是用Verilog HDL来实现模块功能的重要优势。
2.2 三位BCD码加法器
系统中用到了三位BCD码加法器,可以实现三位十进制数的加法运算。加法器输出的结果就是乘客应付的费用,这里同样以前两位为整数,第三位为小数,也就是最大能显示99.9元。三位BCD码加法器由三个一位BCD码加法器级联而成。
一位BCD码由四位二进制数组成,四位二进制数的加法运算会产生大于9的数字,必须进行适当的调整才会产生正确的结果。一位BCD码加法器的Verilog HDL源程序如下:
一位BCD码加法器模块的仿真波形和生成的模块符号如图2和图3所示。
本模块中A和B为输入的一位BCD码,CIN为低位来的进位信号,CO是本片向高位产生的进位输出信号,SUM是两个数相加的和。三位BCD码加法器由三个本模块级联而成,其电路原理图和仿真波形如图4和图5所示。
2.3 缓冲器模块
三位BCD码加法器输出的结果通过缓冲器以后,反馈到输入端重新作为一个加数,在1km脉冲信号的作用下,每来一个脉冲就和单价相加,形成连续累加的功能。缓冲器还有一个控制输入端LD,LD=O时,在1km脉冲的作用下,输出起步价6元;LD=1时,在1km脉冲的作用下,输出和输入相等。缓冲器的Verilog HDL源程序如下:
2.4 整体电路
将各个模块按照输入输出关系连接成整体电路如图6所示。
在整体电路中,clk为最原始的时钟输入端,cr为异步清零端,q[11..O]输出里程,jiaqian[11..O]输出乘客应付的费用。
3 系统仿真验证
整体电路的仿真波形如图7所示。
从系统仿真波形图7(a)中可以看出,当清零端cr=O时,里程数立刻清零,乘客应付的费用显示三位十进制数060(起步价6元),表示乘客刚上车。当清零端cr=1时,出租车开始行进,里程和费用都开始计数,里程显示三位十进制数,前两位为整数,第三位为小数,也就是每行驶100 m计一次数。
从系统仿真波形图7(b)中可以看出,行驶到3 km时,费用由6元增加为7.6元,行驶到4 km时,费用由7.6元增加为9.2元,在3~7 km之间时,每行驶1 km增加1.6元。
系统仿真波形图7(c)中显示了每行驶1 km后,费用逐渐累加的情况。系统仿真波形完全验证了预期的设计要求。
4 结 语
通过仿真验证表明,本文所设计的出租车计价器能够正常地显示行驶的里程数和乘客应付的费用,符合预定的计费标准和功能要求。基于FPGA的设计,集成度高、设计周期短。尤其是当计费标准发生变化时,容易通过改写Verilog HDL源程序来完成新的设计。
随着社会进步,出租车已经越来越贴近生活,成为我们重要的交通工具,影响着我们现在的生活,出租文化已成为一种显著的文化,成为社会生活的组成部分。出租车计费系统,关系司机和乘客的切身利益,也是问题纠纷的焦点。本设计通过运用单片机设计的出租车计价器,简单易懂,是学习电子课程的一个综合性实验,有助于提高分析问题能力。
本电路以89S51 单片机为中心、附加A44E 霍尔传感器测距,实现对出租车计价统计,采用AT24C02 实现在系统掉电的时候保存单价和系统时间等信息,输出采用8 段数码显示管。本电路设计的计价器不但能实现基本的计价,而且还能根据白天、黑夜、中途等待来调节单价,同时在不计价的时候还能作为时钟为司机同志提供方便。
关键词:传感器AT89S51中断单片机定时器/计数器