西邮交通灯1
- 格式:doc
- 大小:492.00 KB
- 文档页数:14
四.源程序(注释)Traffic_light.vhd----主程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY TRAFFICLIGHT ISPORT(CLK,RESET,EMERGENCY:IN STD_LOGIC;----输入时钟信号,复位信号,紧急信号 LIGHT1,LIGHT2:OUT STD_LOGIC_VECTOR(2 DOWNTO 0);----输出东西南北向两个红信号NUM:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);----输出7端数码管选通信号CAT_TEMP:OUT STD_LOGIC_VECTOR(5 DOWNTO 0);----输出7端数码管共阴极信号BELL:OUT STD_LOGIC----输出警铃信号);END TRAFFICLIGHT;ARCHITECTURE MAIN OF TRAFFICLIGHT ISSIGNAL TEMPCLK:STD_LOGIC;SIGNAL TEMPCLK2:STD_LOGIC;SIGNAL TEMPCOUNT:STD_LOGIC_VECTOR(5 DOWNTO 0);SIGNAL TEMPNUM:STD_LOGIC_VECTOR(3 DOWNTO 0);COMPONENT DIV IS----组合FREQUENCY模块,以下同PORT(CLK:IN STD_LOGIC;CLK_OUT:OUT STD_LOGIC);END COMPONENT;COMPONENT DIV2 ISPORT(CLK:IN STD_LOGIC;CLK_OUT:OUT STD_LOGIC);END COMPONENT;COMPONENT COUNT ISPORT(CLK:IN STD_LOGIC;RESET:IN STD_LOGIC;EMERGENCY:IN STD_LOGIC;COUNTER:OUT STD_LOGIC_VECTOR (5 DOWNTO 0);BELL:OUT STD_LOGIC);END COMPONENT;COMPONENT LIGHT ISPORT(EMERGENCY:IN STD_LOGIC;COUNT:IN STD_LOGIC_VECTOR(5 DOWNTO 0);LIGHT1,LIGHT2:OUT STD_LOGIC_VECTOR(2 DOWNTO 0));END COMPONENT;COMPONENT SHUMAGUAN ISPORT(COUNT:IN STD_LOGIC_VECTOR(5 DOWNTO 0);CLK:IN STD_LOGIC;NUMIN:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);CAT_TEMP:OUT STD_LOGIC_VECTOR(5 DOWNTO 0));END COMPONENT;COMPONENT SHOW ISPORT(NUM_IN:IN STD_LOGIC_VECTOR(3 DOWNTO 0);NUM:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));END COMPONENT;BEGIN----将各个模块接口连接起来U1:DIV PORT MAP (CLK=>CLK,CLK_OUT=>TEMPCLK);U2:COUNT PORT MAP(BELL=>BELL,CLK=>TEMPCLK,RESET=>RESET,EMERGENCY=>EMERGENCY,COUNTER=>TEMPCOUNT); U3:LIGHT PORT MAP(EMERGENCY=>EMERGENCY,COUNT=>TEMPCOUNT,LIGHT1=>LIGHT1,LIGHT2=>LIGHT2);U4:SHUMAGUAN PORT MAP(CAT_TEMP=>CAT_TEMP,COUNT=>TEMPCOUNT,CLK=>CLK,NUMIN=>TEMPNUM);U5:SHOW PORT MAP (NUM_IN=>TEMPNUM,NUM=>NUM);U6:DIV2 PORT MAP (CLK=>CLK,CLK_OUT=>TEMPCLK2);END MAIN;DIV.vhd----分频器模块,1HzLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY DIV ISPORT(CLK:IN STD_LOGIC;CLK_OUT:OUT STD_LOGIC);END DIV;ARCHITECTURE FREQ OF DIV ISSIGNAL TEMP:INTEGER RANGE 0 TO 49999999;----设置分频49999999,则为1Hz BEGINPROCESS(CLK)BEGINIF(CLK'EVENT AND CLK='1')THENIF(TEMP=4999999)THENTEMP<=0;ELSETEMP<=TEMP+1;END IF;IF TEMP=49999999 THENCLK_OUT<='1';ELSE CLK_OUT<='0';END IF;END IF;END PROCESS;END;DIV2.vhd----次分频器模块,50KHzLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY DIV2 ISPORT(CLK:IN STD_LOGIC;CLK_OUT:OUT STD_LOGIC);END DIV2;ARCHITECTURE FREQ OF DIV2 ISSIGNAL TEMP:INTEGER RANGE 0 TO 4999;BEGINPROCESS(CLK)BEGINIF(CLK'EVENT AND CLK='1')THENIF(TEMP=4999)THENTEMP<=0;ELSETEMP<=TEMP+1;END IF;IF TEMP=4999 THENCLK_OUT<='1';ELSE CLK_OUT<='0';END IF;END IF;END PROCESS;END;COUNT.vhd----计数器模块(主要控制模块),用外部时钟设置了50个状态的一个周期1~50----由于该交通灯的状态为50种,数码管有50种显示状态----完全通过控制计数器的停止和复位来控制闪灯和数码管LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY COUNT ISPORT(CLK:IN STD_LOGIC;----外部时钟输入RESET:IN STD_LOGIC;----复位信号输入EMERGENCY:IN STD_LOGIC;----紧急信号输入COUNTER:OUT STD_LOGIC_VECTOR (5 DOWNTO 0):="000001";----计数信号输出BELL:OUT STD_LOGIC----警铃信号输出);END COUNT;ARCHITECTURE CON OF COUNT ISSIGNAL TEMPCOUNT:INTEGER RANGE 1 TO 50:=1;----定义信号计数,初始状态为1BEGINPROCESS(CLK,RESET,EMERGENCY)BEGINIF CLK'EVENT AND CLK='1' THEN----外部时钟,1HzIF EMERGENCY='0' THEN----当不是紧急状态BELL<='0';IF RESET='1' THEN----复位状态TEMPCOUNT<=1;----计数器回到初始状态1ELSIF TEMPCOUNT=50 THENTEMPCOUNT<=1;----计数器计数状态,加1ELSE TEMPCOUNT<=TEMPCOUNT+1;END IF;ELSIF EMERGENCY='1' THEN----当紧急信号为高电平,进入紧急状态TEMPCOUNT<=TEMPCOUNT;----计数器停止计数BELL<='1';----警铃为高电平END IF;END IF;END PROCESS;COUNTER<=CONV_STD_LOGIC_VECTOR(TEMPCOUNT,6);----内部信号转化为输出END CON;LIGHT.vhd----交通灯显示信号LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY LIGHT ISPORT(EMERGENCY:IN STD_LOGIC;----紧急信号输入,控制紧急状态COUNT:IN STD_LOGIC_VECTOR(5 DOWNTO 0);----计数器输入,控制其它正常状态 LIGHT1,LIGHT2:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)----交通灯信号输出);END LIGHT;ARCHITECTURE LIGHTSHOW OF LIGHT ISTYPE STATES IS----设置状态机,控制状态(S0,S1,S2,S3,S4);SIGNAL STATE:STATES;SIGNAL TEMPCOUNT:INTEGER RANGE 1 TO 50;BEGINP1:PROCESS(COUNT,EMERGENCY)BEGINTEMPCOUNT<=CONV_INTEGER(COUNT);----将二进制输入转化为十进制计数信号IF EMERGENCY='1' THEN----EMERGENCY为高电平时为紧急状态STATE<=S4;ELSECASE TEMPCOUNT IS----由计数器控制状态持续时间WHEN 1 TO 20 => STATE<=S0;----1秒到20秒WHEN 21 TO 25 => STATE<=S1;----21秒到25秒WHEN 26 TO 45 => STATE<=S2;----26秒到45秒WHEN 46 TO 50 => STATE<=S3;----46秒到50秒END CASE;END IF;END PROCESS P1;P2:PROCESS(STATE)----状态机BEGINCASE STATE ISWHEN S0 =>LIGHT1<="0010";----南北绿灯LIGHT2<="1001";----东西红灯,且禁止左转WHEN S1 =>LIGHT1<="0100";----南北黄灯LIGHT2<="1001";----东西红灯,且禁止左转WHEN S2 =>LIGHT1<="1001";----南北红灯,且禁止左转LIGHT2<="0010";----东西绿灯WHEN S3 =>LIGHT1<="1001";----南北红灯,且禁止左转LIGHT2<="0100";----东西黄灯WHEN S4 =>LIGHT1<="1001";----南北红灯,且禁止左转LIGHT2<="1001";----东西红灯,且禁止左转END CASE;END PROCESS;END LIGHTSHOW;SHUMAGUAN.vhd----7段数码管倒计时控制模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY SHUMAGUAN ISPORT(COUNT:IN STD_LOGIC_VECTOR(5 DOWNTO 0);----计数器输入信号CLK:IN STD_LOGIC;----时钟信号NUMIN:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);----输出7段数码管显示数字信号,输出到译码模块CAT_TEMP:OUT STD_LOGIC_VECTOR(5 DOWNTO 0)----7端数码管共阴极输出控制信号 );END SHUMAGUAN;ARCHITECTURE COUNTER OF SHUMAGUAN ISSIGNAL TEMP:INTEGER RANGE 0 TO 3;SIGNAL COUNTER:INTEGER RANGE 1 TO 50;SIGNAL CAT:STD_LOGIC_VECTOR(5 DOWNTO 0):="011111";SIGNAL NUM_IN:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINP1:PROCESS(CLK)----内部时钟,控制7段数码管显示扫描内容BEGINCOUNTER<=CONV_INTEGER(COUNT);IF(CLK'EVENT AND CLK='1')THENIF(TEMP=3)THENTEMP<=0;ELSETEMP<=TEMP+1;END IF;END IF;END PROCESS P1;P2:PROCESS(COUNTER,TEMP)BEGINCOUNTER<=CONV_INTEGER(COUNT);CASE COUNTER IS----通过计数器输入信号控制状态WHEN 1=>CASE TEMP IS----在每个状态内部设置数码管扫描过程,由于COUNTER和----扫描时钟不同----则可在数码管上同时显示4个数字,以状态1----(COUNTER=1)为例----显示“1924”,并在共阴极上扫描,以下同 ----共标记50种状态WHEN 0=>NUM_IN<="0001";CAT<="011111";WHEN 1=>NUM_IN<="1001";CAT<="101111";WHEN 2=>NUM_IN<="0010";CAT<="111101";WHEN 3=>NUM_IN<="0100";CAT<="111110";END CASE;WHEN 2=>CASE TEMP ISWHEN 0=>NUM_IN<="0001";CAT<="011111";WHEN 1=>NUM_IN<="1000";CAT<="101111";WHEN 2=>NUM_IN<="0010";CAT<="111101";WHEN 3=>NUM_IN<="0011";CAT<="111110";END CASE;WHEN 3=>CASE TEMP ISWHEN 0=>NUM_IN<="0001";CAT<="011111";WHEN 1=>NUM_IN<="0111";CAT<="101111";WHEN 2=>NUM_IN<="0010";CAT<="111101";WHEN 3=>NUM_IN<="0010";CAT<="111110";END CASE;WHEN 4=>CASE TEMP ISWHEN 0=>NUM_IN<="0001";CAT<="011111";WHEN 1=>NUM_IN<="0110";CAT<="101111";WHEN 2=>NUM_IN<="0010";CAT<="111101";WHEN 3=>NUM_IN<="0001";CAT<="111110";END CASE;WHEN 5=>CASE TEMP ISWHEN 0=>NUM_IN<="0001";CAT<="011111";WHEN 1=>NUM_IN<="0101";CAT<="101111";WHEN 2=>NUM_IN<="0010";CAT<="111101";WHEN 3=>NUM_IN<="0000";CAT<="111110";END CASE;WHEN 6=>CASE TEMP ISWHEN 0=>NUM_IN<="0001";CAT<="011111";WHEN 1=>NUM_IN<="0100";CAT<="101111";WHEN 2=>NUM_IN<="0001";CAT<="111101";WHEN 3=>NUM_IN<="1001";CAT<="111110";END CASE;WHEN 7=>CASE TEMP ISWHEN 0=>NUM_IN<="0001";CAT<="011111";WHEN 1=>NUM_IN<="0011";CAT<="101111";WHEN 2=>NUM_IN<="0001";CAT<="111101";WHEN 3=>NUM_IN<="1000";CAT<="111110";END CASE;WHEN 8=>CASE TEMP ISWHEN 0=>NUM_IN<="0001";CAT<="011111";WHEN 1=>NUM_IN<="0010";CAT<="101111";WHEN 2=>NUM_IN<="0001";CAT<="111101";WHEN 3=>NUM_IN<="0111";CAT<="111110";END CASE;WHEN 9=>CASE TEMP ISWHEN 0=>NUM_IN<="0001";CAT<="011111";WHEN 1=>NUM_IN<="0001";CAT<="101111"; WHEN 2=>NUM_IN<="0001";CAT<="111101"; WHEN 3=>NUM_IN<="0110";CAT<="111110"; END CASE;WHEN 10=>CASE TEMP ISWHEN 0=>NUM_IN<="0001";CAT<="011111"; WHEN 1=>NUM_IN<="0000";CAT<="101111"; WHEN 2=>NUM_IN<="0001";CAT<="111101"; WHEN 3=>NUM_IN<="0101";CAT<="111110"; END CASE;WHEN 11=>CASE TEMP ISWHEN 0=>NUM_IN<="0000";CAT<="011111"; WHEN 1=>NUM_IN<="1001";CAT<="101111"; WHEN 2=>NUM_IN<="0001";CAT<="111101"; WHEN 3=>NUM_IN<="0100";CAT<="111110"; END CASE;WHEN 12=>CASE TEMP ISWHEN 0=>NUM_IN<="0000";CAT<="011111"; WHEN 1=>NUM_IN<="1000";CAT<="101111"; WHEN 2=>NUM_IN<="0001";CAT<="111101"; WHEN 3=>NUM_IN<="0011";CAT<="111110"; END CASE;WHEN 13=>CASE TEMP ISWHEN 0=>NUM_IN<="0000";CAT<="011111"; WHEN 1=>NUM_IN<="0111";CAT<="101111"; WHEN 2=>NUM_IN<="0001";CAT<="111101"; WHEN 3=>NUM_IN<="0010";CAT<="111110"; END CASE;WHEN 14=>CASE TEMP ISWHEN 0=>NUM_IN<="0000";CAT<="011111"; WHEN 1=>NUM_IN<="0110";CAT<="101111"; WHEN 2=>NUM_IN<="0001";CAT<="111101"; WHEN 3=>NUM_IN<="0001";CAT<="111110"; END CASE;WHEN 15=>CASE TEMP ISWHEN 0=>NUM_IN<="0000";CAT<="011111"; WHEN 1=>NUM_IN<="0101";CAT<="101111"; WHEN 2=>NUM_IN<="0001";CAT<="111101"; WHEN 3=>NUM_IN<="0000";CAT<="111110"; END CASE;WHEN 16=>CASE TEMP ISWHEN 0=>NUM_IN<="0000";CAT<="011111"; WHEN 1=>NUM_IN<="0100";CAT<="101111"; WHEN 2=>NUM_IN<="0000";CAT<="111101"; WHEN 3=>NUM_IN<="1001";CAT<="111110"; END CASE;WHEN 17=>CASE TEMP ISWHEN 0=>NUM_IN<="0000";CAT<="011111"; WHEN 1=>NUM_IN<="0011";CAT<="101111"; WHEN 2=>NUM_IN<="0000";CAT<="111101"; WHEN 3=>NUM_IN<="1000";CAT<="111110";END CASE;WHEN 18=>CASE TEMP ISWHEN 0=>NUM_IN<="0000";CAT<="011111"; WHEN 1=>NUM_IN<="0010";CAT<="101111"; WHEN 2=>NUM_IN<="0000";CAT<="111101"; WHEN 3=>NUM_IN<="0111";CAT<="111110"; END CASE;WHEN 19=>CASE TEMP ISWHEN 0=>NUM_IN<="0000";CAT<="011111"; WHEN 1=>NUM_IN<="0001";CAT<="101111"; WHEN 2=>NUM_IN<="0000";CAT<="111101"; WHEN 3=>NUM_IN<="0110";CAT<="111110"; END CASE;WHEN 20=>CASE TEMP ISWHEN 0=>NUM_IN<="0000";CAT<="011111"; WHEN 1=>NUM_IN<="0000";CAT<="101111"; WHEN 2=>NUM_IN<="0000";CAT<="111101"; WHEN 3=>NUM_IN<="0101";CAT<="111110"; END CASE;WHEN 21=>CASE TEMP ISWHEN 0=>NUM_IN<="0000";CAT<="011111"; WHEN 1=>NUM_IN<="0100";CAT<="101111"; WHEN 2=>NUM_IN<="0000";CAT<="111101"; WHEN 3=>NUM_IN<="0100";CAT<="111110"; END CASE;WHEN 22=>CASE TEMP ISWHEN 0=>NUM_IN<="0000";CAT<="011111"; WHEN 1=>NUM_IN<="0011";CAT<="101111"; WHEN 2=>NUM_IN<="0000";CAT<="111101"; WHEN 3=>NUM_IN<="0011";CAT<="111110"; END CASE;WHEN 23=>CASE TEMP ISWHEN 0=>NUM_IN<="0000";CAT<="011111"; WHEN 1=>NUM_IN<="0010";CAT<="101111"; WHEN 2=>NUM_IN<="0000";CAT<="111101"; WHEN 3=>NUM_IN<="0010";CAT<="111110"; END CASE;WHEN 24=>CASE TEMP ISWHEN 0=>NUM_IN<="0000";CAT<="011111"; WHEN 1=>NUM_IN<="0001";CAT<="101111"; WHEN 2=>NUM_IN<="0000";CAT<="111101"; WHEN 3=>NUM_IN<="0001";CAT<="111110"; END CASE;WHEN 25=>CASE TEMP ISWHEN 0=>NUM_IN<="0000";CAT<="011111"; WHEN 1=>NUM_IN<="0000";CAT<="101111"; WHEN 2=>NUM_IN<="0000";CAT<="111101"; WHEN 3=>NUM_IN<="0000";CAT<="111110"; END CASE;WHEN 26=>CASE TEMP ISWHEN 0=>NUM_IN<="0001";CAT<="111101";WHEN 1=>NUM_IN<="1001";CAT<="111110"; WHEN 2=>NUM_IN<="0010";CAT<="011111"; WHEN 3=>NUM_IN<="0100";CAT<="101111"; END CASE;WHEN 27=>CASE TEMP ISWHEN 0=>NUM_IN<="0001";CAT<="111101"; WHEN 1=>NUM_IN<="1000";CAT<="111110"; WHEN 2=>NUM_IN<="0010";CAT<="011111"; WHEN 3=>NUM_IN<="0011";CAT<="101111"; END CASE;WHEN 28=>CASE TEMP ISWHEN 0=>NUM_IN<="0001";CAT<="111101"; WHEN 1=>NUM_IN<="0111";CAT<="111110"; WHEN 2=>NUM_IN<="0010";CAT<="011111"; WHEN 3=>NUM_IN<="0010";CAT<="101111"; END CASE;WHEN 29=>CASE TEMP ISWHEN 0=>NUM_IN<="0001";CAT<="111101"; WHEN 1=>NUM_IN<="0110";CAT<="111110"; WHEN 2=>NUM_IN<="0010";CAT<="011111"; WHEN 3=>NUM_IN<="0001";CAT<="101110"; END CASE;WHEN 30=>CASE TEMP ISWHEN 0=>NUM_IN<="0001";CAT<="111101"; WHEN 1=>NUM_IN<="0101";CAT<="111110"; WHEN 2=>NUM_IN<="0010";CAT<="011111"; WHEN 3=>NUM_IN<="0000";CAT<="101111"; END CASE;WHEN 31=>CASE TEMP ISWHEN 0=>NUM_IN<="0001";CAT<="111101"; WHEN 1=>NUM_IN<="0100";CAT<="111110"; WHEN 2=>NUM_IN<="0001";CAT<="011111"; WHEN 3=>NUM_IN<="1001";CAT<="101111"; END CASE;WHEN 32=>CASE TEMP ISWHEN 0=>NUM_IN<="0001";CAT<="111101"; WHEN 1=>NUM_IN<="0011";CAT<="111110"; WHEN 2=>NUM_IN<="0001";CAT<="011111"; WHEN 3=>NUM_IN<="1000";CAT<="101111"; END CASE;WHEN 33=>CASE TEMP ISWHEN 0=>NUM_IN<="0001";CAT<="111101"; WHEN 1=>NUM_IN<="0010";CAT<="111110"; WHEN 2=>NUM_IN<="0001";CAT<="011111"; WHEN 3=>NUM_IN<="0111";CAT<="101111"; END CASE;WHEN 34=>CASE TEMP ISWHEN 0=>NUM_IN<="0001";CAT<="111101"; WHEN 1=>NUM_IN<="0001";CAT<="111110"; WHEN 2=>NUM_IN<="0001";CAT<="011111"; WHEN 3=>NUM_IN<="0110";CAT<="101111";END CASE;WHEN 35=>CASE TEMP ISWHEN 0=>NUM_IN<="0001";CAT<="111101"; WHEN 1=>NUM_IN<="0000";CAT<="111110"; WHEN 2=>NUM_IN<="0001";CAT<="011111"; WHEN 3=>NUM_IN<="0101";CAT<="101111"; END CASE;WHEN 36=>CASE TEMP ISWHEN 0=>NUM_IN<="0000";CAT<="111101"; WHEN 1=>NUM_IN<="1001";CAT<="111110"; WHEN 2=>NUM_IN<="0001";CAT<="011111"; WHEN 3=>NUM_IN<="0100";CAT<="101111"; END CASE;WHEN 37=>CASE TEMP ISWHEN 0=>NUM_IN<="0000";CAT<="111101"; WHEN 1=>NUM_IN<="1000";CAT<="111110"; WHEN 2=>NUM_IN<="0001";CAT<="011111"; WHEN 3=>NUM_IN<="0011";CAT<="101111"; END CASE;WHEN 38=>CASE TEMP ISWHEN 0=>NUM_IN<="0000";CAT<="111101"; WHEN 1=>NUM_IN<="0111";CAT<="111110"; WHEN 2=>NUM_IN<="0001";CAT<="011111"; WHEN 3=>NUM_IN<="0010";CAT<="101111"; END CASE;WHEN 39=>CASE TEMP ISWHEN 0=>NUM_IN<="0000";CAT<="111101"; WHEN 1=>NUM_IN<="0110";CAT<="111110"; WHEN 2=>NUM_IN<="0001";CAT<="011111"; WHEN 3=>NUM_IN<="0001";CAT<="101111"; END CASE;WHEN 40=>CASE TEMP ISWHEN 0=>NUM_IN<="0000";CAT<="111101"; WHEN 1=>NUM_IN<="0101";CAT<="111110"; WHEN 2=>NUM_IN<="0001";CAT<="011111"; WHEN 3=>NUM_IN<="0000";CAT<="101111"; END CASE;WHEN 41=>CASE TEMP ISWHEN 0=>NUM_IN<="0000";CAT<="111101"; WHEN 1=>NUM_IN<="0100";CAT<="111110"; WHEN 2=>NUM_IN<="0000";CAT<="011111"; WHEN 3=>NUM_IN<="1001";CAT<="101111"; END CASE;WHEN 42=>CASE TEMP ISWHEN 0=>NUM_IN<="0000";CAT<="111101"; WHEN 1=>NUM_IN<="0011";CAT<="111110"; WHEN 2=>NUM_IN<="0000";CAT<="011111"; WHEN 3=>NUM_IN<="1000";CAT<="101111"; END CASE;WHEN 43=>CASE TEMP ISWHEN 0=>NUM_IN<="0000";CAT<="111101";WHEN 1=>NUM_IN<="0010";CAT<="111110"; WHEN 2=>NUM_IN<="0000";CAT<="011111"; WHEN 3=>NUM_IN<="0111";CAT<="101111"; END CASE;WHEN 44=>CASE TEMP ISWHEN 0=>NUM_IN<="0000";CAT<="111101"; WHEN 1=>NUM_IN<="0001";CAT<="111110"; WHEN 2=>NUM_IN<="0000";CAT<="011111"; WHEN 3=>NUM_IN<="0110";CAT<="101111"; END CASE;WHEN 45=>CASE TEMP ISWHEN 0=>NUM_IN<="0000";CAT<="111101"; WHEN 1=>NUM_IN<="0000";CAT<="111110"; WHEN 2=>NUM_IN<="0000";CAT<="011111"; WHEN 3=>NUM_IN<="0101";CAT<="101111"; END CASE;WHEN 46=>CASE TEMP ISWHEN 0=>NUM_IN<="0000";CAT<="111101"; WHEN 1=>NUM_IN<="0100";CAT<="111110"; WHEN 2=>NUM_IN<="0000";CAT<="011111"; WHEN 3=>NUM_IN<="0100";CAT<="101111"; END CASE;WHEN 47=>CASE TEMP ISWHEN 0=>NUM_IN<="0000";CAT<="111101"; WHEN 1=>NUM_IN<="0011";CAT<="111110"; WHEN 2=>NUM_IN<="0000";CAT<="011111"; WHEN 3=>NUM_IN<="0011";CAT<="101111"; END CASE;WHEN 48=>CASE TEMP ISWHEN 0=>NUM_IN<="0000";CAT<="111101"; WHEN 1=>NUM_IN<="0010";CAT<="111110"; WHEN 2=>NUM_IN<="0000";CAT<="011111"; WHEN 3=>NUM_IN<="0010";CAT<="101111"; END CASE;WHEN 49=>CASE TEMP ISWHEN 0=>NUM_IN<="0000";CAT<="111101"; WHEN 1=>NUM_IN<="0001";CAT<="111110"; WHEN 2=>NUM_IN<="0000";CAT<="011111"; WHEN 3=>NUM_IN<="0001";CAT<="101111"; END CASE;WHEN 50=>CASE TEMP ISWHEN 0=>NUM_IN<="0000";CAT<="111101"; WHEN 1=>NUM_IN<="0000";CAT<="111110"; WHEN 2=>NUM_IN<="0000";CAT<="011111"; WHEN 3=>NUM_IN<="0000";CAT<="101111"; END CASE;END CASE;END PROCESS P2;NUMIN<=NUM_IN;CAT_TEMP<=CAT;END COUNTER;SHOW.vhd----数码管显示译码模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY SHOW ISPORT(NUM_IN:IN STD_LOGIC_VECTOR(3 DOWNTO 0);----数码管数字信号输入NUM:OUT STD_LOGIC_VECTOR(6 DOWNTO 0)----7端数码管输出);END SHOW;ARCHITECTURE SHOWTIME OF SHOW ISSIGNAL NUM_OUT:STD_LOGIC_VECTOR(6 DOWNTO 0):="0110000";BEGINPROCESS(NUM_IN)----译码过程BEGINCASE NUM_IN ISWHEN "0000"=>NUM_OUT<="1111110";----0WHEN "0001"=>NUM_OUT<="0110000";----1WHEN "0010"=>NUM_OUT<="1101101";----2WHEN "0011"=>NUM_OUT<="1111001";----3WHEN "0100"=>NUM_OUT<="0110011";----4WHEN "0101"=>NUM_OUT<="1011011";----5WHEN "0110"=>NUM_OUT<="1011111";----6WHEN "0111"=>NUM_OUT<="1110000";----7WHEN "1000"=>NUM_OUT<="1111111";----8WHEN "1001"=>NUM_OUT<="1111011";----9WHEN OTHERS=>NUM_OUT<="0000000";----其他状态不显示END CASE;END PROCESS;NUM<=NUM_OUT;END;。
#include <reg52.h>#include <INTRINS.H>sbit SDA=P1^5; //定义数据线sbit SCL=P1^4; //定义时钟线sbit key1= P3^2; //按键K1,暂停界面sbit key2= P3^3; //按键K2,增大sbit key3= P3^4; //按键K3,减小sbit key4= P3^5; //按键K4,下一步sbit nbdeng1=P1^0; //绿sbit nbdeng2=P1^1; //黄sbit nbdeng3=P1^2; //红sbit dxdeng1=P1^3;sbit dxdeng2=P1^6;sbit dxdeng3=P1^7;bit flag;unsigned char i1,i2,i3,i4;unsigned char w1,w2,w3,w4;unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83}; unsigned int timeout,nflag,vv,k,n,pp;int idata ucSendBuffer[4]={0,0,0,0};int idata ucReceData;void delay(void);void ACK();void NoACK();void ddelay(unsigned int );//我自己的延迟;bit ReadNByte(int sla,int suba,int *p,int n);bit WriteNByte(int sla,int suba,int *s,int n);void main(void){TMOD=0x11;TR0=1;ET0=1;//定时器中断0;TR1=1;ET1=1;//定时器中断1;IT0=1; //外部中断0;EX0=1;ET2=1; //允许定时器T2的中断//定时器T2,在方式3中断产生波特率T2CON=T2CON|0x30;SCON=SCON|0x50;PCON=0x00;TH2=0xFF;TL2=0xDC;RCAP2H=0xFF;RCAP2L=0xDC;//波特率设置为9600TR2=1; //开定时器T2运行控制位ES=1; //允许串口中断pp=0;//写入符号EA=1;timeout=1;//无关符号vv=1;//条件符号;nflag=1;//1是南北绿灯亮,2是南北黄灯亮;i1=15;i2=3;i3=15;i4=3;//倒计时数目;ReadNByte(0xa0,0x00,ucSendBuffer,4);i1=ucSendBuffer[0];i2=ucSendBuffer[1];i3=ucSendBuffer[2];i4=ucSendBuffer[3]; w1=i1;w2=i2;w3=i3;w4=i4;//通过改变w的数值来改变起点while(1){if(pp==1){WriteNByte(0xa0,0x00,ucSendBuffer,4);pp=0;}//写入,8个字节;}}void t0(void) interrupt 1 using 1//50000微秒中断一次;{TH0=(65536-50000)/256;TL0=(65536-50000)%256;timeout++;if(timeout==20)//1秒执行一次;{timeout=0;i1--;i2--;i3--;i4--;if(nflag==1&&i1==0){ i1=w1;i2=w2;i3=w3;i4=w4;nflag++;}//第一种情况的重置; if(nflag==2&&i2==0){ i1=w1;i2=w2;i3=w3;i4=w4;nflag++;}//第二种情况的重置; if(nflag==3&&i3==0){ i1=w1;i2=w2;i3=w3;i4=w4;nflag++;}//同上if(nflag==4&&i4==0){ i1=w1;i2=w2;i3=w3;i4=w4;nflag++;}//同上if(nflag==5){nflag=1;}//回到起始状态;}}void t1(void) interrupt 3 using 3//数码管扫描,3000微秒中断一次;{TH1=(65536-3000)/256;TL1=(65536-3000)%256;if(nflag==1)for(k=0;k<3;k++){ P2=0x7f; P0=table[i1/10];ddelay(20);P2=0xbf; P0=table[i1%10];ddelay(20);//南北绿灯倒计时P2=0xf7; P0=table[(i1+w2)/10];ddelay(20);P2=0xfb; P0=table[(i1+w2)%10];ddelay(20);//东西的红灯倒计时nbdeng1=0;nbdeng2=1;nbdeng3=1;dxdeng1=1;dxdeng2=1;dxdeng3=0;}if(nflag==2)for(k=0;k<3;k++){P2=0xdf; P0=table[0];ddelay(20);P2=0xef; P0=table[i2];ddelay(20);//南北的黄灯倒计时;P2=0xf7; P0=table[0];ddelay(20);P2=0xfb; P0=table[i2];ddelay(20);//东西的红灯倒计时;nbdeng1=1;nbdeng2=0;nbdeng3=1;dxdeng1=1;dxdeng2=1;dxdeng3=0;}if(nflag==3)for(k=0;k<3;k++){P2=0x7f; P0=table[(i3+w4)/10];ddelay(20);P2=0xbf; P0=table[(i3+w4)%10];ddelay(20);//南北红灯倒计时;P2=0xf7; P0=table[i3/10];ddelay(20);P2=0xfb; P0=table[i3%10];ddelay(20);//东西的绿灯倒计时nbdeng1=1;nbdeng2=1;nbdeng3=0;dxdeng1=0;dxdeng2=1;dxdeng3=1;}if(nflag==4)for(k=0;k<3;k++){P2=0x7f; P0=table[0];ddelay(20);P2=0xbf; P0=table[i4];ddelay(20);//南北红灯倒计时;P2=0xfd; P0=table[0];ddelay(20);P2=0xfe; P0=table[i4];ddelay(20);//东西的黄灯倒计时;nbdeng1=1;nbdeng2=1;nbdeng3=0;dxdeng1=1;dxdeng2=0;dxdeng3=1;}if(nflag==16)//暂停界面开启;{for(k=0;k<3;k++){P2=0xfd;P0=table[w1/10];ddelay(20);P2=0xfe;P0=table[w1%10];ddelay(20);nbdeng1=1;nbdeng2=1;nbdeng3=1;dxdeng1=1;dxdeng2=1;dxdeng3=1;}if(!key2)//按下时为零,取非为1,进入;增加{ for(n=0;n<1500;n++); w1=w1+1;i1=w1;while(!key2);for(n=0;n<1500;n++); }if(!key3)//按下时为零,取非为1,进入;减小{ for(n=0;n<1500;n++); w1=w1-1;i1=w1;while(!key3);for(n=0;n<1500;n++); }if(!key4){for(n=0;n<1500;n++); while(!key4);nflag=nflag+1;for(n=0;n<1500;n++); ucSendBuffer[0]=w1;}}if(nflag==17){for(k=0;k<3;k++){P2=0xfd;P0=table[w2/10];ddelay(20);P2=0xfe;P0=table[w2%10];ddelay(20);nbdeng1=1;nbdeng2=1;nbdeng3=1;dxdeng1=1;dxdeng2=1;dxdeng3=1;}if(!key2)//按下时为零,取非为1,进入;增加{for(n=0;n<1500;n++); w2=w2+1;i2=w2; while(!key2);for(n=0;n<1500;n++); }if(!key3)//按下时为零,取非为1,进入;减小{for(n=0;n<1500;n++); w2=w2-1;i2=w2; while(!key3);for(n=0;n<1500;n++); }if(!key4){for(n=0;n<1500;n++); while(!key4);nflag=nflag+1;for(n=0;n<1500;n++); ucSendBuffer[1]=w2;}}if(nflag==18){for(k=0;k<3;k++){P2=0xfd;P0=table[w3/10];ddelay(20);P2=0xfe;P0=table[w3%10];ddelay(20);nbdeng1=1;nbdeng2=1;nbdeng3=1;dxdeng1=1;dxdeng2=1;dxdeng3=1;}if(!key2)//按下时为零,取非为1,进入;增加{ for(n=0;n<1500;n++); w3=w3+1;i3=w3;while(!key2);for(n=0;n<1500;n++); }if(!key3)//按下时为零,取非为1,进入;减小{ for(n=0;n<1500;n++); w3=w3-1;i3=w3;while(!key3);for(n=0;n<1500;n++); }if(!key4){ for(n=0;n<1500;n++); while(!key4);nflag=nflag+1;for(n=0;n<1500;n++); ucSendBuffer[2]=w3;}}if(nflag==19){for(k=0;k<3;k++){P2=0xfd;P0=table[w4/10];ddelay(20);P2=0xfe;P0=table[w4%10];ddelay(20);nbdeng1=1;nbdeng2=1;nbdeng3=1;dxdeng1=1;dxdeng2=1;dxdeng3=1;}if(!key2)//按下时为零,取非为1,进入;增加{ for(n=0;n<1500;n++); w4=w4+1;i4=w4;while(!key2);for(n=0;n<1500;n++); }if(!key3)//按下时为零,取非为1,进入;减小{ for(n=0;n<1500;n++); w4=w4-1;i4=w4;while(!key3);for(n=0;n<1500;n++);}if(!key4){for(n=0;n<1500;n++); while(!key4);nflag=1;for(n=0;n<1500;n++);//存入EPROM中ucSendBuffer[3]=w4;pp=1;}//标志写入pp=1;}}void ddelay(unsigned int q){ q=q+20;while(q--);}key_int() interrupt 0 // 外部中断0使用中断号0{ pp=0;nflag=16;}//下列是新程序void delay(void){int i;for(i=100;i>0;i--)_nop_();}void I2C_Start(){SDA=1;delay();SCL=1;delay();SDA=0;delay();SCL=0; //钳位I2C总线,准备发送数据}void I2C_Stop(){SDA=0;delay();SCL=1;delay();SDA=1;delay();}void Ack(){SDA=0;delay();SCL=1;delay();SCL=0;delay();SDA=1;delay();}void NoAck(){SDA=1;delay();SCL=1;delay();SCL=0;delay();SDA=0;delay();}bit Test_Ack(){SCL=0;SDA=1;//读入数据_nop_();_nop_();_nop_();_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();if(SDA==0)flag=1;else flag=0;SCL=0;return(flag);}void SendData(int buffer){int BitCnt=8;//一字节8位int temp=0;do{temp=buffer;SCL=0;delay();if((temp&0x80)==0) //判断最高位是0还是1SDA=0;elseSDA=1;delay();SCL=1;temp=_crol_(buffer,1);//将buffer中的数据左移一位buffer=temp;BitCnt--;}while(BitCnt);SCL=0;}int ReceiveData(){int BitCnt=8;int temp=0;SDA=1;//读入数据do{SCL=0;delay();SCL=1;delay();if(SDA==1)ucReceData=ucReceData|0x01; //低位置1elseucReceData=ucReceData&0x0fe; //低位清0if(BitCnt-1){temp=_crol_(ucReceData,1); //数据左移一位ucReceData=temp;}BitCnt--;}while(BitCnt);SCL=0;return(ucReceData);}bit WriteNByte(int sla,int suba,int *s,int n){int i;I2C_Start();//启动I2CSendData(sla);//发送器件地址Test_Ack();// if(flag==0) return(0);SendData(suba);Test_Ack();//if(flag==0) return(0);for(i=0;i<n;i++)//写入8字节数据{SendData(*(s+i));Test_Ack();// if(flag==0) return(0);}I2C_Stop();return(1);}bit ReadNByte(int sla,int suba,int *p,int n){int i;I2C_Start();//启动I2CSendData(sla);//发送器件地址Test_Ack();//if(flag==0) return(0);SendData(suba);//发送器件内部地址Test_Ack();//if(flag==0) return(0);I2C_Start();SendData(sla+1);Test_Ack();if(flag==0) return(0);for(i=0;i<n-1;i++)//读取字节数据{*(p+i)=ReceiveData();//读取数据ACK();}*(p+n-1)=ReceiveData();NoACK();I2C_Stop();return(1); }。
西安邮电学院数字电路课程设计报告书——交通灯控制器院部名称:电子与信息学院专业名称:班级:学生姓名:20XX年12月20日至20XX年12月31实习时间:日注释:交通灯控制器是可以自动控制交通灯并以倒计时的方式显示出时间来,方便行人和车辆在通行时有条不紊的通行,达到交通井然有序,出行人员安全快捷的到达目的地的效果。
本次实验的就是想通过这样的一个实例,来结合数字电路课程的学习共同实现这样的一个应用工具,达到理论和实践相结合的目的。
一:课程设计题目:交通灯控制器二:任务和要求:设计一个十字路口控制交通秩序的交通灯,满足以下条件:1.显示顺序为其中一组方向是绿、黄、红;另一方向是红、绿、黄。
2.设置一组数码管以倒计时的方式显示语序通行或禁止通行时间,其中支通道绿灯的时间是20s,另一个方向上主通道的绿灯亮的时间是30s,黄灯亮的时间都是5s.3.选做1:当任何一个方向出现特殊情况,按下手动开关,其中一个方向通行,倒计时停止,当特殊情况结束后,按下自动控制开关恢复正常状态。
4.选做2:用两组数码管实现双向倒计时显示。
三:总体方案的选择:1.交通灯控制器功能概述:交通灯控制器是可以自动控制交通灯,以倒计时的方式显示时间。
交通灯控制器是以七段显示数码管显示时间,用发光二极管来模拟交通灯。
实现这个交通灯控制器可以采用EPROM编程、RAM编程、可编程逻辑器件、单片机等实现。
但是在这次实验中我们采用基本的数字芯片和发光二极管来实现这样的要求,采用这样的方式是:提供了这些芯片,也学习了数字电路的知识,两者的结合刚好巩固了我们对理论的加深理解。
2.交通灯亮灭和时间的确定(考虑到有四种状态,所以采用两位二进制数来控制各种状态,且二进制数用D触发器产生):00 东西红,主通道绿(30s)01 东西红,主通道黄(5s)10 东西绿,主通道红(20s)11 东西黄,主通道红(5s)3.方案的选择:本实验采用555电路,74ls161芯片,D触发器,2—4译码器和七段显示数码管的相互连接来达到控制二极管发光和数码管的显示。
数字逻辑课程设计报告——交通灯控制器学院名称:电子工程学院学生姓名:专业名称:班级:实习时间:2013年6月3日——2013年6月14日一.系统功能概述红绿灯交通信号系统为模拟实际的十字路口交通信号灯。
外部硬件电路包括:两组红黄绿灯(配合十字路口的双向指挥控制)、一组手动与自动控制开关(针对交通警察指挥交通控制使用)、倒计时显示器(显示允许通行或禁止通行时间)。
红绿灯交通信号系统外观示意图如下图所示。
一. 任务和要求1.在十字路口的两个方向上各设一组红黄绿灯,显示顺序为其中一方向是绿灯、黄灯、红灯;另一方向是红灯、绿灯、黄灯。
2.设置一组数码管,以倒计时的方式显示允许通行或禁止通行时间,其中一个方向上绿灯亮的时间是20s,另一个方向上绿灯亮的时间是黄灯绿灯黄灯绿灯30s,黄灯亮的的时间都是5s。
3.选做:当任何一个方向出现特殊情况,按下手动开关,其中一个方向常通行,倒计时停止。
当特殊情况结束后,按下自动控制开关,恢复正常状态。
三.总体思路概述从功能上,交通灯控制信号可以划分为4个独立的模块,分别为时钟产生模块、状态转换模块、计时模块、显示模块。
各功能模块的划分及相互之间的关系如下图所示。
交通灯控制系统的4个功能模块四.单元电路设计1.时钟产生模块时钟产生模块的功能是负责产生频率为1Hz的秒脉冲信号,为计时模块提供计数脉冲。
可以用来产生时钟信号的电路有很多,如石英晶体振荡器、RC振荡器、555多谐振荡器等,可以根据频率稳定度和精确度要求选择使用。
我们用的是555多谐振荡器。
如图:4.7uf555多谐振荡器2.状态转换模块状态转换模块的功能是控制两个方向上信号灯状态的转换。
通常十字路口的交通要道分为主干道和支干道,主干道的通行时间要大于支干道的通行时间。
这里定义主干道的通行时间为30秒,支干道的通行时间为20秒,准备禁止时间为5秒。
根据主干道和支干道的通行状况可以分为4种状态。
S0:主干道通行30秒,支干道禁行30秒。
西安邮电学院电子设计报告书——交通灯控制器学院名称:通信与信息工程学院学生姓名:顾宝亮(08)专业名称:通信工程系精心整理班级:通工0909实习时间:2011年12月5日—— 2011年12月16日一.设计题目:交通灯控制灯交通灯控制器是可以自动控制交通灯,并以倒计时的方式显示出时间,方便行人和车辆在通行时有条不紊的通行,达到交通井然有序,出行人员精心整理精心整理 安全快捷的到达目的地的效果。
本次实验的就是想通过这样的一个实例,来结合数字电路课程的学习共同实现这样的一个应用工具,达到理论和实践相结合的目的。
二 任务和要求红绿灯交通信号系统外观示意图如图1所示。
倒计数 计时器绿灯 黄灯红灯红 黄 绿灯 灯 灯设计一个十字路口控制交通秩精心整理序的交通灯,满足以下条件:1.显示顺序为其中一组方向是绿、黄、红;另一方向是红、绿、黄。
设置一组数码管以倒计时的方式显示语序通行或禁止通行时间,其中支通道绿灯的20s,另一个方向上主通道的绿灯亮的时间是30s,黄灯精心整理亮的时间都是5s. 2.选做:当任何一个方向出现特殊情况,按下手动开关,其中一个方向通行,倒计时停止,当特殊情况结束后,按下自动控制开关恢复正常状态。
三、总体方案在一个有主、支干道的十字路口,主、支干道各设置一精心整理组红、黄、绿三色的交通灯。
红灯亮表示禁止通行,绿灯亮表示可以通行。
在绿灯变为红灯之前,黄灯先亮5秒,以提示未通行的车辆准备停车。
由于主干道车辆较多,所以要求主干道处于通行状态的时间长一些,设为30秒;而支干道通行时间为20秒。
(1)主要功能为:1.实现红绿灯的交通管制功能;精心整理2.在红绿灯交换的前5秒,由黄灯提示司机注意,准备停车,且此时绿灯熄灭;3.可适应主次干道不同的车流量的需要,拟设计主干道的车辆通行时间为30秒,支干道的车辆通行时间为20秒;4.采用倒计时的方式,提示司机剩余时间。
精心整理(2)简单原理如下:由555时钟信号发生电路产生稳定的“秒”脉冲信号,确保整个电路装置计时工作稳定进行。
交通灯 实验目的:1.掌握时序逻辑电路的设计方法,灵活运用理论知识。
2.提高学生的数字系统设计能力和实际动手能力。
3.进一步了解如何将数字电路设计应用到自动控制系统中,从而提高解决实 际问题的能力。
4.为学习和使用计算机打下良好的基础。
实验内容:用中小规模逻辑器件设计交通灯控制电路。
实验要求:1.设计一个十字路口的交通灯控制电路,要求东西方向和南北方向车道两条交叉道路上的车辆交替运行。
在十字路口的两个方向上各设一组红、黄、绿灯,红灯(图1)。
表示禁止通行,绿灯表示可以通行。
2.设置一组数码管,以倒计时的方式显示允许通行或禁止通行时间,其中一个方向上绿灯亮的时间是20s ,另一个方向上绿灯亮的时间是30s ,黄灯亮的的时间都是5s 。
3.当任何一个方向出现特殊情况,按下手动开关,其中一个方向常通行,倒计时停止。
当特殊情况结束后,按下自动控制开关,恢复正常状态。
图1实验所用的器材:主要芯片数量/个其他器材 数量/个 74LS161 3 数码管 2 74LS48 2 二极管 6 74LS04 3 限流电阻 3 74LS0014.7uF 电容1倒计数 计时器绿灯黄灯 红灯红 黄 绿灯 灯 灯交通灯控制系统主要由控制器、译码器和秒脉冲信号发生器等器件组成。
其系统框图如图2。
秒脉冲发生器是该系统中定时器和控制器的标准时钟信号源,译码器输出两组信号灯的控制信号,经驱动电路后驱动信号灯工作,控制器是系统的主要部分,由它控制译码器的工作。
图2 交通灯控制系统的原理框图时钟信号产生电路主要由555定时器组成震荡器,产生稳定的脉冲信号,送到状态产生电路,状态产生电路根据需要产生一定的“0” 、“1 ”信号。
这些信号通过时间显示电路转化成时间信号,在通过数码管显示时间。
同时这些信号通过交通灯显示电路转化成6个独立的交通灯信号,用二极管代替交通灯,实现红绿黄灯之间的转换。
根据设计主、支干道信号一次循环需要60个信号,所以用2个74LS161级联实现,U1代表低位芯片,U2代表次高位芯片,取反码容易实现后面的时间显示代码,以进行倒计时,其真值表如图所示。
西安邮电学院数字电子课程设计报告书——交通信号灯控制器院系名称:自动化学院学生姓名:专业名称:智能科学与技术班级:实习时间:2011年6月20日至2011年7月1日一、设计任务1.课程性质数字逻辑课程设计2.课程目的训练学生综合所学的《数字逻辑》的基本知识,包括熟悉集成电路的引脚安排,各芯片的逻辑功能及使用方法,了解面包板结构及其接线方法,通过使用Proteus仿真技术,独立完整地设计一定功能的电子电路,以及仿真和调试的综合功能。
3.交通灯功能概述红绿灯交通信号系统为模拟实际的十字路口交通信号灯。
外部硬件电路包括:两组红黄绿灯(配合十字路口的双向指挥控制)、一组手动与自动控制开关(针对交通警察指挥交通控制使用)、倒计时显示器(显示允许通行或禁止通行时间)。
4.设计要求(1)在十字路口的两个方向上各设一组红黄绿灯,显示顺序为其中一方向是绿灯、黄灯、红灯;另一方向是红灯、绿灯、黄灯。
(2)设置一组数码管,以倒计时的方式显示允许通行或禁止通行时间,其中一个方向上绿灯亮的时间是20s,另一个方向上绿灯亮的时间是30s,黄灯亮的的时间都是5s。
(3)选做:当任何一个方向出现特殊情况,按下手动开关,其中一个方向常通行,倒计时停止。
当特殊情况结束后,按下自动控制开关,恢复正常状态。
(4)选做:用两组数码管,实现双向倒计时显示。
二、设计思路1. 1Hz脉冲信号产生电路由于设计需要,八位数码管需要每隔一秒变动一次,所以采用555芯片产生1Hz脉冲信号输出,作为数码管控制部分的输入。
2. LED控制部分在实际情况下,一个十字路有一个主干道和一个支干道。
主干道的车流量较大,即要求主干道绿灯亮的时间长,支干道正好相反。
可以得出:R = Q2 r = Q2~Y = Q1&(Q2~) y = Q1&Q2G = (Q1~)&(Q2~) g = (Q1~)&Q23. 数码管控制部分用74LS48驱动数码管,为实现倒计时,则需要74LS161通过非门与74LS48芯片连接,1Hz的脉冲信号输入到74LS161。
西安邮电学院数字电路课程设计报告书——交通灯控制器学院名称:电子工程学院学生姓名:陈启超(07)专业名称:光电信息工程班级:0903实习时间:2011年12月19日——2011年12月30日题目:数字电路逻辑设计-交通灯一实验目的1.掌握系统设计一般步骤和方法,掌握一个大的系统中各子系统之间的相互作用和相互制约关系。
2.运用数字电路理论知识自行设计并实现一个较为完整的小型数字系统。
通过系统设计、软件仿真、电路安排与调试、写实习报告等环节,初步掌握工程设计的具体步骤和方法,提高分析问题和解决问题的能力,提高实际应用水平。
3.学会用中规模器件设计一个符合要求的系统,并熟悉常用中规模器件的用法。
4.学会按照电路图在面包板上合理布局使各器件在系统中的连线更简单,清晰。
学会使用面包板,从实际的操作中,锻炼自己的动手能力和解决际问题的能力二实验要求在一个具有主、支干道的十字路口,设计一个交通灯的自动控制电路。
实验的具体的要求是:主干道和支干道交替同行,先是主干道的绿灯亮30s,支干道是红灯;然后是主干道黄灯亮5s,支干道是红灯;之后是支干道的绿灯亮20s,主干道是红灯;最后是支干道的黄灯亮5s,主干道是红灯亮。
总体上电路的设计思路就是主干道和支干道交替,循环的运行。
三 使用元件四 总体方案的设计五单元电路的设计(1)主控制电路利用一片161和一片139来实现主电路的控制功能,主要是通过给161的4个输入端置数为0000,从而使它的输出端Q1Q0=00-01-10-11来使139的Y3Y2Y1Y0=1110-1101-1011-0111的状态的变化来实现交通灯4种状态的变化,而且在倒计时电路反馈回来的高电平才能使它的状态发生一次变化,而且它的每一个状态的变化都能够控制倒计时电路的变化和发光二极管的变化。
所以是把161设计成一个模4的计数器作为主控制电路部分。
(2)脉冲产生电路主要是通过555芯片设计一个能产生一个以一秒为周期的脉冲电路,正确的把4.7K和150K的电阻以及0.1uF的电容和4.7uF的电容接入电路中产生一秒的连续脉冲。
西安邮电学院数字电路课程设计报告书—交通灯控制器学院名称:计算机学院学生姓名:张晓洁(07)专业名称:计算机科学与技术班级:计科0803实习时间:2010年12月6日—2010年12月17日一、 课程设计题目:交通灯控制器二、 设计任务和要求:1.在十字路口的两个方向上各设一组红黄绿灯,显示顺序为其中一方向是绿灯、黄灯、红灯;另一方向是红灯、绿灯、黄灯。
2.设置一组数码管,以倒计时的方式显示允许通行或禁止通行时间,其中一个方向上绿灯亮的时间是20s ,另一个方向上绿灯亮的时间是30s ,黄灯亮的的时间都是5s 。
3.选做:当任何一个方向出现特殊情况,按下手动开关,其中一个方向常通行,倒计时停止。
当特殊情况结束后,按下自动控制开关,恢复正常状态。
4. 选做:用两组数码管,实现双向倒计时显示三、 总体方案及单元电路设计:从功能上,交通灯控制系统可以划分为四个相对独立的模块,分别为时钟产生模块、状态转换模块、计时模块、显示模块。
所需器件:面包版1个、芯片555 1个、74LS74 1个、74LS08 1个、74LS00 1个、74LS163 1个、74LS04 2个、74LS48 2个、4.7k Ω电阻1个、150k Ω电阻1个、0.01µf电容1个、4.7µf电容1个、100Ω电阻4个、二极管6个。
交通灯控制系统设计的基本框图:时基电路 20秒倒计时5秒倒计时30秒倒计时 主控电路译码电路绿 黄 红(主) 绿 黄 红(支)交通灯控制系统的四个功能模块:1.时钟产生模块:负责产生频率为1Hz的稳定秒脉冲信号,确保整个电路装置同步工作和实现定时控制,为计时模块提供计数脉冲。
通过555芯片按一定的线路接上不同的电阻和电容就可产生周期不同的方波脉冲,即不同的频率脉冲。
课程设计需要秒脉冲,利用的2个电容(0.01µf和4.7µf)和2个电阻(150k Ω和4.7kΩ)。
西安邮电学院数字电路课程设计报告书——交通灯控制器学院名称:学生姓名:专业名称:班级:实习时间:一、设计题目:交通灯控制器交通灯控制器是可以自动控制交通灯,并以倒计时的方式显示出时间,方便行人和车辆在通行时有条不紊的通行,达到交通井然有序,出行人员安全快捷的到达目的地的效果。
本次实验的就是想通过这样的一个实例,来结合数字电路课程的学习共同实现这样的一个应用工具,达到理论和实践相结合的目的。
二、设计要求:设计一个十字路口控制交通秩序的交通灯,满足以下条件:显示顺序为其中一组方向是绿、黄、红;另一方向是红、绿、黄。
设置一组数码管以倒计时的方式显示语序通行或禁止通行时间,其中支通道绿灯的时间是20s,另一个方向上主通道的绿灯亮的时间是30s,黄灯亮的时间都是5s.选做:当任何一个方向出现特殊情况,按下手动开关,其中一个方向通行,倒计时停止,当特殊情况结束后,按下自动控制开关恢复正常状态。
三、设计思路概述:1.任务分析:交通灯控制器主要实现两部分功能:①东西、南北双向通路的红、绿、黄灯控制;②东西向主通路的倒计时显示。
另外,在此设计中还实现了紧急情况下的强制中断功能。
2.实现方案:实现这个交通灯控制器可以采用PLD 、FPGA 、单片机等可编程器件或基本数字逻辑器件实现。
在这次实验中采用74系列数字集成芯片和555时基芯片实现相应功能,在本报告的最后附有用Atmel 公司89C52实现同样功能的电路设计图及C51程序。
3.具体功能分析:此电路为十字路口交通灯控制电路,要求东西向和南北向不能同时出现绿(黄)灯,发生“撞车”现象。
即当某一方向为绿灯或黄灯时,另一方向必为红灯。
东西向主通路有倒计时显示。
设计时序如下: 东西向 南北向4.电路框图设计:说明:脉冲输出部分为555时基芯片构成的多次谐波振荡器,由其产生周期为1s 的时钟脉冲信号。
计时控制部分主要由两片74LS161(十六进制同步加法计数器)、74LS74(边沿D 触发器)及逻辑门电路构成。
产生30s 、20s和5s 的倒计时信号。
彩灯控制部分将计时控制部分输出的信号通过逻辑门电路及74LS139(双2—4线译码器)产生控制信号,控制彩灯按照响应时序显示,并将74LS139的输出信号反馈回计时控制部分实现三种倒计时之间的切换。
数字显示部分主要由74LS48(7段显示译码器)、74LS04(反相器)及8段共阴极数码管构成,通过接入计时控制部分的信号实现倒计时显示。
四、单元电路设计:1.脉冲输出部分:脉冲输出部分为555时基芯片构成的多次谐波震荡器,电路原理图如右:其中器件参数分别为R1=4.7kΩ,R2=150kΩ,C1=4.7μF,C2=0.01μF。
产生的时钟脉冲为周期T=1s的方波。
电容C1充电时,暂稳态持续时间为t w1=0.7(R1+R2)C=0.7×(150k+4.7k) ×4.7μ≈0.5s电容C1放电时,暂稳态持续时间为t w2=0.7R2C=0.7×150k×4.7μ≈0.5s因此,电路输出矩形脉冲的周期为T= t w1+t w2≈1s输出占空比为q= t w1/T≈50%2.计时控制部分:通过两片74LS161级联实现最大模值为256的加法计数功能,用低位片U2的输出口RCO控制高位片U3的使能端ENT,即低位片U2产生进位信号后高位片开始工作。
由于主通路(东西向)交通灯时序为红灯30s、绿灯20s、黄灯5s,故此子系统应实现模30计数、模20计数和模5计数间的切换,亦即低位片模值为10—10—5的切换,高位片模值为3—2—0的切换。
在具体电路实现过程中,采用74LS74芯片控制高位片的数据置入,并利用彩灯控制部分的输出控制低位片数据的置入。
由于数字显示部分要求倒计时显示,故置入数据时取数码管相应显示码值的反码,具体数据表格见数字显示部分。
在此电路中,开关SW2、SW1分别控制高、低位片的强制置数,当SW2、SW1接低电平时,若SW3接高电平,高位片被强制置入数据1111,低位片通过彩灯控制部分的反馈信号被置入数据1011。
此时,将SW2、SW1接高电平,计数开始,进入有效循环前5s的偏离态。
当低位片进位后,高、低位片进位端均为1,U9A输出端为1,U6C、U6D输出端为0,即高、低位片LOAD端为0,实现置数功能。
高位片置入数据为,,当高低位片同时产生进位信号,74LS74产生上升沿,即每次倒计时完毕后进行置数。
低位片置入数据由黄灯亮\灭控制,当黄灯亮时置入数据为1011,黄灯灭时置入数据为0110。
计时系统与东西向主通路交通灯亮\灭情况真值表如下:3.彩灯控制\显示部分:彩灯控制部分分两路实现,东西向(主通路)彩灯由于时序与倒计时相同,故不需另加单独的计数电路,只需用门电路和译码器等器件将计数部分中的信号引致彩灯。
南北向时序与东西向不同,故另外用一片74LS161控制,具体设计如下:Ⅰ.东西向:计数控制部分高位片的置数端D0、D1分别接到74LS139的A、B端子,其输出端Y1、Y2、Y3分别接红、绿、黄灯。
当高位片置入数据为1110,低位片置入数据为0110,即倒计时20s时,74LS139的A、B端分别为0、1,此时输出数据为1011,即绿灯亮。
同理,当高位片置入数据为1111,低位片置入数据为1011,即倒计时5s时,74LS139的A、B端分别为1、1,此时输出数据为0111,即黄灯亮;当高位片置入数据为1101,低位片置入数据为0110,即倒计时30s时,74LS139的A、B端分别为1、0,此时输出数据为1101,即红灯亮。
Ⅱ.南北向南北向彩灯由东西向彩灯和另一片74LS161(U12)单独控制。
U12的ENP、ENT、LOAD全部接高电平,即禁止置数,MR端子接Q0(高)Q1(高)Y1(74LS39)相与的输出。
设计思路如下:由时序图可知,当东西向红灯亮且高位片为0,即南北向红灯倒计时至10s时,U12开始计数,当红东西向灯熄灭时计数停止,共计数10s,通过逻辑门电路组合可以实现使其前5s输出为1,后5s输出为0,即后5s时南北向黄灯亮。
当10s计时结束后,南北向应变为红灯,而此时东西向先持续5s黄灯后持续25s绿灯,故南北向红灯接东西向黄、绿灯信号相与的结果。
U12(74LS161)计数输出与南北向黄灯亮灭真值表如下:U12(74LS161)OUTPUT Q3 Q2 Q1 Q00 0 0 0 10 0 0 1 10 0 1 0 10 0 1 1 10 1 0 0 10 1 0 1 00 1 1 0 00 1 1 1 01 0 0 0 01 0 0 1 01 0 1 0 01 0 1 1 01 1 0 0 01 1 0 1 01 1 1 0 01 1 1 1 0注:OUTPUT=0时黄灯亮;OUTPUT=1时黄灯灭。
化简得:。
实现电路如上图所示。
南北向绿灯的控制信号为南北向红灯和黄灯的与非,即红灯和黄灯均不亮时绿灯亮。
4.强制中断系统:当出现紧急情况时,交通灯应具有强制某路通行或中断的功能。
在此系统中,如出现紧急情况,断开“紧急中断”开关(见总电路图),即切断CP脉冲输入,计时停止,此时将SW4接高电平,SW5接低电平,东西向强制通行;反之,若将SW5接高电平,SW4接低电平,南北向强制通行。
5.数字显示部分:由74LS48(7段显示译码器)真值表可知,要实现9~0倒计时可通过置入0110取反后得到,真值表如下:74LS161(OUTPUT)74LS48(INPUT)Character Q3 Q2 Q1 Q0 A3 A2 A1 A00 1 1 0 1 0 0 1 90 1 1 1 1 0 0 0 81 0 0 0 0 1 1 1 71 0 0 1 0 1 1 0 61 0 1 0 0 1 0 1 51 0 1 1 0 1 0 0 41 1 0 0 0 0 1 1 31 1 0 1 0 0 1 0 21 1 1 0 0 0 0 1 11 1 1 1 0 0 0 0 06.元器件列表:五、总体电路图:六、电路组装完成后,实际测量的各个单元电路的输入、输出信号波形:电路组装调试完成后,测得各单元电路输入输出如下:1.脉冲输出部分:输入:+5V直流电压信号。
输出:周期T≈1s,占空比q=50%的矩形波。
2.计时控制部分:输入、输出高电平时大于4V,低电平小于0.3V,符合要求,且无逻辑错误。
3.彩灯控制\显示部分:输入、输出高电平时大于4V,低电平小于0.3V,符合要求,且无逻辑错误。
4.数字显示部分:输入、输出高电平时大于4V,低电平小于0.3V,符合要求,且无逻辑错误。
七、电路组装、调试过程中发生的问题及解决的方法:1.出现错误电平故障现象:计时控制部分独立工作时正常,接入彩灯控制\显示部分反馈后出现逻辑错误。
检查步骤:(1)检查电路各部分电气连接是否正常,无短路和开路现象;(2)检测距后级输出最近的端口电压,发现74LS161部分端口出现1~2V的错误电平;(3)沿信号流向逆向检查电平值,发现错误电平为彩灯控制\显示部分反馈引入;(4)分析故障原因,发光二极管正极接高电平(+5V),由于二极管导通压降近似为0.7V,限流电阻仅为33Ω,分压能力有限,导致所取的反馈信号出现错误电平。
解决方案:将33Ω电阻改换为100Ω,错误逻辑消失,重新检测各点电平值,均符合要求。
2.数字显示部分显示结果混乱故障现象:将计时部分和数字显示部分连接完后,发现数码管显示字符为乱码,且无一定规律。
检查步骤:(1)检查电路各部分电气连接是否正常,部分管脚接触不良,按压芯片,使其完全解除故障仍未解除;(2)检测各输入、输出端口电压,部分管脚出现错误电平;(3)分析错误电平产生原因,无反馈回路,反相器输入正常,输出为错误电平,疑是74LS04反相器芯片自身故障。
解决方案:更换故障芯片,数码管显示正常,重新检测各点电平值,无错误电平出现。
九、心得体会在本次课程设计中,我主要认识到如下几个问题:1.理论知识与实际操作存在差异,如利用555构成多谐振荡器时,将器件参数套用公式进行理论计算得到周期T=1s,但在实际操作时发现此处存在较大误差,周期明显小于1s;又如理论规定逻辑高电平和逻辑低电平分别为3V和0.35V,但实际操作中发现一般大于2.5V 的电平均可看作高电平,不会出现逻辑错误,而低电平上限也可达到0.5V左右。