第一篇:基于51单片机的交通灯控制电路设计
交通灯
一、功能要求
要求甲车道和乙车道两条交叉道路上的车辆交替运行,每次通行时间都设为25秒,黄灯先亮5秒钟,才能变换运行车道;黄灯亮时,要求每秒钟闪亮一次。
二、电路图
说明:1)每一位数码管位选要分开,对应IO口参照程序中红色部分 2)图示数码管为共阳,没加驱动数码管显示较暗,建议加驱动
三、程序
//TrafficLight.c #include“reg52.h”
//IO口定义 sbit red_1 =P2^0;//南北方向 sbit red_2 =P2^3;//东西方向 sbit yellow_1 =P2^1;sbit yellow_2 =P2^4;sbit green_1 =P2^2;sbit green_2 =P2^5;sbit com1_1 =P3^6;//十位 南北方向 数码管位选 sbit com1_2 =P3^7;//个位 南北方向 sbit com2_1 =P3^4;//十位 东西方向 sbit com2_2 =P3^5;//个位 东西方向
//全局变量 char time=30;//倒计时
unsigned char num1=0,num2=0;//辅助计时 unsigned char flag1=0,flag2=0;//黄灯闪标志位 unsigned char shi1,shi2,ge1,ge2;//数码管十位个位
const unsigned char ledNum[] =
{// 0 1
A
b
c
d
E
F
不显示-o(18)H(19)h(20)C(21)0(22)n(23)0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xA7,0xA1,0x86,0x8e,0xFF,0xbf,0xa3,0x89,0x8b,0xc6,0xc0,0xab };//共阳数码管
//中断优先级别T0>T1,数码管显示中断间隔2ms,计时时间间隔50ms //计时要求比较精确,间隔长,不应该被打断,故中断优先级要高,使用T0 //数码管中断可以被打断,打断时间较短,不会影响显示,使用T1 //在交通灯中,计时和数码管显示一直进行,故定时器开启后不用停止 void InitInter(void){ TMOD=0x11;//设置定时器工作方式为16位计时器
TH0=(65535-45872)/256;//11.0592M晶振,50ms TL0=(65535-45872)%256;TH1=(65535-1835)/256;//11.0592M晶振,2ms TL1=(65535-1835)%256;EA=1;ET0=1;ET1=1;TR0=1;TR1=1;}
void Display(void){ static unsigned char i=1;
switch(i){ case 1:
com2_2=0;
P0=ledNum[shi1];
com1_1=1;
break;case 2:
com1_1=0;
P0=ledNum[ge1];
com1_2=1;
break;case 3:
com1_2=0;
P0=ledNum[shi2];
com2_1=1;
break;case 4:
com2_1=0;
P0=ledNum[ge2];
com2_2=1;
break;
default:;}
i++;if(i>4)i=1;}
//红灯可以直接变成绿灯,但绿灯必须先变成黄灯再变红灯 void main(void){ bit i=0;InitInter();
while(1){
red_1=0;//0为亮
red_2=1;
green_2=0;
time=30;
while(time>5)
{
shi1=time/10;
ge1=time%10;
shi2=(time-5)/10;
ge2=(time-5)%10;
}
green_2=1;
yellow_2=0;
flag2=1;
num2=0;
while(time>0)
{
shi1=time/10;
ge1=time%10;
shi2=time/10;
ge2=time%10;
}
flag2=0;
yellow_2=1;
red_2=0;
red_1=1;
green_1=0;
time=30;
while(time>5)
{
shi2=time/10;
ge2=time%10;
shi1=(time-5)/10;
ge1=(time-5)%10;
}
green_1=1;
yellow_1=0;
flag1=1;
num2=0;
while(time>0)
{
shi2=time/10;
ge2=time%10;
shi1=time/10;
ge1=time%10;
}
flag1=0;
yellow_1=1;
//red_1=0;
//green_2=0;} } void Timer_0(void)interrupt 1//计时 { TH0=(65535-45872)/256;TL0=(65535-45872)%256;num1++;if(num1>=20){
num1=0;
time--;
//if(time<0)time=30;
//处理time,显示方式
} if(flag1||flag2){
num2++;
if(num2>=10)
{
num2=0;
if(flag1)yellow_1=~yellow_1;
if(flag2)yellow_2=~yellow_2;
} } }
void Timer_1(void)interrupt 3 { TH1=(65535-1835)/256;//11.0592M晶振,2ms TL1=(65535-1835)%256;
Display();}
第二篇:基于FPGA的交通灯控制电路设计
基于FPGA的交通灯控制电路设计
关键字: 交通信号机 FPGA 脉冲发生器
目前交通灯广泛应用于道路交通建设中。本文设计一个十字路口交通灯控制电路,要求东西、南北两条干道的红、绿、黄交通灯按要求循环变化,并以倒计时方式指示干道通行或禁止的维持时间。在QuartusⅡ软件环境中设计、仿真,并在FPGA实验板上实现所设计电路的功能。
系统概述
1.1 设计思想
基于FPGA的交通灯系统控制设计包括4大模块,分别为脉冲发生、状态定时、交通灯闪烁的控制、闪烁时间的控制,基本原理如图1所示。
1.2 总体工作情况
交通灯控制要求如表1所示。
该设计的交通灯控制分为6个状态。由于各状态持续时间不同,所以电路的核心控制部分是状态机和定时器,状态机在定时器触发下周期性循环,状态码控制6个灯以一定的规律变化。变化情况如图2所示。
系统脉冲由FPGA开发板晶振经过分频电路实现。状态定时由74190可逆十进制计数器和T’触发器实现,只要置数合理,翻转信号到位,就可以使电路在东西(I)、南北(J)两个控制状态间翻转。红、黄、绿灯的闪烁由7485数字比较器和组合逻辑控制,其中7485数字比较器用于比较计数器当前持续状态和所需要的状态全部时间,并做出相应的变化。组合逻辑控制由AHDL文件编写真值表实现。时间显示由AHDL文件编写真值表实现,输入正确的逻辑,七段译码电路即能得到正确的时间显示。
1.3 各功能的组成
整个电路可以分为4大部分,包括脉冲发生、状态定时、时间显示和数字比较一组合逻辑控制。
1.3.1 脉冲发生
脉冲发生器为整个系统提供驱动,将输入端分配给FPGA实验板的PIN55引脚,则会由实验板上产生频率为10 MHz的输入脉冲,用7片7490,每一级都构成10分频电路,使频率从10 MHz降低为1Hz。
1.3.2 状态定时
状态定时可由预置BCD码初值的74190级联实现,构成减计数器。级联原则是:低位计数器从全0状态变为最大码值状态时可使高位计数器减1。级联方式分为异步和同步两种,本文采取的是异步级联方式,即低位计数器溢出信号控制高位计数器的记数脉冲输入端。可根据计数器的时钟触发方式,在低位计数器状态码从全“0”变为最大码值的瞬间,为高位计数器提供有效的计数脉冲边沿。具体做法是将低片位的溢出信号RCON端口接到高片位的计数脉冲CLK,实现两位BCD码的置数、翻转和借位,使系统表示的数字能在22~16之间循环。
74190功能说明:
(1)GN为计数器使能控制端,低电平有效。当GN为高电平时,禁止计数。
(2)DNUP为计数方式控制,接高电平为减计数,接低电平为加计数。
(3)LDN为异步预置数控制。当LDN为低电平时,计数器状态QD,QC,QB,QA分别等于D,C,B,A。
(4)计数器位序由高至低顺序为QD,QC,QB,QA。QD为最高位MSB,QA为最低位LSB。
(5)计数脉冲CLK上升沿有效。
(6)当计数器输出QDQCQBQA为十进制加计数的最大状态码“1001”或为减计数的最小状态码全“0”时,极值状态码指示MAX/MIN输出为高电平。
(7)当极值状态码指示MAX/MIN为高电平且CLK为低电平时,溢出信号RCON为低电平,即RCON与计数脉冲同步。
系统记数脉冲为1 Hz时,如表2所示,当I状态(东西控制状态)的定时时间为22 s,计数器应该先预置22的BCD码;同理,J状态(南北控制状态)之前应该预置16的BCD码。
状态计时电路由两片74190级联而成,构成22和16自翻转的电路。其要解决的核心问题包括置数,翻转和借位。根据74190芯片的特点,可分析其实现原理如图4所示,通过溢出信号RCON的上升沿实现借位,使得数字能够从20到19,个位向十位借位,顺利过渡。
置数和翻转之间有先后关系,即须先置数后翻转。如表3所示,分析两个BCD码各位特点,可知两者D7D6D3D0位均为1,D1位均为0,而D5D4D2位不同,如图5,D5D4D2位由状态电平S来控制,当为I状态时,计数器的预置的数为D5=0,D4=D2=1,而为J状态时,计数器的预置的数为D5=1,D4=D2=0,根据74190的功能,将2片74190的MAX/MIN引出,通过与非门,分别连在高位和低位的LDN置数端,通过分析可知,当计数器从01减到00时候,高低位的MAX/MIN均为高电平,经过与非门以后为低电平,74190被置数,其置数值由状态S来决定,S是由LDN端信号经过一个T’触发器决定的,即LDN信号每置数一次,S翻转1次,从而区分16和22状态。按这个结构,可分别置数16和22,使其实现自翻转。
图5为状态定时模块的实际连接图。
1.3.3 时间显示
时间显示要用到7段显示译码电路,由于是两位BCD码,故用二选一数据选择器。选择端S接一个频率很高的方波(如1 kHz);数据比较器的输出和1 Hz脉冲作为AHDL模块的输入,即可正确显示时间。
为正确显示时间,用AHDL文件自编译码真值表如下:
1.3.4 数字比较一组合逻辑控制
该模块将状态定时模块输出的时间与时间节点进行比较,从而确定电路处于22 s或者16 s的具体的某个状态。由表1可知,东西(I)或南北(J)的控制状态都有3个阶段的控制逻辑,分别对应3个时间段:1~3 s,4~6 s和大于6 s,因此,采用数字比较器进行比较,确定定时值小于4 s或大于6 s,方法如图7所示,采用4片7485数字比较器,两两级联,其中一个由状态定时模块的输出与4即二进制0100比较;另一个由状态定时模块的输出与6即二进制0110比较。
编写组合逻辑真值表,将状态信号S,两个数字比较器的输出Y1,Y2和1 Hz脉冲作为输入,各个灯的状态作为输出。从而根据逻辑关系得出对应时间电路的状态,控制红、黄、绿灯处于不同的状态。S判断电路处于22 s状态还是16 s状态,Y1,Y2区分东西、南北六个阶段状态,1 Hz脉冲实现绿灯闪烁。电路的组构与调试
来用QuartusⅡ软件设计各个模块,并进行仿真。确认结果后,下载至FPGA实验板中,进行相应的硬件调试,调试结果与仿真结果相一致。图8为仿真波形,系统上电需要调整的过程,因此电路正常工作前重复了22s的状态。
第三篇:课程设计任务书-24交通灯控制电路设计
课程设计任务书
题目:交通灯控制电路设计
时间: 年 月 日—— 年 月 日
设计的说明:
本设计需要用到实验箱上交通灯模块中的发光二极管,即红、黄、绿各三个。依人们的交通常规,“红灯停,绿灯行,黄灯提醒”。交通灯显示用实验箱的交通灯模块和七段码管中的任意两个来显示。系统时钟选择时钟模块的1KHz时钟,黄灯闪烁时钟要求为2Hz,七段码管的时间显示为1Hz 脉冲,即每1s 中递减一次,在显示时间小于3 秒的时候,通车方向的黄灯以2Hz 的频率闪烁。系统中用S1 按键进行复位。
设计的任务和要求:
1、在十字路口的两个方向上各设一组红、绿、黄灯;初始状态是两个路口的红灯全亮之后,东西路口的绿灯亮,南北路口的红灯亮,东西方向通车,延时一段时间后,东西路口绿灯灭,黄灯开始闪烁。闪烁若干次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北方向开始通车,延时一段时间后,南北路口的绿灯灭,黄灯开始闪烁。闪烁若干次后,再切换到东西路口方向,重复上述过程。
2、设置数码管显示允许通行或者禁止通行的时间,东西路和南北路的通车时间均设定为20s。数码管的时间总是显示为19、18、17……2、1、0、19、18……。在显示时间小于3 秒的时候,通车方向的黄灯闪烁。
3、当各条路中任意一条上出现特殊情况,如消防车、救护车或其他需要优先放行的车辆时,各方向上均是红灯亮。倒计时停止,且显示数字在闪烁。当特殊运行状态结束后,控制器恢复原来状态,继续正常运行。
4、要求对整体电路进行仿真,提供仿真波形图,并分析结果
5、硬件测试结果用照片的形式记录下来。
提高部分:编写能手动控制交通灯通行时间的交通灯控制器。
指导教师:
学生:
日期:
第四篇:交通灯控制逻辑电路设计与总结报告
交通灯控制逻辑电路设计与总结报告
一、设计任务
用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”;
end process q4;-------------------------end architecture one;
----所有进程结束-------------------------
八、仿真结果
1、clk为输入脉冲;开始令reset为’1’,启动系统,系统正常工作后值为’0; t0为红绿灯循环时间,可自由修改,如果输入值为’0010000’,则为16秒倒计时。如下图:系统从0点开始运行,处于夜间模式时,倒计时都为“00”,两个方向都为黄灯闪烁,红绿灯都熄灭。
---------------------------否则,LED灯显示0
end case;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、在原有程序的基础上,可通过增加一个输入量来控制一种特殊状态,用以控制特殊情况的处理,视该特殊情况而定。
二○一○年九月三日
第五篇:单片机控制交通灯的案例
单片机控制交通灯
AT89C51单片机及由Keil 软件编写单片机程序,并且通过Proteus仿真测试,设计一个交通灯系统,实现简单的交通灯的管理功能。在交通灯系统的管理中,用发光二极管模拟交通信号灯,用逻辑电平开关模拟控制开关。在交通繁忙时,交通信号灯控制系统应有手控开关,可人为地改变信号灯的状态,以缓解交通拥挤状况。
工作内容及最终成果:
十字路口的交通指挥信号灯控制要求如下:
(1)信号灯受一个起动开关控制,当起动开关接通时,信号系统开始工作,且先南北红灯亮,东西绿灯亮。当起动开关断开时,所有信号灯都熄灭。(2)南北绿灯和东西绿灯不能同时亮,如果同时亮时应关闭信号灯系统,并报警。
(3)南北红灯亮维持25S。在南北红灯亮的同时东西绿灯也亮,并维持20S。到20S时,东西绿灯闪烁,闪烁3S后熄灭。在东西绿灯熄灭时,东西黄灯亮,并维持2S。到2S时,东西黄灯熄,东西红灯亮。同时,南北红灯熄灭,南北绿灯亮。
(4)东西红灯亮维持30S。南北绿灯亮维持25S。然后闪烁3S,熄灭。同时南北黄灯亮,维持2S后熄灭,这时南北红灯亮,东西绿灯亮。(5)周而复始。
ORG
0000H
LJMP START
ORG
0040H START:
MOV
SP,#60H
LCALL STATUS0;初始状态(都是红灯)CIRCLE:
LCALL STATUS1;南北绿灯,东西红灯
LCALL STATUS2;南北绿灯闪转黄灯,东西红灯
LCALL STATUS3;南北红灯,东西绿灯
LCALL STATUS4;南北红灯,东西绿灯闪转黄灯
LJMP CIRCLE STATUS0:
;南北红灯,东西红灯
MOV DPTR,#8300H
MOV A,#0FH
MOVX @DPTR,A
MOV R2,#10
;延时1秒
LCALL DELAY
RET STATUS1:
;南北绿灯,东西红灯
MOV DPTR,#08300H
MOV A,#96H
;南北绿灯,东西红灯
MOVX @DPTR,A
MOV R2,#200
;延时20秒
LCALL DELAY
RET STATUS2:
;南北绿灯闪转黄灯,东西红灯
MOV DPTR,#8300H
MOV R3,#03H
;绿灯闪3次 FLASH:
MOV A,#9FH
MOVX @DPTR,A
MOV R2,#03H
LCALL DELAY
MOV A,#96H
MOVX @DPTR,A
MOV R2,#03H
LCALL DELAY
DJNZ R3,FLASH
MOV A,#06H
;南北黄灯,东西红灯
MOVX @DPTR,A
MOV R2,#10
;延时1秒
LCALL DELAY
RET STATUS3:
;南北红灯,东西绿灯
MOV DPTR,#8300H
MOV A,#69H
MOVX @DPTR,A
MOV R2,#200
;延时20秒
LCALL DELAY
RET STATUS4:
;南北红灯,东西绿灯闪转黄灯
MOV DPTR,#8300H
MOV R3,#03H
;绿灯闪3次 FLASH1:
MOV A,#6FH
MOVX @DPTR,A
MOV R2,#03H
LCALL DELAY
MOV A,#69H
MOVX @DPTR,A
MOV R2,#03H
LCALL DELAY
DJNZ R3,FLASH1
MOV A,#09H
;南北红灯,东西黄灯
MOVX @DPTR,A
MOV R2,#10
;延时1秒
LCALL DELAY
NOP
RET DELAY:
;延时子程序
PUSH 2
PUSH 1
PUSH 0 DELAY1:
MOV 1,#00H DELAY2:
MOV 0,#0B2H
DJNZ 0,$
DJNZ 1,DELAY2;延时 100 mS
DJNZ 2,DELAY1
POP 0
POP 1
POP 2
RET
END