交通灯信号控制器的设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
交通灯信号控制器的设计
一,设计任务与要求
交通灯控制信号用于主干道公路的交叉口,要求是优先保证主干道的畅通,因此,平时处于“主干道绿灯,支干道红灯”的状态。
1.当处于“主干道绿灯,支干道红灯”状态时:
(1)、主干道有车要求通行,支干道也有车要求通行时,若主干道通行时
间大于等于30S则切换到“主黄,支红”,4S后自动换到“主红,支绿”。
(2)、主干道无车要求通行,支干道有车要求通行时,立即切换到“主黄,
支红”,4S后自动自动切换到“主红,支绿”。
其他情况保持“主绿,支红”。
2.当处于“主红,支绿”状态时:
(1)、支道有车要求通行时,保持“主红,支绿”状态,但最多保持30S 然后自动切换到“主红,支黄”状态,4S后自动切换到“主绿,支红”状态。
(2)、支道无车要求通过时,立即切换到“主红,支黄”状态,4S后自动
切换到“主绿,支红”状态。
3.利用八位七段管码显示模块其中的2位实现时间显示。
二,总体框图
初步设计图
三,选择器件
1,(1)3-8译码器74138芯片.
(2)3-8译码器74138的逻辑功能表:
(3)3-8译码器74138的内部原理图:
(4)3-8译码器74138的作用:
74138有三个附加的控制端。当G1为高电平,G2AN和G2BN为低电平时,输出为高电平(S=1),译码器处于工作状态。否则,译码器被禁止,所有的输出端被封锁在高电平。这三个控制端也叫做“片选”输入端,利用片选的作用可以将多篇连接起来以扩展译码器的功能。
本设计所用实验箱的8个数码管采用扫描显示方式,数码管位选电路在扫描信号的控制下轮流输出8路数据,此8路数据时分复用一个BCD7段显示译码器。数码管位选电路同时输出位选信号,经74LS138译码器译码后分别选中8个数码管。在位选选中一个数码管的的情况下送出段码,在该段码管中显示段码字符,然后接着选中其它数码管,送其他字符。
四,功能模块
1..原理概述:
(1)由于主干道,支干道的交通灯均在绿,黄,红三种状态之间有顺序的转换,组合共有四种。所以,利用状态机按照设定的条件实现"主绿,支红" 、"主黄,支红" 、"主红,支绿"、"主红,支黄"4种状态之间的切换。
(2)因为红黄绿灯之间转换有时间限制,所以要有计数器,可用七段数码管显示模块,由于时间是两位数,所以只需要八位七段管码显示模块其中的2位实现时间显示。
(3)由于实验室提供的基准频率为50MHZ,所以得用分频器得到所需要的频率。2.各模块设计程序及模块图
1.1计数器:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY counter IS
PORT (clk:IN STD_LOGIC;
reset:in std_logic;
countNum:BuFFeR INTEGER RANGE 0 TO 64);
END;
ARCHITECTURE behavior OF counter IS
BEGIN
process(reset,Clk)
BEGIN
IF Reset='1' THEN
countNum<=0;
ELSIF rising_edge(Clk) THEN
IF countNum=64 THEN
countNum<=0;
ELSE
countNum<=countNum+1;
END IF;
END IF;
END PROCESS;
END;
生成模块图:
1.2七段显示器程序
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY bcd_data IS
PORT
(bcd_data:in STD_LOGIC_VECTOR(3 downto 0); segout: out STD_LOGIC_VECTOR(6 downto 0)); END;
ARCHITECTURE behavior OF bcd_data IS BEGIN
process(bcd_data)
BEGIN
case bcd_data is
when "0000"=>segout<="0111111";
when "0001"=>segout<="0000110";
when "0010"=>segout<="1011011";
when "0011" =>segout<="1001111";
when "0100" =>segout<="1100110" ;
when "0101"=>segout<="1101101" ;
when "0110"=>segout<="1111101" ;
when "0111"=>segout<="0000111" ;
when "1000" =>segout<="1111111" ;
when "1001" =>segout<="1101111";
when others =>null;
END CASE;
END PROCESS;
END;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_unsigned.ALL;
ENTITY dtsm IS
PORT(clk:in STD_LOGIC;
NumA,NumB: in STD_LOGIC_VECTOR(3 downto 0); segout1:out STD_LOGIC_VECTOR(6 downto 0);