交通灯控制器电路设计报告

交通灯控制器电路设计报告

一.  设计要求

1.  设计一个十字路口的交通灯控制器。先是绿灯亮25秒,紧接着黄灯亮5秒,紧接着红灯亮30秒,依此顺序循环控制;

2.  用计算机画出设计电路图,进行仿真分析验证其正确性;

3.  写设计说明书一份(画总原理图以及说明主要工作原理,单元电路的设计和元件器件的选择,画出完整的电路图和元器件明细表,收获、体会及建议)。

二.设计的作用、目的

1.学习数字逻辑等电路的设计方法,熟知加/减计数器、译码器及数码显示电路的工作原理及特点;

2.培养勤奋、认真仔细、分析故障和解决问题的能力。为以后的学习工作打下良好的基础。

三.设计的具体实现

     1.系统概述

           交通灯控制器电路方框图如图-1所示。系统由秒脉冲发生器、计时器、译码器、逻辑转换电路、LED灯以及显示器组成。秒脉冲发生器是该电路的标准时钟信号源。译码器输出LED灯的控制信号,计时器与逻辑转换电路则控制着LED按着指定要求亮灭。

图-1

2.单元电路设计、分析与仿真

 (1)秒脉冲产生器:

如图-2,用1个LM555CM芯片、2个47KΩ的电阻、1个0.01uF和1个10u的电容构成多谐振荡器产生1Hz/s的单位脉冲。

图-2

多谐振荡器是能产生矩形波的一种自激振荡器电路,由于矩形波中除基波外还含有丰富的高次谐波,故称为多谐振荡器。多谐振荡器没有稳态,只有两个暂稳态,在自身因素的作用下,电路就在两个暂稳态之 间来回转换,故又称它为无稳态电路。由555定时器构成的多谐振荡器如图-2所示,R1,R2和C是外接定时元件,电路中将高电平触发端(6脚)和低电平触发端(2脚)并接后接到R2和C的连接处,将放电端(7脚)接到R1,R2的连接处。由于接通电源瞬间,电容C来不及充电,电容器两端电压uc为低电平,小于(1/3)Vcc,故高电平触发端与低电平触发端均为低电平,输出uo为高电平,放电管VT截止。这时,电源经R1,R2对电容C充电,使 电压uc按指数规律上升,当uc上升到(2/3)Vcc时,输出uo为低电平,放电管VT导通,把uc从(1/3)Vcc 上升到(2/3)Vcc这段时间内电路的状态称为第一暂稳态,其维持时间TPH的长短与电容的充电时间有关 。充电时间常数T充=(R1+R2)C。不难理解,接通电源后,电路就在两个暂稳态之间来回翻转,则输出可得矩形波。振荡周期T = 0.7(R1+R2)C

(2)计时器:

           如图-3,用2片74LS160的同步置数功能构成六十进制计数器。因为要求绿灯亮25s、黄灯亮5s、红灯亮30s而控制信号为单位时钟脉冲,所以采用六十进制的计数器。

图-3

74LS160是十六进制计数器,对于六十进制(0-59)由于不是素数,又由于59=16*3+11,故需要使用两个74LS160芯片。芯片一U4(低位芯片),CET和CEP接高电平“1”,CP接时钟信号,D0、D1、D2、D3接地,CR非接高电平“1” ,芯片二U3(高位)的CP端接芯片一U4的CO端。CR非端接高电平“1”,D0、D1、D2、D3接地。然后用与非门把芯片一U4的Q0、Q3端和芯片二U3的Q0、Q2端连接起来接芯片二U3的同步置数控制端,从而在计数到59的时候把低电平信号送至两芯片的置数端,等到60脉冲上升沿到来时整体置数(D0 D1 D2 D3  D0 D1 D2 D3)由于所有D端接地,也就是说都是0。进而从0到59再一次循环,实现60进制,60进制的进位信号根据需要接出就是。

计数器位数数字变化图

(3)译码器:

如图-4,为了方便设计,我们使用了1个3线-8线译码器和1个4线-10线译码器。即1个74LS138N和1个74LS42N芯片。

