交通信號燈設(shè)計1. 引言
隨著交通量的快速增長和缺乏對道路的系統(tǒng)研究和控制,擴建道路并沒有充分發(fā)揮出預(yù)期的作用。而城市道路多為十字路口、多交叉的特點,也決定了城市交通道路狀況必然受這種露的制約。所以,如何采用合適的控制方法,最大限度利用好耗費巨資修建的多車道道路,緩解城區(qū)的交通狀況,越來越成為交通運輸管理和嘗試規(guī)劃部門急需解決的主要問題。在這種情況下,道路交通信號燈開始發(fā)揮了越來越重要的作用,因此研究交通燈具有現(xiàn)實意義。
2. 系統(tǒng)設(shè)計
(1)硬件電路設(shè)計
file:///C:\Users\dell-pc\AppData\Local\Temp\ksohtml\wpsC1C9.tmp.png
交通燈控制系統(tǒng)框圖
file:///C:\Users\dell-pc\AppData\Local\Temp\ksohtml\wpsC1D9.tmp.jpg
交通燈控制系統(tǒng)總體電路圖
用VHDL編寫程序?qū)崿F(xiàn)交通信號控制器的端口控制信號。其中, clk為標準的1HZ的時鐘信號;R為復位信號;SPC為緊急情況信號,負責緊急情況的處理,當緊急情況發(fā)生時,南北主干道和東西支干道均顯示紅燈。
該程序定義了4個狀態(tài)S0,S1,S2,S3。當狀態(tài)為S0時,南北方向亮綠燈,東西方向亮紅燈60s;當為狀態(tài)為S1時,南北方向亮黃燈,東西方向亮紅5s ;當狀態(tài)為S2時,南北方向亮紅燈,東西方向綠燈35s;當狀態(tài)為S3時,南北方向亮滅燈,東西方向滅燈6s;程序還設(shè)計了一個緊急信號情況,當遭遇緊急情況時,主干道和支干道都亮紅燈。
狀態(tài)一:主道綠燈次道綠燈持續(xù)時間小于65s時,狀態(tài)保持不變,若持續(xù)時間等于65s時,轉(zhuǎn)換到下一狀態(tài)黃燈。
狀態(tài)二:主道黃燈持續(xù)時間小于5s時,狀態(tài)保持不變,若持續(xù)時間等于5s時,轉(zhuǎn)換到下一狀態(tài)紅燈。
狀態(tài)三:主道黃燈次道紅燈持續(xù)時間小于35s時,狀態(tài)保持不變,若持續(xù)時間等于35s時,轉(zhuǎn)換到下一狀態(tài)滅燈。
狀態(tài)四:主道滅燈持續(xù)時間小于46s時,狀態(tài)保持不變,若持續(xù)時間等于6s時,轉(zhuǎn)換到下一狀態(tài)綠燈。
狀態(tài)五:緊急情況都亮紅燈。
(2)程序設(shè)計
file:///C:\Users\dell-pc\AppData\Local\Temp\ksohtml\wpsC1F9.tmp.png
模塊一 :分頻器
分頻器實現(xiàn)的是將高頻時鐘信號轉(zhuǎn)換成低頻時鐘信號,clk信號經(jīng)分頻器將50MHz經(jīng)過PLL分頻為25MHz在經(jīng)過計數(shù)器分為1HZ.
file:///C:\Users\dell-pc\AppData\Local\Temp\ksohtml\wpsC20A.tmp.jpg
VHDL源程序:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity div is port(clk3:IN std_logic;
clkout1:OUT std_logic);
end div;
architecture one of div is
begin
process(clk3)
variable cnt:integer range 0 to 1250;
variable tmp:std_logic;
begin
if(clk3'event?and?clk3='1')then
If cnt>=1249
then
cnt:=0;
tmp:=not tmp;
Else cnt:=cnt+1;
End if;
End if;
clkout1<=tmp;
End process;
End one
時序仿真圖
file:///C:\Users\dell-pc\AppData\Local\Temp\ksohtml\wpsC22A.tmp.jpg
模塊二: 控制器
控制器的作用是根據(jù)計數(shù)器計數(shù)的值確定狀態(tài)轉(zhuǎn)換。本控制器的設(shè)計方法是利用時鐘沿的上升沿讀取前級計數(shù)器的計數(shù)值,然后做出反應(yīng)。主要控制紅、綠、黃燈的亮、滅。
file:///C:\Users\dell-pc\AppData\Local\Temp\ksohtml\wpsC23B.tmp.jpg
VHDL源程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH;
ENTITY jiaotongd1 IS
PORT (CLK,R,SPC: IN STD_LOGIC; --時鐘、復位、特殊情況 LIGHT: OUT STD_LOGIC_VECTOR(5 DOWNTO 0);
--light:G1,R1,Y1,G2,R2,Y2;
Q1,Q2 : OUT INTEGER RANGE 0 TO 65);
END jiaotongd1
ARCHITECTURE behav OF jiaotongd1 IS
TYPE STATES IS (S0,S1,S2,S3); --定義枚舉
SIGNAL STATE : STATES
SIGNAL T1,T2: INTEGER RANGE 0 TO 65;
BEGIN
P1: PROCESS (CLK,STATE)
BEGIN
IF R='1'THEN STATE<=S0;T1<=60;T2<=65; --復位
ELSIF SPC='1' THEN LIGHT<="010010"; --特殊情況亮紅燈
ELSIF CLK'EVENT AND CLK='1' THEN C
ASE STATE IS --states為s0時,南北方向亮綠燈,東西方向亮紅燈,60s
WHEN S0=> LIGHT<="100010";
T1<=T1-1;T2<=T2-1;
Q1<=T1;Q2<=T2;
IF T1=0 THEN
STATE<=S1;T1<=4;T2<=4;
END IF;
--states為s1時,南北方向亮黃燈,東西方向亮紅,5s
WHEN S1=> LIGHT<="001010";
T1<=T1-1;T2<=T2-1;
Q1<=T1;Q2<=T2;
IF T1=0 THEN
STATE<=S2;T1<=35;T2<=35;
END IF; --states為s2時,南北方向亮紅燈,東西方向綠燈,35s
WHEN S2=> LIGHT<="010100";
T1<=T1-1;T2<=T2-1;
Q1<=T1;Q2<=T2;
IF T2=0 THEN
STATE<=S3;T1<=6;T2<=6;
END IF;
--南北方向同時滅燈6s
WHEN S3=> LIGHT<="000000";
T1<=T1-1;T2<=T2-1;
Q1<=T1;Q2<=T2;
IF T1=0 THEN
STATE<=S0;T1<=60;T2<=65;
END IF;
WHEN OTHERS=>STATE<=S0;T1<=60;T2<=65;--主干道
END CASE;
END IF;
END PROCESS;
END behav;
時序仿真圖
file:///C:\Users\dell-pc\AppData\Local\Temp\ksohtml\wpsC25B.tmp.jpg
模塊三: 顯示控制電路
譯碼首先是將二進制無符號數(shù)轉(zhuǎn)化為BCD碼,在把BCD碼經(jīng)過譯碼電路轉(zhuǎn)換數(shù)碼管顯示:
file:///C:\Users\dell-pc\AppData\Local\Temp\ksohtml\wpsC26C.tmp.jpg
VHDL源程序:
二進制轉(zhuǎn)化BCD:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.all;
ENTITY yima2 IS
PORT (datain: IN STD_LOGIC_VECTOR(6 DOWNTO 0); --時鐘、復位、特殊情況
--light:G1,R1,Y1,G2,R2,Y2;
daout: OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END yima2
ARCHITECTURE behav OF yima2 IS
begin
PROCESS(datain)
BEGIN
case datain is
when "0000000"=>daout<="00000000";
when "0000001"=>daout<="00000001";
when "0000010"=>daout<="00000010";
when "0000011"=>daout<="00000011";
when "0000100"=>daout<="00000100";
when "0000101"=>daout<="00000101";
when "0000110"=>daout<="00000110";
when "0000111"=>daout<="00000111";
when "0001000"=>daout<="00001000";
when "0001001"=>daout<="00001001";--9
when "0001010"=>daout<="00010000";
when "0001011"=>daout<="00010001";
when "0001100"=>daout<="00010010";
when "0001101"=>daout<="00010011";
when "0001110"=>daout<="00010100";
when "0001111"=>daout<="00010101";
when "0010000"=>daout<="00010110";
when "0010001"=>daout<="00010111";
when "0010010"=>daout<="00011000";
when "0010011"=>daout<="00011001";--19
when "0010100"=>daout<="00100000";
when "0010101"=>daout<="00100001";
when "0010110"=>daout<="00100010";
when "0010111"=>daout<="00100011";
when "0011000"=>daout<="00100100";
when "0011001"=>daout<="00100101";
when "0011010"=>daout<="00100110";
when "0011011"=>daout<="00100111";
when "0011100"=>daout<="00101000";
when "0011101"=>daout<="00101001";--29
when "0011110"=>daout<="00110000";--30
when "0011111"=>daout<="00110001";
when "0100000"=>daout<="00110010";
when "0100001"=>daout<="00110011";
when "0100010"=>daout<="00110100";
when "0100011"=>daout<="00110101";
when "0100100"=>daout<="00110110";
when "0100101"=>daout<="00110111";
when "0100110"=>daout<="00111000";
when "0100111"=>daout<="00111001";--39
when "0101000"=>daout<="01000000";
when "0101001"=>daout<="01000001";
when "0101010"=>daout<="01000010";
when "0101011"=>daout<="01000011";
when "0101100"=>daout<="01000100";
when "0101101"=>daout<="01000101";
when "0101110"=>daout<="01000110";
when "0101111"=>daout<="01000111";
when "0110000"=>daout<="01001000";
when "0110001"=>daout<="01001001";--49
when "0110010"=>daout<="01010000";
when "0110011"=>daout<="01010001";
when "0110100"=>daout<="01010010";
when "0110101"=>daout<="01010011";
when "0110110"=>daout<="01010100";
when "0110111"=>daout<="01010101";
when "0111000"=>daout<="01010110";
when "0111001"=>daout<="01010111";
when "0111010"=>daout<="01011000";
when "0111011"=>daout<="01011001";--59
when "0111100"=>daout<="01100000";--60
when "0111101"=>daout<="01100001";
when "0111110"=>daout<="01100010";
when "0111111"=>daout<="01100011";
when "1000000"=>daout<="01100100";
when "1000001"=>daout<="01100101";--65
when others=>daout<="11111111";
END CASE;
END PROCESS;
END behav;
BCD譯碼顯示:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.all;
ENTITY yima IS
PORT (datain: IN STD_LOGIC_VECTOR(7 DOWNTO 0); --時鐘、復位、特殊情況
--datain2: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
daout1: OUT STD_LOGIC_VECTOR( 6 DOWNTO 0);
--light:G1,R1,Y1,G2,R2,Y2;
daout2: OUT STD_LOGIC_VECTOR( 6 DOWNTO 0));
END yima
ARCHITECTURE behav OF yima IS
begin
PROCESS(datain)
BEGIN
case datain(7 downto 4) is
when "0000"=>daout1<="1000000";
when "0001"=>daout1<="1111001";
when "0010"=>daout1<="0100100";
when "0011"=>daout1<="0110000";
when "0100"=>daout1<="0011001";
when "0101"=>daout1<="0010010";
when "0110"=>daout1<="0000010";
when "0111"=>daout1<="1111000";
when "1000"=>daout1<="0000000";
when "1001"=>daout1<="0010000";
when others=>daout1<="0000000";
END CASE;
case datain(3 downto 0) is
when "0000"=>daout2<="1000000";
when "0001"=>daout2<="1111001";
when "0010"=>daout2<="0100100";
when "0011"=>daout2<="0110000";
when "0100"=>daout2<="0011001";
when "0101"=>daout2<="0010010";
when "0110"=>daout2<="0000010";
when "0111"=>daout2<="1111000";
when "1000"=>daout2<="0000000";
when "1001"=>daout2<="0010000";
when others=>daout2<="0000000";
END CASE;
END PROCESS;
END behav;
3. 仿真(組裝與調(diào)試)
單片機系統(tǒng)的硬件調(diào)試和軟件調(diào)試是不能分開的,許多硬件錯誤是在軟件調(diào)試過程中被發(fā)現(xiàn)和糾正的。但通常是先排除明顯的硬件故障以后,再和軟件結(jié)合起來調(diào)試以進一步排除故障。可見硬件的調(diào)試是基礎(chǔ),如果硬件調(diào)試不通過,軟件設(shè)計則無從談起。
硬件的調(diào)試主要是把電路各種參數(shù)調(diào)整到符合設(shè)計要求。先排除硬件電路故障,包括設(shè)計性錯誤和公益性故障。一般原則是先靜態(tài)后動態(tài)。
利用萬用表或邏輯測試儀器,檢查電路中的各器件以及引腳是否連接正確,是否有短路故障。
先要將單片機AT89S51芯片取下,對電路板進行通電檢查,通過觀察看是否有異常,然后用萬用表測試各電源電壓,這些都沒有問題后,接上仿真機進行聯(lián)機調(diào)試觀察各接口線路是否正常。
單片機AT89S51是系統(tǒng)的核心,利用萬用表檢測單片機電源Vcc是否為(40腳)+5 V、晶振是否正常工作(可用示波器測試,也可以用萬用表檢測,兩引腳電壓一般為1.8~2.3V)、復位引腳RST(復位時為高電平,單片機工作時為低電平)、EA是否為+5V(高電平),這樣一來單片機就能工作了,再結(jié)合電路圖,檢測故障就很容易了
4. 結(jié)論
通過這次實訓,我們在程序的功能,源程序修改以及最后的硬件調(diào)試波形仿真中取得了更深一步的成就,通過理論結(jié)合實際進行不斷地修改、討論。填補了我們在這一方面的不足,當最后結(jié)果出來的時候,我們心比蜜甜,通過這次實訓,我們在實踐中學會了很多在平時的實驗中無法學到得東西。將使我們在以后的工作中受益匪淺。
5. 參考文獻
1、PLD與數(shù)字系統(tǒng)設(shè)計 李輝編著 西安電子科技大學出版社,2005
2、《數(shù)字電子技術(shù)基礎(chǔ)》(第四版),閻石主編,高教出版社
3、《VHDL硬件描述語言與數(shù)字邏輯電路設(shè)計》 候伯亨、顧新【M】西安電子科 技大學出版社,2001-4
4、電子愛好者.柳淳.北京.中國電力出版社,2005
5、電子技能與實訓 張大彪.北京.電子工業(yè)出版社,2004
完整的Word格式文檔51黑下載地址:
交通燈控制 嵌入式.doc
(1.6 MB, 下載次數(shù): 11)
2017-11-2 08:38 上傳
點擊文件名下載附件
嵌入式
下載積分: 黑幣 -5