5、交通灯控制器的设计?
设计任务
1)设计一个十字路口的交通灯控制电路,要求南北方向(主干道)车道和东西方向(支干道)车道两条交叉道路上的车辆交替运行,主干道每次通行时间都设为30秒、支干道每次通行间为20秒,时间可设置修改。
2)在绿灯转为红灯时,要求黄灯先亮5秒钟,才能变换运行车道;
3)黄灯亮时,要求每秒闪亮一次。
4)东西方向、南北方向车道除了有红、黄、绿灯指示外,每一种灯亮的时间都用显示器进行显示(采用计时的方法)。
5)一道有车而另一道无车(实验时用开关 K0 和 K1 控制),交通灯控制系统能立即让有车道放行。
6)有紧急车辆要求通过时,系统要能禁止普通车辆通行,A、B道均为红灯,紧急车由K2 开关模拟。
1.
任务与要求
设计一个十字路口的红、绿、黄三色信号交通灯控制电路,具体要求如下:
1)用红、绿、黄三色发光二极管作信号灯。主干道为东西向,有红、绿、黄三个灯;支干道为南北向,也有红、绿、黄三个灯。红灯亮禁止通行;绿灯亮允许通行;黄灯亮则给行驶中的车辆有时间停靠到禁行线之外。
2)由于主干道车辆较多而支干道车辆较少,所以主干道绿灯时间较长。当主干道允许通行亮绿灯时,支干道亮红灯。而支干道允许通行亮绿灯时,主干道亮红灯,两者交替重复。主干道每次放行50s,支干道每次放行30s。
在每次由亮绿灯变成亮红灯的转换过程中间,需要亮5s的黄灯作为过渡,以使行驶中的车辆有时间停靠到禁行线以外。
3)能实现正常的、即时显示功能,用实验箱上的4个七段数码管作为到计时显示器,分别显示东西、南北方向的红灯、绿灯、黄灯时间。
4)能实现特殊状态的功能显示,设S为特殊状态的传感器信号,当S=1时,进入特殊状态。当S=0时,退出特殊状态。按S后,能实现特殊状态功能:
(1)
显示器闪烁;
(2)
计数器停止计数并保持在原来的数据;
(3)
东西、南北路口均显示红灯状态;
(4)
特殊状态结束后,能继续对时间进行计数。
5)能实现控制器总清零功能
按下R后,系统实现总清零,计数器由初始状态开始计数,对应状态的指示灯亮。
2.根据设计任务与要求,画出设计总电路图,写出设计报告
---------------------------东西方向绿灯灭,黄灯亮,南北方向仍然红灯
---------------------------南北方向绿灯,而东西方向红灯--------
library ieee
use ieee.std_logic_1164.all
use ieee.std_logic_unsigned.all
use ieee.std_logic_arith.all
entity jiaotongLED is
generic(-----------------------------------定义灯亮的时间
east_green_cnt:integer:=40------------东西方向主干道绿灯
east_yellow_cnt:integer:=5------------东西方向主干道黄灯
south_green_cnt:integer:=30-----------南北方向支干道绿灯
south_yellow_cnt:integer:=5-----------南北方向支干道黄灯
exi_cnt:integer:=120)-----------------紧急车辆通行时间
port(clk:in std_logic
rst:in std_logic----------------------复位信号
exi_sign:in std_logic-----------------紧急车辆信号
east_green_led:out std_logic
east_yellow_led:out std_logic
east_red_led:out std_logic
south_green_led:out std_logic
south_yellow_led:out std_logic
south_red_led:out std_logic)
end jiaotongLED
------------------------------------
architecture ex of jiaotongLED is
type states is(s0,s1,s2,s3,s4)
signal state1:states:=s0
signal state:states:=s0
signal cnt:integer range 0 to 150
signal save_cnt:integer
signal enable_cnt:std_logic:='0'
begin
-----------------------------------------
u1:process(rst,clk)-----------------------------信号灯的时间状态的转换
begin
if rst='1' then-----------------------------判断是否按下复位
state<=s0
cnt<=1
elsif clk'event and clk='1' then
if enable_cnt='1' then
cnt<=cnt+1
else
cnt<=1
end if
case state is
when s0=>
if exi_sign='1' then----------------判断是否紧急车辆
save_cnt<=cnt
state1<=s0
state<=s4
elsif(cnt=east_green_cnt)then
state<=s1
else
state<=s0
end if
when s1=>
if exi_sign='1' then
save_cnt<=cnt
state1<=s1
state<=s4
elsif(cnt=east_yellow_cnt)then
state<=s2
else
state<=s1
end if
when s2=>
if exi_sign='1' then
save_cnt<=cnt
state1<=s2
state<=s4
elsif(cnt=south_green_cnt)then
state<=s3
else
state<=s2
end if
when s3=>
if exi_sign='1' then
save_cnt<=cnt
state1<=s3
state<=s4
elsif(cnt=south_yellow_cnt)then
state<=s0
else
state<=s3
end if
when s4=>
if(cnt=exi_cnt)then
cnt<=save_cnt
state<=state1
end if
end case
end if
end process u1
---------------------------------------------------
u2:process(state)--------------------------------------信号灯的状态显示
begin
case state is
when s0=>
east_green_led<='1'
east_yellow_led<='0'
east_red_led<='0'
south_green_led<='0'
south_yellow_led<='0'
south_red_led<='1'
enable_cnt<='1'
if(cnt=east_green_cnt)then
enable_cnt<='0'-----------------------已达到东西方向绿灯亮时间,暂停计数
end if
when s1=>
east_green_led<='0'
east_yellow_led<='1'
east_red_led<='0'
south_green_led<='0'
south_yellow_led<='0'
south_red_led<='1'
enable_cnt<='1'
if(cnt=east_yellow_cnt)then
enable_cnt<='0'
end if
when s2=>
east_green_led<='0'
east_yellow_led<='0'
east_red_led<='1'
south_green_led<='1'
south_yellow_led<='0'
south_red_led<='0'
enable_cnt<='1'
if(cnt=south_green_cnt)then
enable_cnt<='0'
end if
when s3=>
east_green_led<='0'
east_yellow_led<='0'
east_red_led<='1'
south_green_led<='0'
south_yellow_led<='1'
south_red_led<='0'
enable_cnt<='1'
if(cnt=south_yellow_cnt)then
enable_cnt<='0'
end if
when s4=>
east_green_led<='0'
east_yellow_led<='0'
east_red_led<='1'
south_green_led<='0'
south_yellow_led<='0'
south_red_led<='1'
enable_cnt<='1'
if(cnt=exi_cnt)then
enable_cnt<='0'
end if
end case
end process u2
end ex
程序已经运行仿真过,应该没有问题,另外加了一个2min紧急车辆的通行时间,不需要的话可以删掉。。。。。
引言
EDA技术是用于电子产品设计中比较先进的技术,可以代替设计者完成电子系统设计中的大部分工作,而且可以直接从程序中修改错误及系统功能而不需要硬件电路的支持,既缩短了研发周期,又大大节约了成本,受到了电子工程师的青睐。
实现路口交通灯系统的控制方法很多,可以用标准逻辑器件、可编程序控制器PLC、单片机等方案来实现。但是这些控制方法的功能修改及调试都需要硬件电路的支持,在一定程度上增加了功能修改及系统调试的困难。因此,在设计中采用EDA技术,应用目前广泛应用的VHDL硬件电路描述语言,实现交通灯系统控制器的设计,利用MAXPLUSⅡ集成开发环境进行综合、仿真,并下载到CPLD可编程逻辑器件中,完成系统的控制作用。
交通灯系统控制器设计要求
路口交通灯控制系统与其他控制系统一样,划分为控制器和受控电路两部分。控制器使整个系统按设定的工作方式交替指挥车辆及行人的通行,并接收受控部分的反馈信号,决定其状态转换方向及输出信号,控制整个系统的工作过程。
按照路口交通运行的实际情况,在本系统中,设定系统的工作情况如下。
路口交通灯控制系统的东西路有交通灯R(红)、Y(黄)、G(绿);东西人行安全通道灯:RXR(红)、RXG(绿)。南北路有交通灯:r1(红)、y1(黄)、g1(绿);南北人行安全通道灯:rxr1(红)、rxg1(绿),所有灯均为高电平点亮。设置15s的通行时间和5s转换时间的变模定时电路,由预置输入整数cnt决定是模15还是模5,输入逻辑cx是用来决定计数到4时清零还是到14时清零。Clk是外部提供的基准秒脉冲信号。x0、x1、x2、x3是由控制器输出的表示计数时间的四位二进制数。图1是该系统控制器的符号框图。
控制器的程序设计
* 控制器的ASM图
根据系统设计要求,得到控制器的ASM图,如图2所示。在这里,所有输入信号均为高电平有效。该ASM图反映了交通灯系统的不同状态的转换过程及持续时间。
* 控制器的VHDL程序设计
根据所分析的系统的ASM图,结合系统的设计要求,用VHDL语言对各个模块进行编程,最后形成顶层文件,在MAX+PLUSⅡ环境下进行编译与仿真,检查所编程序是否运行正确。如果出现错误,需要进行修改,直到完全通过为止。需要说明的是,在进行程序编译时,要先从底层程序开始,所有底层程序都正确后,才能开始顶层程序的编译。这是因为顶层程序是对底层程序的概括,它是把底层程序各个模块连接起来,就相当于把每个模块的功能汇聚到一起,实现整个系统的控制功能,所以底层程序的正确与否,关系到顶层程序的运行结果。
在控制器的程序设计中,在定义结构体时,有两种程序设计方法均可以通过编译及仿真,但在进行时序分析时结果却不同。
(1)如果这样定义:
...
ARCHITECTURE con1_arc of con1 IS
SIGNAL current_state:state
BEGIN
...
在进行程序调试时,均通过了编译及仿真,但在进行时序分析中,却出现了不按设定的计数顺序工作的结果:14, 13, 2,1, 0...。经过反复修改调试,对程序进行了修改,如(2)所定义的。
(2)
ARCHITECYTURE con1_arc OF con1 IS
SIGNAL current_state:state
SIGNAL TEMP_STATE:state;
...
TEMP STATE<=current_state
BEGIN
...
在这种设计方法中,多定义了一个信号变量,从而使得程序能按设定的状态14,13,12...进行转换。通过这个实例,可以看出EDA技术作为电子设计工具的功能修改及调试的方便快捷,即不需要硬件电路的支持就可以找到问题所在并进行修改,体现了它的优越性。
硬件电路实现
根据交通灯系统的控制要求,图3所示为本系统的硬件电路图。该电路包含了1个CPLD芯片,2个七段LED数码显示器,20个分别表示各个方向上的红、黄、绿灯,以及相应的限流电阻。这个电路与其他控制方法相比,所用器件可以说是比较简单经济的。经过实验,实现了预定的交通灯系统的控制功能。
或单片机,PLC教材上有实例.
单片机课程设计 交通信号灯控制器设计
资料类别 论文图书
所属课程 单片机
适用年级 大学
金 币 6 (如为0则表示免费下载)
文件格式
word
文件大小 4257K
上传时间 2007-4-25 22:51:00
预览文件 无(只能预览文件中的部分内容)
下载次数 41
内容简介:
单片机课程设计:交通信号灯控制器设计
一、电路功能
该控制器能实现城市“十字”路口正常情况下以及特殊情况和紧急情况下交通信号灯的模拟控制。
1、在十字路口东西南北各设置红、黄、绿三种信号灯,如图1所示。正常情况下,东西、南北方向轮流放行。当东西方向(A线)放行、南北方向(B线)禁行时,东西方向(A线)绿灯亮25秒,然后黄灯亮5秒,南北方向(B线)红灯亮30秒;当南北方向(B线)放行、东西方向(A线)禁行时,南北方向(B线)绿灯亮25秒,然后黄灯亮5秒,东西方向(A线)红灯亮30秒。如此循环,实现交通灯定时控制。
.......
实验内容:用并口实现模拟交通灯;
要求:
东西向的绿灯亮,接着该方向的黄灯闪烁5次,然后红灯亮;同时南北向的绿灯亮,接着该方向的黄灯闪烁5次,然后红灯亮;如此重复。转向灯可以不需要。
#include<reg51.h>
sbit r1=P2^0
sbit y1=P2^1
sbit g1=P2^2
sbit r2=P2^3
sbit y2=P2^4
sbit g2=P2^5
void Delay(unsigned i)
{
unsigned int j
for(i>0i++)
for(j=0j<125j--)
{}
}
void main()
{
unsigned char i
while(1)
{
g1=0
r2=0
Delay(2000)
g1=1
for(i=5i>0i--)
{
y1=0
Delay(500)
y1=1
Delay(500)
}
r2=1
r1=0
g2=0
Delay(2000)
g2=1
for(i=5i>0i--)
{y2=0
Delay(500)
y2=1
Delay(500)
}
r1=1
}
}
USE IEEE.STD_LOGIC_1164.ALL
ENTITY lamp_con IS
PORT( clk,reset: IN STD_LOGIC
data_out:OUT
STD_LOGIC_VECTOR (5 DOWNTO 0) )
END ENTITY lamp_con
ARCHITECTURE behav OF lamp_con IS
TYPE states IS (st0,st1,st2,st3)
SIGNAL current_state,next_state:states
SIGNAL time_data:integer RANGE 0 TO 49
BEGIN
REG:PROCESS(reset ,clk)
BEGIN
IF reset='1' THEN current_state <= st0
time_data<=0
ELSIF clk='1' AND clk'EVENT THEN
current_state <= next_state
IF time_data<50 THEN--计数器
time_data<=time_data+1
ELSE time_data<=0
END IF
END IF
END PROCESS
COM1:PROCESS (time_data)
BEGIN
CASE time_data IS
WHEN 0 TO 19 =>next_state<=st0
WHEN 20 TO 24 =>next_state<=st1
WHEN 25 TO 44 =>next_state<=st2
WHEN 45 TO 49=>next_state<=st3
END CASE
END PROCESS
COM2:PROCESS (current_state)
BEGIN
CASE current_state IS
WHEN st0 =>data_out<="001100"
WHEN st1 =>data_out<="010100"
WHEN st2 =>data_out<="100001"
WHEN st3 =>data_out<="100010"
WHEN OTHERS =>NULL
END CASE
END PROCESS
END ARCHITECTURE behav
这好我们也做这个,跟你的题目差不多,你可以参考下!!!
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
假设是一个简单的交通灯,黄灯,红灯30秒,绿灯30秒。需要两个状态变量,
迪尔(1:东西,南北)方向,一些光色LightcolorEW,南北浅色LightcolorNS。
目前,红色的东西,然后DIR = 1 LightcolorEW =红色LightcolorNS =绿色的方向。分配到相应的端口。只需要南北方向东西方向相反。
假设有黄色,位于30秒的红灯,绿灯25秒,5秒黄灯。的时刻,红色的东西方向,然后DIR = 1,=前25秒LightcolorNS =绿色,红色LightcolorEW,5秒后LightcolorNS =黄色。作为新加入者绿灯转黄,然后再添加一个状态变量,国家绿色年底,黄绿色的状态结束开始计时转红灯结束。分配到相应的端口。只需要南北方向东西方向相反。
#define uchar unsigned char
#define uint unsigned int
sbit RED_A=P0^0//东西向灯
sbit YELLOW_A=P0^1
sbit GREEN_A=P0^2
sbit RED_B=P0^3//南北向灯
sbit YELLOW_B=P0^4
sbit GREEN_B=P0^5
uchar Flash_Count=0,Operation_Type=1//闪烁次数,操作类型变量
《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例
5
上海师范大学信息与机电工程学院—倪继锋
//延时
void DelayMS(uint x)
{
uchar i
while(x--) for(i=0i<120i++)
}
//交通灯切换
void Traffic_Light()
{
switch(Operation_Type)
{
case 1: //东西向绿灯与南北向红灯亮
RED_A=1YELLOW_A=1GREEN_A=0
RED_B=0YELLOW_B=1GREEN_B=1
DelayMS(2000)
Operation_Type=2
break
case 2: //东西向黄灯闪烁,绿灯关闭
DelayMS(300)
YELLOW_A=~YELLOW_AGREEN_A=1
if(++Flash_Count!=10) return//闪烁5 次
Flash_Count=0
Operation_Type=3
break
case 3: //东西向红灯,南北向绿灯亮
RED_A=0YELLOW_A=1GREEN_A=1
RED_B=1YELLOW_B=1GREEN_B=0
DelayMS(2000)
Operation_Type=4
break
case 4: //南北向黄灯闪烁5 次
DelayMS(300)
YELLOW_B=~YELLOW_BGREEN_B=1
if(++Flash_Count!=10) return
Flash_Count=0
Operation_Type=1
}
}
//主程序
void main()
{
while(1) Traffic_Light()
}