求单片机交通灯控制系统设计的程序(最后有中文解析)

求单片机交通灯控制系统设计的程序(最后有中文解析),第1张

要求:

1、一路延时60S,

一路延时40S

(演示时为节省时间,一路延时15S,一路延时10S>>

两路时间分别用不同的数码管显示;

--相同的,即可。

--比如:

--东西绿灯、南北红灯,两个方向的数字显示,都是60s倒计时。

--东西红灯、南北绿灯,两个方向的数字显示,都是40s倒计时。

--两路时间虽然不同,数码管显示应该是相同的,完全可以用一组数码管显示。

2.紧急通行控制,如某一方向现为红灯,通过按键强行切换为绿灯,而另一路改为红灯,延时若干秒(10S)后,恢复原状态(红灯)继续倒数

--不应恢复原状态。

--比如:

--东西绿灯、南北红灯,两个方向的数字显示,都是60s倒计时。

--在 59s 时,即仅仅剩下 1s 时,被强制转换了红绿灯。

--那么 10s 后,再恢复原状态 ?

--原状态,仅仅有 1s,还恢复它干什么 ?

--这时间,可能,都不够汽车起步用的。

--恢复原来的半截状态,显然不合理。

一 实验目的

1. 了解交通灯的亮灭规律。

2. 了解交通灯控制器的工作原理。

3. 熟悉VHDL语言编程,了解实际设计中的优化方案。

二 硬件需求

1.EDA/SOPC实验箱一台。

三 实验原理

交通灯的显示有很多方式,如十字路口、丁字路口等,而对于同一个路口又有很多不同的显示要求,比如十字路口,车子如果只要东西和南北方向通行就很简单,而如果车子可以左右转弯的通行就比较复杂,本实验仅针对最简单的南北和东西直行的情况。

要完成本实验,首先必须了解交通路灯的亮灭规律。本实验需要用到实验箱上交通灯模块中的发光二极管,即红、黄、绿各三个。依人们的交通常规,“红灯停,绿灯行,黄灯提醒”。其交通灯的亮灭规律为:初始态是两个路口的红灯全亮,之后东西路口的绿灯亮,南北路口的红灯亮,东西方向通车,延时一段时间后,东西路口绿灯灭,黄灯开始闪烁。闪烁若干次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北方向开始通车,延时一段时间后,南北路口的绿灯灭,黄灯开始闪烁。闪烁若干次后,再切换到东西路口方向,重复上述过程。

在实验中使用8个七段码管中的任意两个数码管显示时间。东西路和南北路的通车时间均设定为20s。数码管的时间总是显示为19、18、17……2、1、0、19、18……。在显示时间小于3秒的时候,通车方向的黄灯闪烁。

四 实验内容

本实验要完成任务就是设计一个简单的交通灯控制器,交通灯显示用实验箱的交通灯模块和七段码管中的任意两个来显示。系统时钟选择时钟模块的1KHz时钟,黄灯闪烁时钟要求为2Hz,七段码管的时间显示为1Hz脉冲,即每1s中递减一次,在显示时间小于3秒的时候,通车方向的黄灯以2Hz的频率闪烁。系统中用S1按键进行复位。

五 实验步骤

完成交通灯控制器的实验步骤如下:

1.首先打开Quartus II软件,新建一个工程,并新建一个VHDL File。

2.按照自己的想法,编写VHDL程序.

3.对自己编写的VHDL程序进行编译并仿真。

4.仿真无误后,根据附录一的引脚对照表,对实验中用到时钟、七段码显示及交通灯模块的LED对应的FPGA引脚进行管脚绑定,然后再重新编译一次。

5.用下载电缆通过JTAG接口将对应的sof文件下载到FPGA中。

6.观察交通灯控制器的工作是否满足实验要求。

注意:此实验需管脚复用

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

library ieee

use ieee.std_logic_1164.all

use ieee.std_logic_arith.all

use ieee.std_logic_unsigned.all

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

entity exp18 is

port( Clk : in std_logic --时钟输入

Rst : in std_logic --复位输入

R1,R2 : out std_logic --红灯输出

Y1,Y2 : out std_logic --黄灯输出

G1,G2 : out std_logic --绿灯输出

Display : out std_logic_vector(7 downto 0) --七段码管显示输出

SEG_SEL : buffer std_logic_vector(2 downto 0) --七段码管扫描驱动

)

end exp18

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

architecture behave of exp18 is

signal Disp_Temp : integer range 0 to 15

signal Disp_Decode : std_logic_vector(7 downto 0)

signal SEC1,SEC10: integer range 0 to 9

signal Direction : integer range 0 to 15

signal Clk_Count1: std_logic_vector(9 downto 0) --产生0.5Hz时钟的分频计数器

signal Clk1Hz: std_logic

signal Dir_Flag : std_logic --方向标志

begin

process(Clk)

begin

if(Clk'event and Clk='1') then

if(Clk_Count1<1000) then

Clk_Count1<=Clk_Count1+1

else

Clk_Count1<="0000000001"

end if

end if

end process

Clk1Hz<=Clk_Count1(9)

process(Clk1Hz,Rst)

begin

if(Rst='0') then

SEC1<=0

SEC10<=2

Dir_Flag<='0'

elsif(Clk1Hz'event and Clk1Hz='1') then

if(SEC1=0) then

SEC1<=9

if(SEC10=0) then

SEC10<=1

else

SEC10<=SEC10-1

end if

else

SEC1<=SEC1-1

end if

if(SEC1=0 and SEC10=0) then

Dir_Flag<=not Dir_Flag

end if

end if

end process

process(Clk1Hz,Rst)

begin

if(Rst='0') then

R1<='1'

G1<='0'

R2<='1'

G2<='0'

else --正常运行

if(SEC10>0 or SEC1>3) then

if(Dir_Flag='0') then --横向通行

R1<='0'

G1<='1'

R2<='1'

G2<='0'

else

R1<='1'

G1<='0'

R2<='0'

G2<='1'

end if

else

if(Dir_Flag='0') then --横向通行

R1<='0'

G1<='0'

R2<='1'

G2<='0'

else

R1<='1'

G1<='0'

R2<='0'

G2<='0'

end if

end if

end if

end process

process(Clk1Hz)

begin

if(SEC10>0 or SEC1>3) then

Y1<='0'

Y2<='0'

elsif(Dir_Flag='0') then

Y1<=Clk1Hz

Y2<='0'

else

Y1<='0'

Y2<=Clk1Hz

end if

end process

process(Dir_Flag)

begin

if(Dir_Flag='0') then --横向

Direction<=10

else--纵向

Direction<=11

end if

end process

process(SEG_SEL)

begin

case (SEG_SEL+1) is

when "000"=>Disp_Temp<=Direction

when "001"=>Disp_Temp<=Direction

when "010"=>Disp_Temp<=SEC10

when "011"=>Disp_Temp<=SEC1

when "100"=>Disp_Temp<=Direction

when "101"=>Disp_Temp<=Direction

when "110"=>Disp_Temp<=SEC10

when "111"=>Disp_Temp<=SEC1

end case

end process

process(Clk)

begin

if(Clk'event and Clk='1') then--扫描累加

SEG_SEL<=SEG_SEL+1

Display<=Disp_Decode

end if

end process

process(Disp_Temp) --显示转换

begin

case Disp_Temp is

when 0=>Disp_Decode<="00111111" --'0'

when 1=>Disp_Decode<="00000110" --'1'

when 2=>Disp_Decode<="01011011" --'2'

when 3=>Disp_Decode<="01001111" --'3'

when 4=>Disp_Decode<="01100110" --'4'

when 5=>Disp_Decode<="01101101" --'5'

when 6=>Disp_Decode<="01111101" --'6'

when 7=>Disp_Decode<="00000111" --'7'

when 8=>Disp_Decode<="01111111" --'8'

when 9=>Disp_Decode<="01101111" --'9'

when 10=>Disp_Decode<="01001000" --'='

when 11=>Disp_Decode<="00010100" --'||'

when others=>Disp_Decode<="00000000" --全灭

end case

end process

end behave


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11190726.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存