交通灯

该博客探讨了如何运用有限状态机(FSM)原理来实现交通灯的控制逻辑,详细介绍了设计过程和实现细节。
摘要由CSDN通过智能技术生成

有限状态机实现交通灯

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY trafficlight IS
PORT(key,clk:IN STD_LOGIC;
LED:OUT STD_LOGIC_VECTOR(0 TO 7);
seg:OUT STD_LOGIC_VECTOR(0 TO 3));
END ENTITY trafficlight;
ARCHITECTURE behave OF trafficlight IS
SIGNAL clk1,clk2:STD_LOGIC;
SIGNAL light1:INTEGER RANGE 0 TO 2 :=1;
SIGNAL light2:INTEGER RANGE 0 TO 2 :=0;
SIGNAL decade:INTEGER RANGE 0 TO 9; --
十位
SIGNAL uint:INTEGER RANGE 0 TO 9; --个位
SIGNAL next_status:STD_LOGIC_VECTOR(0 TO 3):="1000"; --次状态
TYPE table1 IS ARRAY (0 TO 9) OF STD_LOGIC_VECTOR(0 TO 7);
SIGNAL tabnumber:table1:=(x"03",x"9f",x"25",x"0d",x"99",x"49",x"41",x"1f",x"01",x"09");
--0-9
显示
TYPE table2 IS ARRAY (0 TO 2) OF STD_LOGIC_VECTOR(0 TO 7);
SIGNAL tablight:table2:=(x"99",x"9f",x"25"); --
红绿黄灯显示代码
BEGIN
p1:PROCESS(clk) --
50mhz 系统时钟进行 50m 的分频
VARIABLE count:INTEGER RANGE 0 TO 50000000;
BEGIN
IF (clk'EVENT AND clk='1') THEN
count:=count+1 ;
IF count=25000000 THEN
clk1<='1';
ELSIF count=50000000 THEN
clk1<='0';
count:=0;
END IF;
END IF;
END PROCESS p1;

p2:PROCESS(clk) --50mhz 系统时钟进行 0.05m 的分频
VARIABLE count:INTEGER RANGE 0 TO 50000;
BEGIN
IF (clk'EVENT AND clk='1') THEN
count:=count+1 ;
IF (count=25000) THEN
clk2<='1';
ELSIF (count=50000) THEN
clk2<='0';
count:=0;
END IF;
END IF;
END PROCESS p2;
p3:PROCESS(clk2) --数码管显示
VARIABLE j:INTEGER RANGE 0 TO 4;
BEGIN
IF (clk2'EVENT AND clk2='1') THEN
j:=j+1;
IF j=4 THEN
j:=0;
END IF;
CASE j IS
WHEN 0 =>seg<="0111";
LED<=tablight(light1); --显示主干道交通灯状态
WHEN 1 =>seg<="1011";
LED<=tablight(light2); --显示次干道交通灯状态
WHEN 2 =>seg<="1101";
LED<=tabnumber(decade); --显示十位
WHEN 3 =>seg<="1110";
LED<=tabnumber(uint); --显示个位
WHEN OTHERS =>seg<="1111"; --关闭显示
END CASE;
END IF;
END PROCESS;
p4:PROCESS(clk1,clk) --交通灯状态控制
VARIABLE uin:INTEGER RANGE 0 TO 10:=1;
VARIABLE dec:INTEGER RANGE 0 TO 10:=1;
BEGIN
IF (clk1'EVENT AND clk1='1') THEN
IF (next_status="1000") THEN --状态1,主干道绿灯,次干道红灯
IF (uin=1 AND dec=1) THEN
IF (key='0') THEN
light1<=2;
light2<=0;
next_status<="0100";
uin:=6;
END IF;
ELSE
uin:=uin-1;
IF (uin=0) THEN
uin:=10;
dec:=dec-1;
END IF;
END IF;
END IF;
IF (next_status="0100") THEN --状态2,主干道黄灯,次干道红灯
IF (uin=1) THEN
light1<=0;
light2<=1;
next_status<="0010";
uin:=6;
dec:=3;
ELSE
uin:=uin-1;
END IF;
END IF;
IF (next_status="0010") THEN --状态3,主干道红灯,次干道绿灯
IF (uin=1 AND dec=1) THEN
light1<=0;
light2<=2;
next_status<="0001";
uin:=6;
ELSE
uin:=uin-1;
IF (uin=0) THEN
uin:=10;
dec:=dec-1;
END IF;
END IF;
IF (key='1') THEN
light1<=0;
light2<=2;
next_status<="0001";
uin:=6;
dec:=1;
END IF;
END IF;
IF (next_status="0001") THEN --状态4,主干道红灯,次干道黄灯
IF (uin=1) THEN
light1<=1;
light2<=0;
next_status<="1000";
dec:=5;
uin:=6;
ELSE
uin:=uin-1;
IF (uin=0) THEN
uin:=10;
dec:=dec-1;
END IF;
END IF;
END IF;
uint<=uin-1;
decade<=dec-1;
END IF;
END PROCESS;
END ARCHITECTURE behave;


本设计是交通灯用于十字路口的设计,是单片机控制的简易系统,结构很简单,我采用的是AT89C52作为芯片,采用一些相应的简单外围电路都是书本上的,比如外围的时钟晶振电路,复位电路等等,在硬件电路的设计方面,主题思想是用一片单片机加上输出的LED显示器和TRAFFICLIGHTS作为输出结果,通过按键来控制交通灯的输出,采用一个中断作为特殊车辆的控制位,采用P1口作为输入控制口即A道和B道的控制口,其为双向IO口同时作为交通灯的输出口,采用P0口作为LED的输出口,但P0口做输出口时需要接上拉电阻,其显示的是红绿黄灯的切换时间,在软件程序的设计方面,本设计采用了C语言作为编辑语言,其结构简单,语言方便,实现起来比较容易,作为特殊车辆,采用的是外部中断0即INT0作为它的控制口,我的程序大体的分为四部分,主程序和两个子程序即显示程序和延时程序,和一个宏定义。对于定时器,我采用了定时器0,主程序是一些程序的初始化比较简单,主要是开中断,开定时器和方式选择等等,遇到中断,和有按键按下就调用显示程序,程序的开始是宏定义,定义管脚的作用和名称,然后是延时程序中断程序和显示程序,在显示程序中字形码对应的是LED的输出(其为共阴极显示),应该特别注意的是在理想电路设计中我没注意电阻和电容的选择,其不影响仿真输出,但在实际电路中电阻和电容如果选择不正确可能影响输出结果。在仿真电路中使用总线形式用来节省空间。
本设计是关于单片机控制的交通灯模拟系统的设计。主要内容有交通灯模拟系统设计方案,主要功能,各功能模块的介绍,电路设计,硬件部分设计,软件部分设计,模拟系统的仿真调试,设计方法以及课程设计的心得体会等等。 该设计中用光二极管来模拟信号灯,紧急车的优先通过请求信号由外部中断技术来模拟。根据交通灯系统所需要实现的功能要求,先画出中断程序部分的流程图和主程序流程图,然后根据流程图写出其子程序。从而通过模拟系统的仿真来实现该设计所要求的功能。 本系统由单片机系统、键盘、LED 显示、交通灯演示系统组成。最后,系统要求实现如下的交通灯的功能: 1、南北方向(主干道)车道和东西方向(支干道)车道两条交叉道路上的车辆交替运行,主干道每次通行时间都设为30秒、支干道每次通行时间为20秒,时间可设置修改;    2、在绿灯转为红灯时,要求黄灯先亮5秒钟,才能变换运行车道;    3、黄灯亮时,要求每秒闪亮一次。    4、东西方向、南北方向车道除了有红、黄、绿灯指示外,每一种灯亮的时间都用显示器进行显示(采用计时的方法)。    5、一道有车而另一道无车(实验时用开关 K0 和 K1 控制),交通灯控制系统能立即让有车道放行。 6、有紧急车辆要求通过时,系统要能禁止普通车辆通行,A、B道均为红灯,紧急车由K2 开关模拟。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值