- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
EDA出租车计费器设计讲述
出租车计费器
第 PAGE \* Arabic \* MERGEFORMAT 28页,共28页
出租车计费器的总体设计
1.1 出租车计费设计
该出租车计费器按下开关S1后开始计费和计里程数,分为白天和夜晚。当拨动开关K2为0时,系统使用程序设置的起步价,白天起步价是3元,准行2公里,以后2元/公里;夜晚起步价是9元,准行2公里,以后3元/公里。当拨动开关K2为1时,可由矩阵键盘输入起步价0~9元。当路程大于200公里时,价格会在原来的基础上加50元。
1.2 基本设计思想
时钟输入为一个1KHz的系统时钟,直流电机模块每转一圈输出一个脉冲信号给CPU,另外用按键模块的S1 来作为整个系统的复位按钮,每复位一次,计费器从头开始计费。直流电机模块用来模拟出租车的车轮子,每转动一圈认为是行走1 米,所以每旋转1000 圈,认为车子前进1 公里。系统设计是需要检测电机的转动情况,每转1000圈,分频模块输出一个下降沿信号。车费和里程数在一个8位7段数码管上显示,前4位显示里程,后4位显示费用。路程的单价由16*16点阵显示,拨动开关K1为0时,2元/公里,点阵显示2;拨动开关K2为1时,3元/公里,点阵显示3。
出租车计费器的总体实现
2.1 系统总体框图
该出租车计费器由一个VHDL程序构成,不同功能的实现分别是多个进程控制,主要进程有:
分频模块进程:将每1000个电机脉冲转化为1个输出脉冲;
计程模块进程:记录已行里程;
计费模块进程:计算应付车费;
4*4矩阵键盘进程:设置起步价;
数码管显示进程:将已行里程和应付车费显示在数码管上;
16*16点阵显示进程:显示当前状态的每公里单价。
计程模块
分频模块
计费模块
总程序
(系统时钟)
4*4矩阵键盘
16*16点阵
数码管
图2-1 系统框图
2.2 程序流程图
(1) 分频模块:
Y
rst或motor信号发生变化
Rst=’0’
Count=0
Temp=0
N
motorevent and motor=1
Y
Y
Count=0
Temp=not temp
Count499
N
Count=count+1
Glclk=temp
图2-2 分频模块
(2) 计程模块
Meter1=0; Meter10=0; Meter100=0; Meter1K=0;
Y
rst或glclk信号发生变化
Rst=’0’
N
glclkevent and glclk=0
Y
Meter1,meter10,meter100,meter1000代表的四位十进制数加1
图2-3 计程模块
(3) 计费模块
Money1=qibujia; Money10=0; Money100=0; Money1000=0;
Y
rst或clk信号发生变化
Rst=’0’
N
clkevent and clk=0
Y
根据路程计算出总价,再把总价的千位、百位、十位、个位取出显示。
图2-4 计费模块
2.3 出租车计费器各功能的实现
(1)分频模块:直流电机motor每输出1000个脉冲,分频器glclk输出一个下降沿脉冲,表示电机已走1公里,meter1加1.
if rst=0 then
count=0;
temp=0;
elsif (motorevent and motor=1) then
if count499 then
count=0;
temp=not temp;
else
count=count+1;
end if;
end if;
glclk=temp;
(2)计程模块:glclk的下降沿来临时,路程的个位加1,满9往高位进一,同时低位归0。
process(glclk)
begin
if(Rst=0) then
Meter1=0;
Meter10=0;
Meter100=0;
Meter1K=0;
elsif(glclkevent and glclk=0) then
if(Meter1=9) then
Meter1=0;
if(Meter10=9) then
Meter10=0;
if(Meter100=9) then
Meter100=0;
if(M
文档评论(0)