您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > EDA出租车计费器设计
出租车计费器第1页,共28页1.出租车计费器的总体设计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.出租车计费器的总体实现2.1系统总体框图该出租车计费器由一个VHDL程序构成,不同功能的实现分别是多个进程控制,主要进程有:分频模块进程:将每1000个电机脉冲转化为1个输出脉冲;计程模块进程:记录已行里程;计费模块进程:计算应付车费;出租车计费器第2页,共28页4*4矩阵键盘进程:设置起步价;数码管显示进程:将已行里程和应付车费显示在数码管上;16*16点阵显示进程:显示当前状态的每公里单价。图2-1系统框图2.2程序流程图(1)分频模块:图2-2分频模块总程序(系统时钟)分频模块4*4矩阵键盘计费模块数码管16*16点阵计程模块Rst=’0’Count=0Temp=0Glclk=tempCount=0Temp=nottempCount=count+1Count499motor'eventandmotor='1'YYNNrst或motor信号发生变化Y出租车计费器第3页,共28页(2)计程模块图2-3计程模块(3)计费模块图2-4计费模块Rst=’0’Meter1=0;Meter10=0;Meter100=0;Meter1K=0;Meter1,meter10,meter100,meter1000代表的四位十进制数加1glclk'eventandglclk='0'YNrst或glclk信号发生变化Rst=’0’Money1=qibujia;Money10=0;Money100=0;Money1000=0;根据路程计算出总价,再把总价的千位、百位、十位、个位取出显示。clk'eventandclk='0'YNrst或clk信号发生变化YY出租车计费器第4页,共28页2.3出租车计费器各功能的实现(1)分频模块:直流电机motor每输出1000个脉冲,分频器glclk输出一个下降沿脉冲,表示电机已走1公里,meter1加1.ifrst='0'thencount=0;temp='0';elsif(motor'eventandmotor='1')thenifcount499thencount=0;temp=nottemp;elsecount=count+1;endif;endif;glclk=temp;(2)计程模块:glclk的下降沿来临时,路程的个位加1,满9往高位进一,同时低位归0。process(glclk)beginif(Rst='0')thenMeter1=0;Meter10=0;Meter100=0;Meter1K=0;elsif(glclk'eventandglclk='0')thenif(Meter1=9)thenMeter1=0;if(Meter10=9)thenMeter10=0;出租车计费器第5页,共28页if(Meter100=9)thenMeter100=0;if(Meter1K=9)thenMeter1K=0;elseMeter1K=Meter1K+1;endif;elseMeter100=Meter100+1;endif;elseMeter10=Meter10+1;endif;elseMeter1=Meter1+1;endif;endif;lucheng=meter1k*1000+meter100*100+meter10*10+meter1*1;endprocess;(3)计费模块:路程小于等于2公里时,费用为起步价;路程大于2公里,小于200公里,费用为(起步价+(路程-2)*单价);路程大于200公里时费用为(起步价+(路程-2)*单价+50)。process(clk,rst)beginif((Rst='0')or(lucheng3))thenMoney1=qibujia;Money10=0;Money100=0;Money1000=0;出租车计费器第6页,共28页elsif(clk'eventandclk='0')theniflucheng200thenjiage=(lucheng-2)*danjia+qibujia+50;money1000=(jiage-(jiagemod1000))/1000;money100=((jiagemod1000)-((jiagemod1000)mod100))/100;money10=((jiagemod100)-(jiagemod10))/10;money1=jiagemod10;elsejiage=(lucheng-2)*danjia+qibujia;money1000=(jiage-(jiagemod1000))/1000;money100=((jiagemod1000)-((jiagemod1000)mod100))/100;money10=((jiagemod100)-(jiagemod10))/10;money1=jiagemod10;endif;endif;endprocess;(4)4*4矩阵键盘:有键按下时为低电平,脉冲扫描时先判断行,再判断列。process(clk)beginif(clk'eventandclk='1')thenif(Krow=1111)thenkflag1='0';kcount=kcount+1;if(kcount=0)thenKcol=1110;elsif(kcount=1)thenKcol=1101;elsif(kcount=2)then出租车计费器第7页,共28页Kcol=1011;elseKcol=0111;endif;elsekflag1='1';keyrow=Krow;keycol=Kcol;endif;endif;endprocess;process(clk)beginifk2='1'thenif(clk'eventandclk='1')thenif(kflag1='1')thenif(keyrow=0111)thencasekeycoliswhen0111=buff=1;when1011=buff=4;when1101=buff=7;whenothers=buff=buff;endcase;elsif(keyrow=1011)thencasekeycoliswhen0111=buff=2;when1011=buff=5;when1101=buff=8;when1110=buff=0;出租车计费器第8页,共28页whenothers=buff=buff;endcase;elsif(keyrow=1101)thencasekeycoliswhen1101=buff=9;when1011=buff=6;when0111=buff=3;whenothers=buff=buff;endcase;endif;endif;qibujia=buff;endif;elseqibujia_d=3;qibujia_n=9;if(k1='0')thenqibujia=qibujia_d;elseqibujia=qibujia_n;endif;endif;endprocess;(5)数码管显示:通过位选端控制八位数码管的显示,每次显示一位,通过提高时钟的频率,达到显示的效果。process(SEG_SEL)begin出租车计费器第9页,共28页case(SEG_SEL+1)iswhen000=Disp_Temp=Meter1K;when001=Disp_Temp=Meter100;when010=Disp_Temp=Meter10;when011=Disp_Temp=Meter1;when100=Disp_Temp=money1000;when101=Disp_Temp=Money100;when110=Disp_Temp=Money10;when111=Disp_Temp=Money1;endcase;endprocess;process(Disp_Temp)begincaseDisp_Tempiswhen0=Disp_Decode=00111111;--0when1=Disp_Decode=00000110;--1when2=Disp_Decode=01011011;--2when3=Disp_Decode=01001111;--3when4=Disp_Decode=01100110;--4when5=Disp_Decode=01101101;--5when6=Disp_Decode=01111101;--6when7=Disp_Decode=00000111;--7when8=Disp_Decode=01111111;--8when9=Disp_Decode=01101111;--9whenothers=Disp_Decode=00000000;endcase;endprocess;(6)16*16点阵显示:点阵扫描时,先扫描列,再扫描行,点阵是自下往上、从左到右显示,提高时钟频率达到显示效果。process(cdount)出租车计费器第10页,共28页begincasecdountiswhen0000=ledcol=0000;--列选择(lg7088Ah)when0001=ledcol=0001;when0010=ledcol=0010;when0011=ledcol=0011;when0100=ledcol=0100;when0101=ledcol=0101;when0110=ledcol=0110;when0111=ledcol=0111;when1000=ledcol=1000;when1001=ledcol=1001;when1010=ledcol=1010;when1011=ledcol=1011;when1100=ledcol=1100;when1101=ledcol=1101;when1110=ledcol=1110;when1111=ledcol=1111;whenothers=ledcol=0000;endcase;endprocess;3系统调试与仿真出租车计费器第11页,共28页从图中可看出,给一个复位信号后,费用的最低位为“0011”,即3,里程数的最低位为“0000”,即0,每当temp信号出现一个下降沿,里程数的最低位各加1,费用增加相应的单价,符合课题要求。图3-1系统仿真图4总结与体会为期两周的实训已经过去了,对于我来说这两周周的实训赋予了我太多实用的东西了,不仅让我更深层次的对课本的理论知识深入了理解,而且还让我对分析事物的逻辑思维能力得到了锻炼,提高了实际动手能力。刚开始看到这次的题目“出租车计费器”,感觉应该不难,但真正开始动手编程的
本文标题:EDA出租车计费器设计
链接地址:https://www.777doc.com/doc-7186906 .html