交通信号灯设计1. 引言
随着交通量的快速增长和缺乏对道路的系统研究和控制,扩建道路并没有充分发挥出预期的作用。而城市道路多为十字路口、多交叉的特点,也决定了城市交通道路状况必然受这种露的制约。所以,如何采用合适的控制方法,最大限度利用好耗费巨资修建的多车道道路,缓解城区的交通状况,越来越成为交通运输管理和尝试规划部门急需解决的主要问题。在这种情况下,道路交通信号灯开始发挥了越来越重要的作用,因此研究交通灯具有现实意义。
2. 系统设计
(1)硬件电路设计
file:///C:\Users\dell-pc\AppData\Local\Temp\ksohtml\wpsC1C9.tmp.png
交通灯控制系统框图
file:///C:\Users\dell-pc\AppData\Local\Temp\ksohtml\wpsC1D9.tmp.jpg
交通灯控制系统总体电路图
用VHDL编写程序实现交通信号控制器的端口控制信号。其中, clk为标准的1HZ的时钟信号;R为复位信号;SPC为紧急情况信号,负责紧急情况的处理,当紧急情况发生时,南北主干道和东西支干道均显示红灯。
该程序定义了4个状态S0,S1,S2,S3。当状态为S0时,南北方向亮绿灯,东西方向亮红灯60s;当为状态为S1时,南北方向亮黄灯,东西方向亮红5s ;当状态为S2时,南北方向亮红灯,东西方向绿灯35s;当状态为S3时,南北方向亮灭灯,东西方向灭灯6s;程序还设计了一个紧急信号情况,当遭遇紧急情况时,主干道和支干道都亮红灯。
状态一:主道绿灯次道绿灯持续时间小于65s时,状态保持不变,若持续时间等于65s时,转换到下一状态黄灯。
状态二:主道黄灯持续时间小于5s时,状态保持不变,若持续时间等于5s时,转换到下一状态红灯。
状态三:主道黄灯次道红灯持续时间小于35s时,状态保持不变,若持续时间等于35s时,转换到下一状态灭灯。
状态四:主道灭灯持续时间小于46s时,状态保持不变,若持续时间等于6s时,转换到下一状态绿灯。
状态五:紧急情况都亮红灯。
(2)程序设计
file:///C:\Users\dell-pc\AppData\Local\Temp\ksohtml\wpsC1F9.tmp.png
模块一 :分频器
分频器实现的是将高频时钟信号转换成低频时钟信号,clk信号经分频器将50MHz经过PLL分频为25MHz在经过计数器分为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
模块二: 控制器
控制器的作用是根据计数器计数的值确定状态转换。本控制器的设计方法是利用时钟沿的上升沿读取前级计数器的计数值,然后做出反应。主要控制红、绿、黄灯的亮、灭。
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
模块三: 显示控制电路
译码首先是将二进制无符号数转化为BCD码,在把BCD码经过译码电路转换数码管显示:
file:///C:\Users\dell-pc\AppData\Local\Temp\ksohtml\wpsC26C.tmp.jpg
VHDL源程序:
二进制转化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. 仿真(组装与调试)
单片机系统的硬件调试和软件调试是不能分开的,许多硬件错误是在软件调试过程中被发现和纠正的。但通常是先排除明显的硬件故障以后,再和软件结合起来调试以进一步排除故障。可见硬件的调试是基础,如果硬件调试不通过,软件设计则无从谈起。
硬件的调试主要是把电路各种参数调整到符合设计要求。先排除硬件电路故障,包括设计性错误和公益性故障。一般原则是先静态后动态。
利用万用表或逻辑测试仪器,检查电路中的各器件以及引脚是否连接正确,是否有短路故障。
先要将单片机AT89S51芯片取下,对电路板进行通电检查,通过观察看是否有异常,然后用万用表测试各电源电压,这些都没有问题后,接上仿真机进行联机调试观察各接口线路是否正常。
单片机AT89S51是系统的核心,利用万用表检测单片机电源Vcc是否为(40脚)+5 V、晶振是否正常工作(可用示波器测试,也可以用万用表检测,两引脚电压一般为1.8~2.3V)、复位引脚RST(复位时为高电平,单片机工作时为低电平)、EA是否为+5V(高电平),这样一来单片机就能工作了,再结合电路图,检测故障就很容易了
4. 结论
通过这次实训,我们在程序的功能,源程序修改以及最后的硬件调试波形仿真中取得了更深一步的成就,通过理论结合实际进行不断地修改、讨论。填补了我们在这一方面的不足,当最后结果出来的时候,我们心比蜜甜,通过这次实训,我们在实践中学会了很多在平时的实验中无法学到得东西。将使我们在以后的工作中受益匪浅。
5. 参考文献
1、PLD与数字系统设计 李辉编著 西安电子科技大学出版社,2005
2、《数字电子技术基础》(第四版),阎石主编,高教出版社
3、《VHDL硬件描述语言与数字逻辑电路设计》 候伯亨、顾新【M】西安电子科 技大学出版社,2001-4
4、电子爱好者.柳淳.北京.中国电力出版社,2005
5、电子技能与实训 张大彪.北京.电子工业出版社,2004
完整的Word格式文档51黑下载地址:
交通灯控制 嵌入式.doc
(1.6 MB, 下载次数: 11)