图-4

        (4)逻辑转换电路部分:

 因为绿灯亮25秒,黄灯亮5秒,红灯亮30秒。而U7控制十位,U8控制个位。设U7输出为Y,U8输出为Y’。

当十位上为3、4、5时红灯亮,即译码器U7输出3、4、5时,控制红灯亮。此时红灯U公式为;

当十位上为2,且个位上为5、6、7、8、9时黄灯亮,即译码器U7输出2,译码器U8输出5、6、7、8、9时,控制黄灯亮。此时黄灯U的公式为U=Y2(Y’5+Y’6+Y’7+Y’8+Y’9);

除去以上两种状况,剩下的情况便是绿灯亮的时间了。那么,十位上为0、1时或者十位上为2且个位上为0、1、2、3、4时,即U7上输出0、1时或者U7上输出2且U8上输出0、1、2、3、4时,控制绿灯亮。此时绿灯U绿公式为U绿=Y0+Y1+Y2(Y’0+Y’1+Y’2+Y’3+Y’4)

如图-5,根据设计要求我们共使用了3个与门、1个或非门、1个与非门,即2个74LS08D,1个74LS21D,1个74LS00N,2个NC7ST02。

      图-5

(5)LED信号灯及显示器:

我们采用了3个LED灯泡来表示交通灯,另外用了2个七段数字显示器。

4. 电路的安装(仿真)与调试

电路的安装按照电路安装图(见附录1)进行,将时基电路、六十进制计数器、译码器、逻辑转换电路、LED灯及显示器连接起来即可。

仿真时秒时基电路波形图:

由波形图图可知,电路产生了正确的秒脉冲信号。所以可以验证时基电路设计及安装正确。

然后接通整个电路,观察交通灯是否按照要求亮灭。并注意LED显示器显示的时间是否符合标准。经过验证,发现我们设计的电路并无出错。

四.心得体会及建议

   本次实验我认为是很有必要的,不但是对所学知识的一种检验,可以让我们在课程设计的过程中巩固所学的知识,发现自己的不足,而且也是对动手能力的一种培养。只有将理论与实践相结合,将理论用实践的方法反映出来,才是学习这门课程的关键。

在整个设计过程中,我认为更重要的是培养了一种团结与合作的精神,一种积极思考、独立解决问题的能力,一种相互信任、相互帮助的精神。虽然这次课程设计专周的时间充裕,但是我却由于很多很多其他的原因并没有认真参与到这个团队中,只是在设计初期提了点建议就草草了事了。虽然事后在同伴的讲解下还是了解了我们实验课题的主要思考方向及其原理。但是还是没有充分利用这次专周对自己掌握的知识进行一次巩固,对自己的动手能力进一步地提升。所以基于我,当然了还有很多同学的这种情况我建议可以将每个组的实验课题进行进一步的划分,把具体的步骤落实到每一个组员的身上。这样每个组员都会也必须会参与进这个团队中。

最后希望以后可以还有一些这样的课程设计,还能提高自己的动手能力。以后我将真真正正地参与整个团队的活动当中。

五.附录

附录1:电路安装图


附录3:电路所用元器件明细表

六.参考文献

《数字电子技术》(第三版)

《数字电子技术实训教程》

