第一篇:交通灯控制逻辑电路设计与总结报告
交通灯控制逻辑电路设计与总结报告
一、设计任务
用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、在原有程序的基础上,可通过增加一个输入量来控制一种特殊状态,用以控制特殊情况的处理,视该特殊情况而定。
二○一○年九月三日
第二篇:基于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的状态。
第三篇:基于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();}
第四篇:课程设计任务书-24交通灯控制电路设计
课程设计任务书
题目:交通灯控制电路设计
时间: 年 月 日—— 年 月 日
设计的说明:
本设计需要用到实验箱上交通灯模块中的发光二极管,即红、黄、绿各三个。依人们的交通常规,“红灯停,绿灯行,黄灯提醒”。交通灯显示用实验箱的交通灯模块和七段码管中的任意两个来显示。系统时钟选择时钟模块的1KHz时钟,黄灯闪烁时钟要求为2Hz,七段码管的时间显示为1Hz 脉冲,即每1s 中递减一次,在显示时间小于3 秒的时候,通车方向的黄灯以2Hz 的频率闪烁。系统中用S1 按键进行复位。
设计的任务和要求:
1、在十字路口的两个方向上各设一组红、绿、黄灯;初始状态是两个路口的红灯全亮之后,东西路口的绿灯亮,南北路口的红灯亮,东西方向通车,延时一段时间后,东西路口绿灯灭,黄灯开始闪烁。闪烁若干次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北方向开始通车,延时一段时间后,南北路口的绿灯灭,黄灯开始闪烁。闪烁若干次后,再切换到东西路口方向,重复上述过程。
2、设置数码管显示允许通行或者禁止通行的时间,东西路和南北路的通车时间均设定为20s。数码管的时间总是显示为19、18、17……2、1、0、19、18……。在显示时间小于3 秒的时候,通车方向的黄灯闪烁。
3、当各条路中任意一条上出现特殊情况,如消防车、救护车或其他需要优先放行的车辆时,各方向上均是红灯亮。倒计时停止,且显示数字在闪烁。当特殊运行状态结束后,控制器恢复原来状态,继续正常运行。
4、要求对整体电路进行仿真,提供仿真波形图,并分析结果
5、硬件测试结果用照片的形式记录下来。
提高部分:编写能手动控制交通灯通行时间的交通灯控制器。
指导教师:
学生:
日期:
第五篇:交通灯管理电路设计
交通灯管理电路设计.txt懂得放手的人找到轻松,懂得遗忘的人找到自由,懂得关怀的人找到幸福!女人的聪明在于能欣赏男人的聪明。生活是灯,工作是油,若要灯亮,就要加油!相爱时,飞到天边都觉得踏实,因为有你的牵挂;分手后,坐在家里都觉得失重,因为没有了方向。本文由车牌定位贡献
doc文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。
东 北 石 油 大 学
课
课 题 院 程 目 系
程
设
计
单片机原理及应用课程设计 交通灯管理电路设计 电子科学学院 电信 07-5 班 马深慧 070901140505 专业班级 学生姓名 学生学号 指导教师 2011 年 3 月 18 日
东北石油大学课程设计任务书
课程 题目 单片机原理及应用课程设计 交通灯管理电路设计 电信 07-5 姓名 马深慧 学号 070901140505 专业班级
一、设计目的: 训练学生综合运用己学课程的基本知识,独立进行单片机应用技术开发工作,掌握单片机程序设计、调试,应用电路设计、分析及调试检测。
二、设计要求: 1.应用 MCS-51 单片机设计交通灯管理电路; 2.该系统要求显示 50s 倒计时时间,当计到需交换红绿灯前 10s,路口均显示黄灯; 3.硬件设计根据设计的任务选定合适的单片机,根据控制对象设计接口电路。设计的 单元电路必须有工作原理,器件的作用,分析和计算过程; 4.软件设计根据电路工作过程,画出软件流程图,根据流程图编写相应的程序,进行 调试并打印程序清单; 5.原理图设计根据所确定的设计电路,利用 Protel 等有关工具软件绘制电路原理图、PCB 板图、提供元器件清单。
三、参考资料: [1] 单片微型计算机与接口技术,李群芳、黄建编著,电子工业出版社; [2] 单片机原理及应用,张毅刚编著,高等教育出版社; [3] 51 系列单片机及 C51 程序设计,王建校,杨建国等编著,科学出版社; [4] 单片机原理及接口技术,李朝青编著,北京航空航天大学出版社;
完成期限 指导教师 专业负责人 2011.3.14—2011.3.18 2011 年 3 月 13 日
目录
1.系统设计 1.系统设计 „„ 1 1.1 设计思路 „„ 1 1.1.1 设计目的„„ 1 1.1.2 设计任务和内容„„ 1 1.1.3 方案比较、设计与论证„„ 1 1.1.3.1 电源提供方案 „„ 1 1.1.3.2 复位方案 „„ 2 1.1.3.3 输入方案 „„ 2 1.1.3.4 显示界面方案 „„ 2 1.1.3.5 交通管理的方案论证 „„ 4 1.1.4 芯片简介„„ 4 2.硬件电路设计 2.硬件电路设计 „„ 10 2.1 设计原理分析 „„ 11 2.1.1 交通灯显示时序的理论分析与计算„„ 11 2.1.2 交通灯显示时间的理论分析与计算„„ 13 2.1.3LED 数码管显示模块„„ 14 2.1.4 复位电路„„ 15 2.1.5 晶振电路„„ 16 3.软件设计 3.软件设计 „„ 17 3.1 数码管显示子程序: „„ 17 3.1LED 红绿灯显示模块程序: „„ 18 4.总结 4.总结 „„ 21 5.参考文献 5.参考文献 „„ 22 6.附录 6.附录 „„ 22 6.1 附录 1:程序清单 „„ 22 6.2 附录 2:电路设计总图 „„ 29 1.系统设计
1.1 设计思路 1.1.1 设计目的 训练学生综合运用己学课程的基本知识,独立进行单片机应用技 术开发工作,掌握单片机程序设计、调试,应用电路设计、分析及调 试检测。1.1.2 设计任务和内容 1.应用 MCS-51 单片机设计交通灯管理电路; 2.该系统要求显示 50s 倒计时时间,当计到需交换红绿灯前 10s,路口均显示黄灯; 3.硬件设计根据设计的任务选定合适的单片机,根据控制对象 设计接口电路。设计的单元电路必须有工作原理,器件的作用,分析 和计算过程; 4.软件设计根据电路工作过程,画出软件流程图,根据流程图 编写相应的程序,进行调试并打印程序清单; 5.原理图设计根据所确定的设计电路,利用 Protel 等有关工具软 件绘制电路原理图、PCB 板图、提供元器件清单。1.1.3 方案比较、设计与论证 1.1.3.1 电源提供方案 为使模块稳定工作,须有可靠电源,采用单片机控制模块提供电 源。此方案的优点是系统简明扼要,节约成本; 缺点是输出功率不高。1 1.1.3.2 复位方案 复位方式有两种:按键复位与软件复位。由考虑到程序的简洁,避免冗长,本设计采用按键复位,在芯片的复位端口外接复位电路,通过按键对单片机输入一个高电平脉冲,达到复位的目的。1.1.3.3 输入方案 方案一: 采用 89S52 扩展 I/O 口及键盘,显示等。该方案的优点是: 使用灵活可编程,并且有 RAM,及计数器。若用该方案,可提供较多 I/O 口,但操作起来稍显复杂。
方案二: 直接在 I/O 口线上接上按键开关。因为设计时精简和优化了电路,所以剩余的口资源还比较多,我们使用 2 个按键,分别是 K1、K2。由于该系统对于交通灯及数码管的控制,只用单片机本身的 I/O 口 就可实现,且本身的计数器及 RAM 已经够用,故选择方案二 1.1.3.4 显示界面方案 该系统要求完成倒计时、状态灯等功能。基于上述原因,我们考 虑了三种方案: 方案一: 2 完全采用数码管显示。这种方案只显示有限的符号和数码字符,无法胜任题目要求。方案二: 完全采用点阵式 LED 显示。这种方案实现复杂,且须完成大量 的软件工作; 但功能强大,可方便的显示各种英文字符,汉字,图形。方案三: 采用数码管与点阵 LED(点阵式和 8 段式 LED)相结合的方法因 为设计既要求倒计时数字输出,又要求有状态灯输出等,为方便观看 并考虑到现实情况,用数码管与 LED 灯分别显示时间与提示信息。这 种方案既满足系统功能要求,又减少了系统实现的复杂度。权衡利弊,第三种方案可互补一二方案的优缺,决定采用方案三以实现系统的显 示功能。整个设计以 AT89S52 单片机为核心,由数码管显示,数码管显示, LED 复位电路组成。硬件模块入图所示: AT89S52 单 片机
数码管显示 LED 数码管 晶振电路 显示
复位电路 3 1.1.3.5 交通管理的方案论证 东西、南北两干道交于一个十字路口,各干道有一组红、黄、绿 三色的指示灯,指挥车辆和行人安全通行。红灯亮禁止通行,绿灯亮 允许通行。黄灯亮提示人们注意红、绿灯的状态即将切换,且黄灯燃 亮时间为东西、南北两干道的公共停车时间。指示灯燃亮的方案如下 表所示: 40S 10S 40S 10S „„
东 西 红 灯 黄 灯 绿 灯 黄 灯 „„ 道 亮 亮 亮 亮
南 北 绿 灯 黄 灯 红 灯 黄 灯 „„ 道 亮 亮 亮 亮 上表说明:(1)当东西方向为红灯,此道车辆禁止通行,东西道行人可通 过;南北道为绿灯,此道车辆通过,行人禁止通行。时间 为 40 秒。(2)黄灯 10 秒,警示车辆和行人红、绿灯的状态即将切换。(3)当东西方向为绿灯,此道车辆通行;南北方向为红灯,南 北道车辆禁止通过,行人通行。时间为 40 秒。(4)这样如上表的时间和红、绿、黄出现的顺序依次出现这样 行人和车辆就能安全畅通的通行。1.1.4 芯片简介 1.AT89S52 单片机简介 4 其引 DIP 封装的脚图如下:
主要性能: 与 MCS-51 单片机产品兼容、8K 字节在系统可编程 Flash 存 储器、1000 次擦写周期、全静态操作:0Hz~33Hz、三级加 密程序存储器、32 个可编程 I/O 口线、三个 16 位定时器/计 数器 八个中断源、全双工 UART 串行通道、低功耗空闲和掉电 模式、掉电后中断可唤醒、看门狗定时器、双数据指针、掉 电标识符。功能特性描述: 5 At89s52 是一种低功耗、高性能 CMOS8 位微控制器,具有 8K 在系统可编程 Flash 存储器。使用 Atmel 公司高密度非 易失性 存储器技术制造,与工业 80C51 产品指令和引脚完 全兼容。片 上 Flash 允许程序存储器在系统可编程,亦适于 常规编程器。在 单芯片上,拥有灵巧的 8 位 CPU 和在系统 可编程 Flash,使得 AT89S52 为众多嵌入式控制应用系统提 供高灵活、超有效的解决 方案。AT89S52 具有以下标准功能: 8k 字节 Flash,256 字节 RAM,32 位 I/O 口线,看门狗定时器,2 个数据指针,三个 16 位 定时器/计数器,一个 6 向量 2 级中断结构,全双工串行口,片 内晶振及时钟电路。另外,AT89S52 可降至 0Hz 静态逻 辑操作,支持 2 种软件可选择节电模式。空闲模式下,CPU 停止工作,允 许 RAM、定时器/计数器、串口、中断继续工 作。掉电保护方式 下,RAM 内容被保存,振荡器被冻结,单片机一切工作停止,直 到下一个中断或硬件复位为止。8 位微控制器 8K 字节在系统可 编程 Flash AT89S52 P0 口:P0 口是一个 8 位漏极开路的双向 I/O 口。作为输出 口,每位能驱动 8 个 TTL 逻辑电平。对 P0 端口写“1”时,引脚 用作高阻抗输入。当访问外部程序和数据存储器时,P0 口也被作为低 8 位 地址/数据复用。在这种模式下: P0 具有内部上拉电阻。6 在 flash 编程时,口也用来接收指令字节; P0 在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。P1 口:P1 口是一个具有内部上拉电阻的 8 位双向 I/O 口,p1 输出缓冲器能驱动 4 个 TTL 逻辑电平。P1 端口写“1”时,对 内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入 使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)此外,P1.0 和 P1.2 分别作定时器/计数器 2 的外部计数输入(P1.0/T2)和时器/计数器 2 的触发输入(P1.1/T2EX),具体如 下表所示。在 flash 编程和校验时,P1 口接收低 8 位地址字节。引脚号第二功能 P1.0 T2(定时器/计数器 T2 的外部计数输入),时钟输出 P1.1 T2EX(定时器/计数器 T2 的捕捉/重载触发信号和方向 控制)P1.5 MOSI(在系统编程用)P1.6 MISO(在系统编程用)P1.7 SCK(在系统编程用)P2 口:P2 口是一个具有内部上拉电阻的 8 位双向 I/O 口,P2 输出缓冲器能驱动 4 个 TTL 逻辑电平。P2 端口写“1”时,对 内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入 7 使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。在访问外部程序存储器或用 16 位地址读取外部数据存储器(例如执行 MOVX @DPTR)时,P2 口送出高八位地址。在这种应 用中,P2 口使用很强的内部上拉发送 1。在使用 8 位地址(如 MOVX @RI)访问外部数据存储器时,P2 口输出 P2 锁存器的内容。在 flash 编程和校验时,P2 口也接收高 8 位地址字节和一些 控制信号。P3 口:P3 口是一个具有内部上拉电阻的 8 位双向 I/O 口,p2 输出缓冲器能驱动 4 个 TTL 逻辑电平。P3 端口写“1”时,对 内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入 使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。P3 口亦作为 AT89S52 特殊功能(第二功能)使用,如下表所 示。在 flash 编程和校验时,P3 口也接收一些控制信号。端口引脚 第二功能 P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 INTO(外中断 0)P3.3 INT1(外中断 1)P3.4 TO(定时/计数器 0)8 P3.5 T1(定时/计数器 1)P3.6 WR(外部数据存储器写选通)P3.7 RD(外部数据存储器读选通)此外,P3 口还接收一些用于 FLASH 闪存编程和程序校验的控 制信号。RST——复位输入。当振荡器工作时,RST 引脚出现两个机器 周期以上高电平将是单片机复位。ALE/PROG——当访问外部程存储器或数据存储器时,ALE(地 址锁存允许)输出脉冲用于锁存地址的低 8 位字节。一般情况下,ALE 仍以时钟振荡频率的 1/6 输出固定的脉冲信号,因此它可对 外输出时钟或用于定时目的。要注意的是:每当访问外部数据存 储器时将跳过一个 ALE 脉冲。对 FLASH 存储器编程期间,该引脚还用于输入编程脉冲(PROG)。如有必要,可通过对特殊功能寄存器(SFR)区中的 8EH 单元 的 D0 位置位,可禁止 ALE 操作。该位置位后,只有一条 MOVX 和 MOVC 指令才能将 ALE 激活。此外,该引脚会被微弱拉高,单片机 执行外部程序时,应设置 ALE 禁止位无效。PSEN——程序储存允许(PSEN)输出是外部程序存储器的读 选通信号,当 AT89C52 由外部程序存储器取指令(或数据)时,每个机器周期两次 PSEN 有效,即输出两个脉冲,在此期间,当访 问外部数据存储器,将跳过两次 PSEN 信号。9 EA/VPP——外部访问允许,欲使 CPU 仅访问外部程序存储器(地址为 0000H-FFFFH),EA 端必须保持低电平(接地)。需注 意的是:如果加密位 LB1 被编程,复位时内部会锁存 EA 端状态。如 EA 端为高电平(接 Vcc 端),CPU 则执行内部程序存储器 的指令。FLASH 存储器编程时,该引脚加上+12V 的编程允许电源 Vpp,当然这必须是该器件是使用 12V 编程电压 Vpp。
2.硬件电路设计
复位
晶振源 AT89S52 各路口红绿灯 LED 倒计时显示 10 2.1 设计原理分析 2.1.1 交通灯显示时序的理论分析与计算 对于一个交通路口来说,能在最短的时间内达到最大的车流量,就 算是达到了最佳的性能,我们称在单位时间内多能达到的最大车流 为车流量,用公式:车流量= 车流 / 时间 来表示。先设定一些标号如图 2-1 所示。
说明: 此图为直方图,上边为北路口灯,右边为东路口灯,下边为南路 口灯,左边为西路口灯。图 2-2 所示为一种红绿灯规则的状态图,分别设定为 S1、S2、S3、S4,交通灯以这四的状态为一个周期,循环执行(见图 2-3)。11 图 2-1 请注意图 2-1b 和图 2-1d,它们在一个时间段中四个方向都可以通 车,这种状态能在一定的时间内达到较大的车流量,效率特别高。依据上述的车辆行驶的状态图,可以列出各个路口灯的逻辑表,由于 相向的灯的状态图是一样的,所以只需写出相邻路口的灯的逻辑表; 根据图 2-3 可以看出,相邻路口的灯它们的状态在相位上相差 180°。因此最终只需写出一组 S1、S2、S3、S4 的逻辑状态表。如表 2-1 所示。12 表 2-1 表中的“×”代表是红灯亮(也代表逻辑上的 0),“√”是代表绿 灯亮(也代表逻辑上的 1),依上表,就可以向相应的端口送逻辑值。
2.1.2 交通灯显示时间的理论分析与计算 东西和南北方向的放行时间的长短是依据路口的各个方向平时的车 13 流量来设定,并且 S1、S2、S3、S4 各个状态保持的时间之有严格的 对应关系,其公式如下示。T-S1+T-S2=T-S3 T-S2=T-S4 T-S1=T-S3 我们可以依据上述的标准来改变车辆的放行时间。按照一般的规则,一个十字路口可分为主干道和次干道,主干道的放行时间大于次干道 的放行时间,我们设定值时也应以此为参考 2.1.3LED 数码管显示模块(1)静态显示方式:静态显示方式是指当显示器显示某一字符时,发 光二极管的位选始终被选中。在这种显示方式下,每一个 LED 数码管 显示器都需要一个 8 位的输出口进行控制。由于单片机本身提供的 I/O 口有限,实际使用中,通常通过扩展 I/O 口的形式解决输出口数 量不足的问题。静态显示主要的优点是显示稳定,在发光二极管导通电流一定的情况 下显示器的亮度大,系统运行过程中,在需要更新显示内容时,CPU 才去执行显示更新子程序,这样既节约了 CPU 的时间,又提高了 CPU 的工作效率。其不足之处是占用硬件资源较多,每个 LED 数码管需要 独占 8 条输出线。随着显示器位数的增加,需要的 I/O 口线也将增加。(2)动态显示方式:动态显示方式是指一位一位地轮流点亮每位显示 器(称为扫描),即每个数码管的位选被轮流选中,多个数码管公用 14 一组段选,段选数据仅对位选选中的数码管有效。对于每一位显示器 来说,每隔一段时间点亮一次。显示器的亮度既与导通电流有关,也 与点亮时间和间隔时间的比例有关。通过调整电流和时间参数,可以 既保证亮度,又保证显示。若显示器的位数不大于 8 位,则显示器的 公共端只需一个 8 位 I/O 口进行动态扫描(称为扫描口),控制每位 显示器所显示的字形也需一个 8 位口(称为段码输出)。15 2.1.4 复位电路 复位方式有多种,本设计采用按键复位。接线图如图程序复位 电路框图
在设定的定时时间内,89S52 必须在 RST 引脚产生一个由高到低 的电平变化,以清内部定时器.2.1.5 晶振电路 晶振电路原理图如 3-2: 3-2 晶振模块原理图 选取原则:传统做法,但能够实现所需,即最简单也最是实用。电容选取 30pF,晶振为 30MHz。16 3.软件设计
3.1 数码管显示子程序: void normalPageShow(){ register unsigned char i, j, n;register long lTmp;unsigned char const SEG_CODE[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};unsigned char const COMM[2] = {0x01, 0x02, 0x04, 0x08};for(i = 0;i < 2;i ++){ lTmp = gnValue;n = lTmp((lTmp / 10)* 10);P2 = COMM[i];P0 = SEG_CODE[n];P2 = COMM[i + 2];P0 = SEG_CODE[n];lTmp /= 10;} } main(void){ EA = 0;// global interrupt disable 26 giSysStatus = 0;initMCU();EA = 1;while(1){ if(gbFlag_1sPeriod){ gbFlag_1sPeriod = 0;gnValue-= 1;gbFlag_refreshLED = 1;if(gnValue == 10){ dsY1 = 0;dsY2 = 0;} if(gnValue == 0){ if(dsR1 == 0){ dsR1 = 1;dsR2 = 0;dsG1 = 0;dsG2 = 1;dsY1 = 0;dsY2 = 0;} else{ 27 //刷新 LED dsR1 = 0;dsR2 = 1;dsG1 = 1;dsG2 = 0;dsY1 = 0;dsY2 = 0;} } } if(gbFlag_refreshLED){ gbFlag_refreshLED = 0;normalPageShow();} } } 28 6.2 附录 2:电路设计总图 29 东北石油大学课程设计成绩评价表
课程名称 题目名称 学生姓名 序号 马深慧 评价项目 工作量、工作态 1 度和出勤率 学号
单片机原理及应用课程设计 交通灯管理电路设计 070901140505 指 指导教 师姓名 标 职称 满分 评分
按期圆满的完成了规定的任务,难易程度和工作 量符合教学要求,工作努力,遵守纪律,出勤率 高,工作作风严谨,善于与他人合作。课程设计选题合理,计算过程简练准确,分析问 20 2 课程设计质量
题思路清晰,结构严谨,文理通顺,撰写规范,图表完备正确。45 3 4 总分 评语:
创新 答辩
工作中有创新意识,对前人工作有一些改进或有 一定应用价值。能正确回答指导教师所提出的问题。5 30 指导教师:
****年**月**日 30 1