計程車計費器設計
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。實驗結果與理論結果完全一致,實驗設計成功。