百度文库(http://wenku.baidu.com/)

豆丁网(http://www.docin.com/)

 

第二篇:交通灯控制逻辑电路设计与总结报告

交通灯控制逻辑电路设计与总结报告

      

                         

一、设计任务

用CPLD设计路口交通灯控制器

二、设计要求

    1、满足一下时序要求:南北方向红灯亮,东西方向绿灯亮;南北方向绿灯亮,东西方向红灯亮;

2、每一方向的红(绿)黄灯总共维持30秒;

3、十字路口要有时间显示,具体为:当某一方向绿灯亮时,置显示器为30秒,然后以每秒减一技术方式工作,直至减到数为4秒时,红绿灯熄灭,黄灯开始间隙闪耀4秒,减到0时,红绿灯交换,一次工作循环结束,进入下一步另一方向的工作循环;

4、红绿灯均采用发光二极管;

5、设计由晶振电路产生1Hz标准秒信号的单元电路 (实际秒脉冲由开发箱提供);

6、要求对整体电路进行仿真,观察并记录下仿真波形;

7、选作部分:

a、手动调整和自动控制,夜间为黄灯闪耀;

b、白天黄灯亮时,以2Hz的速度闪烁点亮四秒;

c、红绿灯循环点亮时间可以自由修改。

三、设计设备

含有Quartus软件的电脑一台,可下载的试验台;

四、设计方法

使用VHDL语言进行程序的设计运行和仿真,以及波形的运行仿真,最后进行下载仿真;

五、方案论证

    方案1:把整个流程分成几个进程来做;

方案2:每个进程都使用if和case语句实现功能的实现;

方案3:使用状态机来实现状态间的转换;

方案论证:

1、要实现整个流程,需要做的输出内容类型不同,如果放在一个进程里面就比较容易混淆,产生混乱。而采用分成几个进程来做的方式就明确了每个模块的内容和分工,使其调理清晰,一目了然;

2、if语句是条件语句,是VHDL语言中常用的基本语句。该流程中的变量比较繁多,而使用case语句分情况列出来,简洁明了。

3、状态机的使用格式简洁,使用简单方便,特别是在进行状态的转换时候。并行的状态转换不易出错,可将状态转换、赋值、计数等多个功能封装在某一个状态中,并且更加便于为系统添加新的状态功能。

方案选定:

通过以上分析,确定用以上方案为本次设计的方案。

六、工作原理

先对所给时钟脉冲进行分频到标准时钟脉冲;设计两个时钟控制倒计时,倒计时的时间可自由修改,由输入决定;设计另一个时钟,用以控制白天与夜间模式的转换;在白天时,根据倒计时的数字进行红绿灯的状态转换;夜间时,红绿灯状态改为夜间模式:黄灯闪烁。

七、程序设计

------交通灯控制系统所使用的库和包

----------------------------------------------------------------------------------------------------------------------

 library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

----------------------------------------------------------------------------------------------------------------------

------交通灯控制系统的实体

----------------------------------------------------------------------------------------------------------------------

entity jt is                

port(clk,reset:in std_logic;     ------------------时钟脉冲clk由系统直接提供,需要进行分频;reset是启动键,当reset为1是,系统启动

t0:integer range 0 to30;     ------------------红绿灯循环点亮的时间,根据输入的不同系统运行的不同

r1,y1,g1,r2,y2,g2:out std_logic;     ------------------ r1为东西方向红灯, y1为东西方向黄灯,g1为东西方向绿灯;r2为南北方向红灯,y2为南北方向黄灯,g2为南北方向绿灯

       ec0,ec1,nc0,nc1:out std_logic_vector(3 downto 0));

                       ------------------ ec0,ec1分别为东西方向的倒计时间的个位和十位;nc0,nc1分别为南北方向的倒计时间的个位和十位

end jt;

----------------------------------------------------------------------------------------------------------------------

------交通灯控制系统的结构体(5个进程)

----------------------------------------------------------------------------------------------------------------------

architecture one of jt is 

type state_type is (s0,s1,s2,s3);      ------------------定义状态的类型

signal state:state_type;       ------------------使用状态机

signal k:std_logic;       ------------------分频后的1Hz的标准时钟脉冲

signal c1,c2:integer range 0 to 30;         ------------------定义东西、南北方向的两个倒计时的计数

signal t1:integer range 0 to 3600;     

signal t2:integer range 0 to 24; ------------------定义一个时钟,用以控制白天与夜间模式

Begin

------该进程用以分频

----------------------------------------------------------------------------------------------------------------------

q0:process(clk) 

variable tt:std_logic_vector(9 downto 0);       ------------------中间变量    

   begin

      if clk'event and clk='1' then

        if tt="1111101000" then         ----------------------把所给1kHz分频成1Hz的脉冲k,10000分频,仿真值用“ 0000000100”八分频

            tt:=(others=>'0');

            k<='1';

        else

tt:=tt+1;

k<='0';

        end if;

      end if;

end process q0;

----------------------------------------------------------------------------------------------------------------------

------该进程用以设计时钟

----------------------------------------------------------------------------------------------------------------------

q1:process(k,reset)

   begin

    if reset='1' then      ------------------启动开关为1时,系统开始运行

t1<=0;

t2<=0;          ------------------从0点开始

elsif k='1' and k'event then

if t1=3599 then       ------------------一个t1循环是一个秒,仿真值用“35”

if t2=23 then        -------------------一个t1循环是一个小时,一天24小时

t2<=0;                   

else

t2<=t2+1;

end if;

t1<=0;

else

t1<=t1+1;

end if;

end if;

end process q1;

----------------------------------------------------------------------------------------------------------------------

------该进程用以控制白天黑天模式和红绿灯状态转换

----------------------------------------------------------------------------------------------------------------------

q2:process(k,reset,t2)

   begin

       if t2>=5 and t2<=22 then      -------------------白天模式5:00到22:00之间

if  reset='1' then          -------------------启动开关为1时,系统开始运行,进行状态转换

r1<='0';y1<='0';g1<='1'; -------------------东西方向绿灯亮

r2<='1';y2<='0';g2<='0'; -------------------南北方向红灯亮

state<=s0; -------------------红绿灯处于初始状态s0

c1<=t0;

c2<=t0; -------------------倒计时从自由输入值开始递减

elsif k='1' and k'event then

case state is

when s0=>-------------------当处于第1状态时,讨论

                                                              if c1=5 then   --------------由于进程内部的并列进行,当倒计时第4秒时,进入到第2状态s1

                                                                      state<=s1;

                                                                      c1<=c1-1;

                                                                      c2<=c2-1;   --------------倒计时递减

                                                              elsif c2=0 then    ------------倒计时减到0时,再从初始值开始

                                                                      c1<=t0;

                                                                      c2<=t0;

                                                               else        ----------------否则继续保持第1状态s0

                                                                      state<=s0;

                                                                      c1<=c1-1;

                                                                      c2<=c2-1;

                                                               end if;

                                                   when s1=>-------------------当处于第2状态时,讨论

                                                             if c1=1 then--------------由于进程内部的并列进行,当倒计时第t0秒时,进入到第3状态s2

                                                                      state<=s2;

                                                                      c1<=c1-1;

                                                                      c2<=c2-1;

                                                               else----------------否则继续保持第2状态

                                                                      state<=s1;

                                                                      c1<=c1-1;

                                                                      c2<=c2-1;

                                                               end if;    

                                                   when s2=>-------------------当处于第3状态时,讨论

                                                              if c2=5 then--------------由于进程内部的并列进行,当倒计时第4秒时,进入到第4状态s3

                                                                    state<=s3;

                                                                   c1<=c1-1;

                                                                   c2<=c2-1;

                                                             elsif c1=0 then   ------------倒计时减到0时,再从初始值开始

                                                                  c1<=t0;

                                                                  c2<=t0;

                                                           else       ----------------否则继续保持第3状态

                                                                  state<=s2;

                                                                  c1<=c1-1;

                                                                  c2<=c2-1;

                                                           end if;      

                                                      when s3=>-------------------当处于第4状态时,讨论

                                                         if c2=1 then--------------由于进程内部的并列进行,当倒计时第t0秒时,进入到第1状态s0

                                                               state<=s0;

                                                               c1<=c1-1;

                                                               c2<=c2-1;

                                                        else----------------否则继续保持第4状态

                                                               state<=s3;

                                                               c1<=c1-1;

                                                               c2<=c2-1;

                                                        end if;    

                                                    when others=> state<=s0;

                        end case;

                                         if state=s0 then

                                                        r1<='0';y1<='0';g1<='1';

                                                        r2<='1';y2<='0';g2<='0';

                                           elsif state=s1 then

                                                        r1<='0';g1<='0';

                                                        r2<='1';y2<='0';g2<='0';

                                                        if c1=4 or c1=2 then y1<='1';

                                                        else y1<='0';

                                                        end if;

                                           elsif state=s2 then

                                                        r1<='1';y1<='0';g1<='0';

                                                        r2<='0';y2<='0';g2<='1';

                                           elsif state=s3 then

                                                        r1<='1';y1<='0';g1<='0';

                                                        r2<='0';g2<='0';

                                                        if c2=4 or c2=2 then y2<='1';

                                                        else y2<='0';

                                                        end if;

                                           end if;

---------------------------------各个状态的红绿灯变量的赋值,‘1’亮‘0’熄

end if;

else  -------------------夜间模式22:00到次日5:00之间

c2<=0;c1<=0;

r1<='0';r2<='0';g1<='0';g2<='0';

y1<=k;y2<=k----------------红绿灯的状态:脉冲k赋给黄灯变量,黄灯闪烁

end if ;

end process q2;

----------------------------------------------------------------------------------------------------------------------

------该进程用于东西方向倒计时的译码显示

----------------------------------------------------------------------------------------------------------------------

q3:process(c1)

   begin

                                                case c1 is

                                                 when 0=>ec0<="0000";ec1<="0000";

                                                 when 1=>ec0<="0001";ec1<="0000";

                                                 when 2=>ec0<="0010";ec1<="0000";

                                                 when 3=>ec0<="0011";ec1<="0000";

                                                 when 4=>ec0<="0100";ec1<="0000";

                                                 when 5=>ec0<="0101";ec1<="0000";

                                                 when 6=>ec0<="0110";ec1<="0000";

                                                 when 7=>ec0<="1000";ec1<="0000";

                                                 when 9=>ec0<="1001";ec1<="0000";

                                                 when 10=>ec0<="0000";ec1<="0001";

                                                 when 11=>ec0<="0001";ec1<="0001";

                                                 when 12=>ec0<="0010";ec1<="0001";

                                                 when 13=>ec0<="0011";ec1<="0001";

                                                 when 14=>ec0<="0100";ec1<="0001";

                                                 when 15=>ec0<="0101";ec1<="0001";

                                                 when 16=>ec0<="0110";ec1<="0001";

                                                 when 17=>ec0<="0111";ec1<="0001";

                                                 when 18=>ec0<="1000";ec1<="0001";

                                                 when 19=>ec0<="1001";ec1<="0001";

                                                 when 20=>ec0<="0000";ec1<="0010";

                                                 when 21=>ec0<="0001";ec1<="0010";

                                                 when 22=>ec0<="0010";ec1<="0010";

                                                 when 23=>ec0<="0011";ec1<="0010";

                                                 when 24=>ec0<="0100";ec1<="0010";

                                                 when 25=>ec0<="0101";ec1<="0010";

                                                 when 26=>ec0<="0110";ec1<="0010";

                                                 when 27=>ec0<="0111";ec1<="0010";

                                                 when 28=>ec0<="1000";ec1<="0010";

                                                 when 29=>ec0<="1001";ec1<="0010";

                                                 when 30=>ec0<="0000";ec1<="0011";

----------------------------当在设定范围内时,分别为个位十位译码并显示

                                                 when others=>ec0<="0000";ec1<="0000";

--------------------------------------------------------否则,LED灯显示0

                                                end case;

end process q3;

----------------------------------------------------------------------------------------------------------------------

------该进程用于南北方向倒计时的译码显示

----------------------------------------------------------------------------------------------------------------------

q4:process(c2)

   begin

                                                case c2 is

                                                 when 0=>nc0<="0000";nc1<="0000";

                                                 when 1=>nc0<="0001";nc1<="0000";

                                                 when 2=>nc0<="0010";nc1<="0000";

                                                 when 3=>nc0<="0011";nc1<="0000";

                                                 when 4=>nc0<="0100";nc1<="0000";

                                                 when 5=>nc0<="0101";nc1<="0000";

                                                 when 6=>nc0<="0110";nc1<="0000";

                                                 when 7=>nc0<="0111";nc1<="0000";

                                                 when 8=>nc0<="1000";nc1<="0000";

                                                 when 9=>nc0<="1001";nc1<="0000";

                                                 when 10=>nc0<="0000";nc1<="0001";

                                                 when 11=>nc0<="0001";nc1<="0001";

                                                 when 12=>nc0<="0010";nc1<="0001";

                                                 when 13=>nc0<="0011";nc1<="0001";

                                                 when 14=>nc0<="0100";nc1<="0001";

                                                 when 15=>nc0<="0101";nc1<="0001";

                                                 when 16=>nc0<="0110";nc1<="0001";

                                                 when 17=>nc0<="0111";nc1<="0001";

                                                 when 18=>nc0<="1000";nc1<="0001";

                                                 when 19=>nc0<="1001";nc1<="0001";

                                                 when 20=>nc0<="0000";nc1<="0010";

                                                 when 21=>nc0<="0001";nc1<="0010";

                                                 when 22=>nc0<="0010";nc1<="0010";

                                                 when 23=>nc0<="0011";nc1<="0010";

                                                 when 24=>nc0<="0100";nc1<="0010";

                                                 when 25=>nc0<="0101";nc1<="0010";

                                                 when 26=>nc0<="0110";nc1<="0010";

                                                 when 27=>nc0<="0111";nc1<="0010";

                                                 when 28=>nc0<="1000";nc1<="0010";

                                                 when 29=>nc0<="1001";nc1<="0010";

                                                 when 30=>nc0<="0000";nc1<="0011";

---------------------------当在设定范围内时,分别为个位十位译码并显示

                                                 when others=>nc0<="0000";nc1<="0000";

----------------------------------------------------------否则,LED灯显示0

                                                end case;

end process q4;

----------------------------------------------------------------------------------------------------------------------

end architecture one;                         -----------------------------------所有进程结束

----------------------------------------------------------------------------------------------------------------------

八、仿真结果

1、clk为输入脉冲;开始令reset为’1’,启动系统,系统正常工作后值为’0; t0为红绿灯循环时间,可自由修改,如果输入值为’0010000’,则为16秒倒计时。如下图:系统从0点开始运行,处于夜间模式时,倒计时都为“00”,两个方向都为黄灯闪烁,红绿灯都熄灭。

2、5:00之后,进入到白天模式:从第1状态(东西方向绿灯亮、南北方向红灯)开始,倒计时从16秒开始递减。倒计时第4秒后进入第2 状态(东西方向黄灯闪烁,南北方向红灯亮)。

3、倒计时第0秒后进入第3 状态(东西方向红灯亮,南北方向绿灯亮),倒计时再从16秒开始递减;倒计时第4秒后进入第4 状态(东西方向红灯亮,南北方向黄灯闪烁);倒计时第0秒后进入第1 状态(东西方向绿灯亮,南北方向红灯亮),倒计时再从16秒开始递减

。如此循环。

4、当计时器到22:00时,再次进入夜间模式:东西南北方向黄灯闪烁;到次日5:00时又回到白天模式。如此循环。

九、讨论与改进

   特点:1、在整个设计过程中,分进程实现整个功能,简单明了;

2、状态机的功能和优点得到了较为完整的体现;

3、分夜间和白天模式不同,系统自动调节;

4、黄灯以闪烁的形式亮;系统运行后红绿灯循环点亮的时间也可自由修改。

不足:1、整个系统启动后从夜间0点开始运行,而不能随意调为哪个时间的交通灯状态,只能从程序中改,不能手动调节;

2、整个功能还是比较简单,未能分左右转和直行的情况;

3、紧急情况处理时也无特殊处理的设置。

改进:1、在进程中可增加一个输入量,用以控制系统的时钟时间,方便调节模式和交通灯状态;

2、在进程中可加入几个红绿灯状态来分别控制东西方向和南北方向的左转、右转和直行的红绿灯状态;

3、在原有程序的基础上,可通过增加一个输入量来控制一种特殊状态,用以控制特殊情况的处理,视该特殊情况而定。

                                                            二○##年九月三日

相关推荐