EDA实验报告
交通灯设计
姓名:张惠洋
班级:020915
学号:02091463
EDA实验报告—交通灯的控制
一实验要求:
分两个方向(1、2),每个方向各有红(R)、绿(G)、黄(Y)三个交通灯。有自动、手动两种控制方式。在自动方式下,控制器的状态转移表为:
状态 亮灯 停留时间
S0 R1,G2 2秒
S1 R1,Y2 1秒
S2 G1,R2 2秒
S3 Y1,R2 1秒
在手动方式下,按下按钮K0~ K3时直接进入对应序号的状态,随后即转入自动方式。交通灯、按钮分别利用实验板上的发光二极管、按钮。
二实验器材:
PC机一台、FPGA教学实验板一块
三实验原理与内容:
1原理
(1)本题中交通灯的状态可用有限状态机模型描述。根据输出与输入之间的关系,有限状态机可以分为两种类型:Moore和Mealy型。这两种状态机的区别在于:Mealy型状态机的输出由状态机的输入和状态机的状态共同决定;Moore型状态机的输出仅与状态机的状态有关,而与状态机的输入无关。本题中的输出由六个发光二级光显示,其状态仅与当前状态机的状态有关,故该题为Moore模型的状态机。下图为状态机的状态表:
状态表
状态转移图:
K3=0/时间未到 K3=0/时间未到
K0=0
K1=0/时间到
K0=0 K3=0
K0=0/时间到 K2=0/时间到
K3=0 K1=0
K3=0/时间未到 k1=0 k2=0/时间未到
K2=0
K3=0/时间到
K2=0
(2)本题中所用到的FPGA芯片为CYCLONE EP1C6Q240C8,时钟为4M。故用到一个4M的时钟分频器。
2.程序设计
组件一:实体jiaotongdeng的程序
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity jiaotongdeng is
port(
clk :in std_logic;
k0 :in std_logic;
k1 :in std_logic;
k2 :in std_logic;
k3 :in std_logic;
r1,g1,y1,r2,g2,y2 :out std_logic
);
end jiaotongdeng;
architecture behavior of jiaotongdeng is
type state_type is(s0,s1,s2,s3); ——用枚举类型进行状态定义
signal current_state,next_state:state_type; ——状态信号的定义
signal counter:std_logic_vector(6 downto 0);
begin
synch:process ——同步单元
begin
wait until clk'event and clk='1';
counter<=counter;
if counter<5 then
counter<=counter+1;
else
counter<=(others=>'0');
end if;
end process;
process
begin
wait until clk'event and clk='1';
current_state<=next_state;
end process;
state_trans:process(current_state,k0,k1,k2,k3) ——描述每种状态下电路表现
begin
case current_state is
when s0 =>
if k0='0' then
next_state<=s0;
else
if k1='0' then
next_state<=s1;
else
if k2='0' then
next_state<=s2;
else
if k3='0' then
next_state<=s3;
else
if counter<1 then
next_state<=s0;
else
next_state<=s1;
end if;
end if;
end if;
end if;
end if;
when s1 =>
if k0='0' then
next_state<=s0;
else
if k1='0' then
next_state<=s1;
else
if k2='0' then
next_state<=s2;
else
if k3='0' then
next_state<=s3;
else
if counter<2 then
next_state<=s1;
else
next_state<=s2;
end if;
end if;
end if;
end if;
end if;
when s2=>
if k0='0' then
next_state<=s0;
else
if k1='0' then
next_state<=s1;
else
if k2='0' then
next_state<=s2;
else
if k3='0' then
next_state<=s3;
else
if counter<4 then
next_state<=s2;
else
next_state<=s3;
end if;
end if;
end if;
end if;
end if;
when s3=>
if k0='0' then
next_state<=s0;
else
if k1='0' then
next_state<=s1;
else
if k2='0' then
next_state<=s2;
else
if k3='0' then
next_state<=s3;
else
if counter<5 then
next_state<=s3;
else
next_state<=s0;
end if;
end if;
end if;
end if;
end if;
end case;
end process;
ouput:process(current_state)
begin ——显示程序
case current_state is
when s0=>
r1<='0';
g1<='1';
y1<='1';
r2<='1';
g2<='0';
y2<='1';
when s1=>
r1<='0';
g1<='1';
y1<='1';
r2<='1';
g2<='1';
y2<='0';
when s2=>
r1<='1';
g1<='0';
y1<='1';
r2<='0';
g2<='1';
y2<='1';
when s3=>
r1<='1';
g1<='1';
y1<='0';
r2<='0';
g2<='1';
y2<='1';
end case;
end process;
end behavior;
组件二:分频器实体devide的程序
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity devide is
port(
clk :in std_logic;
clk_out :out std_logic
);
end devide;
architecture arc_devide of devide is
signal count:std_logic_vector(21 downto 0);
begin
process
begin
wait until clk'event and clk='1';
if(count<3999999)then
count<=count+1;
clk_out<='0';
else
count<=(others=>'0');
clk_out<='1';
end if;
end process;
end architecture arc_devide;
3.实验连接图
如上图所示,该交通灯控制系统由两个实体组成。实体clk为4M的时钟分频器,clk是输入口,接的是FPGA产生的时钟信号,clk_out是输出口,输出分频后的时钟脉冲。主实体jiaotongdeng则实现状态机的状态转换逻辑控制。其k0~k3口是输入口,为手动方式的控制按钮,r1,r2,g1,g2,y1,y2为六个输出,控制六个发光二极管的亮灭。六个发光二级管的亮灭代表六个状态机的状态,从而实现交通灯控制的功能。
4.时序波形分析
(k0,k1,k2,k3=0)
上图为4个状态进行转换的时序波形。可见(r1,g1,y1,r2,g2,y2)的状态转换符合011101》011110》101011》110011》011101》……的顺序循环。
(k0=0)
上图为k0=0时的输出状态s0,输出恒为011101。即亮灯为R1,G2。保持时间2S。
(k1=0)
图为k1=0时的输出状态s1,输出恒为011110。即亮灯为R1,y2。保持时间1S。
(k2=0)
上图为k2=0时的输出状态s2,输出恒为101011。即亮灯为G1,R2。保持时间2S。
(k3=0)
上图为k3=0时的输出状态s3,输出恒为110011。即亮灯为R1,G2。保持时间1S。
第二篇:单片机交通灯实验报告
交通灯控制系统设计
院 系: 电子电气工程学院
专 业: 电气自动化
班 级: P10电气四班
成 员:
*********** **
交通灯控制系统设计实验
一.设计目的
1. 通过本次课程设计进一步熟悉和掌握单片机的结构及工作原理,巩固和加深“单片机原理与应用”课程的基本知识,掌握电子设计知识在实际中的简单应用。
2. 综合运用“单片机原理与应用”课程和先修课程的理论及生产实际知识去分析和解决电子设计问题,进行电子设计的训练。
3. 学习电子设计的一般方法,掌握AT89C52芯片以及简单电子设计过程和运行方式,培养正确的设计思想和分析问题、解决问题的能力,特别是总体设计能力。
4. 通过计算和绘制原理图、布线图和流程图,学会运用标准、规范、手册、图册和查阅有关技术资料等,培养电子设计的基本技能。
5. 通过完成一个包括电路设计和程序开发的完整过程,了解开发单片机应用系统全过程,为今后从事的工作打基础。
二.设计要求
1.利用单片机的定时器定时,实现道路的红绿灯交替点亮和熄灭。
2.以AT89C52单片机为核心,设计一个十字路口交通灯控制系统。用单片机控制LED灯模拟交通信号灯显示。假定东西、南北方向方向通行(绿灯)时间为25秒,缓冲(黄灯)时间5秒,停止(红灯)时间35秒。
3.南北方向、东西方向车道除了有红、黄、绿灯指示外,每一种灯亮的时间都用显示器进行显示(采用计时的方法)。
三.实验原理
1.基本原理
主体电路:交通灯自动控制模块。这部分电路主要由80C51单片机的I/O端口、定时计数器、外部中断扩展等组成。
本设计先是从普通三色灯的指示开始进行设计,用P1口作为输出。程序的初始化是东西南北方向的红灯全亮。然后南北方向红灯亮,东西方向绿灯亮,60秒后东西方向黄灯闪亮5秒后南北方向绿灯亮,东西方向红灯亮。重复执行。倒计时用到定时器T0,用P2口作为LED的显示。二位一体的LED重复执行60秒的倒计时。作为突发事件的处理,本设计主要用到外部中断EX0。用一模拟开关作为中断信号。实际中可以接其它可以产生中断信号的信号源。
2.芯片AT89C52
AT89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,功能强大的AT89C52单片机可为您提供许多较复杂系统控制应用场合。
AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89C52可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
主要功能特性:
• 兼容MCS51指令系统
• 8k可反复擦写(>1000次)Flash ROM
• 32个双向I/O口
• 256x8bit内部RAM
• 3个16位可编程定时/计数器中断
• 时钟频率0-24MHz
• 2个串行中断
• 可编程UART串行通道
• 2个外部中断源
• 共6个中断源
• 2个读写中断口线
• 3级加密位
• 低功耗空闲和掉电模式
• 软件设置睡眠和唤醒功能
四.实验流程图
(一)实现方法
(1)在设计中利用软件程序延时的方法来控制红(绿)的亮的时间。考虑延时时间较长所以先用T0产生终端然后通过计数的方法来实现延时。利用P1口的P1.1、P1.2、P1.3作为红绿灯控制端口。
(2)南北向的绿灯连在一块,东西向的红灯连在一块,他们一块与P1.1相连。同样南北向的红灯连在一块,东西向的绿灯连在一块,他们一块与P1. 2相连,四个黄灯连在一块与P1.3相连。
(二)流程图
五.硬件设计
1.单片机的结构
单片微机(Single-Chip Microcomputer)简称为单片机。它在一块芯片上集中成了中央处理单元CPU、随机存储器RAM、只读存储器ROM、定时/计数和多功能输入/输出I/O口,如并行口I/O、串行口I/O和转换A/D等。就其组成而言,一块单片机就是一台计算机。由于它具有体积小、功能强和价格便宜等优点,因而被广泛地应用于产品智能化和工业控制自动化上。
2.主要元器件选择
(1). 开关管的选择:BUTTON按钮
(2). LED发光二极管 LED-RED, LED-YELLOW ,LDE-GREEN
(3). 二位一体数码管 7SEG-MPX2-CAT-RED:共阳数码管(红色)
(4). PN4249:驱动三极管
(5). AT89S51系列单片机
3.设计显示部分
LED数码显示部分。LED数码显示部分由七段数码显示管组成。
发光二极管显示原理:
发光二极管是采用砷化镓、镓铝砷和磷化镓等材料制成,其内部结构为一个PN结,具有单向导电性。发光二极管在制作时,使用的材料不同,那么就可以发出不同颜色的光。
当定时器定时为1秒,时程序跳转到时间显示及信号灯显示子程序,它将依次显示信号灯时间 ,同时一直显示信号灯的颜色,这时在返回定时子程序定时一秒,在显示黄灯的下一个时间,这样依次把所有的灯色的时间显示完后在重新给时间计数器赋初值 ,重新进入循环。
六.软件设计
1.单片机中断系统基本结构
中断是一项重要的计算机技术,是处理正常工作与紧急状态的好办法,是实现人机实时交互的重要途径,在单片机应用系统中,中断技术得到了广泛应用。下面详细介绍单片机中断系统基本结构、与中断相关的特殊寄存器的设置及中断应用系统编程方法。
当CPU查询到系统有中断请求时,如果系统处于中断允许状态,CPU将停止当前的工作,响应中断请求,转向中断服务,中断服务完成后,返回原程序继续执行当前任务,这叫单片机中断。
8051系列单片机中断系统结构如图3.7所示。能让CPU产生中断的信号源叫中断源。8051单片机有NT0、INT1、T0、T1、TI、RI六个中断源,但只有EX0、ET0、EX1、ET1、ES五个向量,下面简要介绍六个中断源。
图:单片机中断系统基本结构
INT0、INT1:外部中断源,由P3.2和P3.2引脚输入。具有低电平和脉冲两种触发方式,在每个机器周期的S5P2采样引脚信号,如有效则由硬件将它的中断请求标志IE置1,请求中断。当CPU响应中断时,由硬件复位。
T0、T1:定时/计数器中断,当定时/计数器产生溢出时,置位中断请求标志TF请求中断处理。
RI、TI:串行中断,RI是接收,TI为发送。单片机串行口接收到一个字符后RI置1,发送完一个字符TI置1。值得注意的是,RI、TI在响应中断后,必须由用指令将其复位。
中断响应:
CPU在执行程序的过程中,在每个机器周期的S5P2对中断标志位按中断优先级进行查询,一旦查询到有中断请求,CPU只要不在执行同级或高级的中断服务程序和当前指令(RETI指令或访问IE、IP的指令除外)执行完毕两种情况,则响应中断。如果当前正在执行的指令是RETI或访问IE、IP的指令,则当前指令执行完毕后,CPU才可响应中断。中断响应时间可以从中断信号被查询开始算起,中断响应时间在以下三种情况下,响应时间还会更长:
1CPU正在执行一个比要响应的中断源优先级相等或更高的中断源的中断服务程序,此时须等到中断服务程序执行完毕才可中断响应。
2正在执行的当前指令不是在最后一个机器周期,只有指令执行完后才响应中断。
3如果当前执行的是RETI或访问IE、IP的指令,则当前指令执行完毕后,CPU需再执行一条指令才可以中断响应,因此附加等待响应时间不会超过5个机器周期。
中断入口:
单片机响应中断后,将转向特定的入口进行中断服务,单片机的中断入口地址如表3.2所示。
表3.2 MCS-51单片机中断服务程序入口地址表
从表中可以看出,两相邻中断源的入口地址间隔为8个单元。这意味着如果要把中断源对应的中断服务程序从入口地址开始存放,则程序的长度不能超过8个字节,否则会影响到下一个中断源的入口地址的使用。而通常的情况下,中断服务程序的长度不止8个字节,因此,常见的处理方法是:在入口地址处存放一条无条件转移指令,通过这条转移指令转向对应的中断服务程序入口,中断服务程序以RETI为结束。
中断请求的撤销:
CPU响应中断请求,在中断返回(RETI)之前,该中断请求应被撤除,否则会引发另一次中断。
定时/计数器中断请求撤销:CPU在响应中断后,由硬件自动清除中断请求标志TF。
外部中断请求撤销:如果采用脉冲触发方式,CPU在响应中断后,由硬件自动清除中断请求标志IE;对于电平触发方式的外部中断请求,中断标志的撤销是自动的,由于造成中断请求的低电平继续存在,所以在响应中断后再次会产生中断请求,为此响应中断后要撤销外部信号。
2.每秒钟的设定
延时方法可以有两种一中是利用MCS-51内部定时器才生溢出中断来确定1秒的时间,另一种是采用软延时的方法。
3.计数器初值计算
定时器工作时必须给计数器送计数器初值,这个值是送到TH和TL中的。我们可以把计数器记满为零所需的计数值设定为C和计数初值设定为TC 可得到如下计算通式: TC=M-C
七.实验程序
#include
#define uchar unsigned char
#define uint unsigned int
sbit R1=P2^0; //东西红灯
sbit Y1=P2^1; //东西黄灯
sbit G1=P2^2; //东西绿灯
sbit R2=P2^3; //南北红灯
sbit Y2=P2^4; //南北黄灯
sbit G2=P2^5; //南北绿灯
sbit Z1=P2^6; //南北人行道绿灯
sbit Z2=P2^7; //东西人行道绿灯
sbit K0=P3^0; //全部禁行开关
sbit K1=P3^2; //主干道通行开关
sbit K2=P3^3; //支道通行开关
sbit JG=P3^6; //全部禁行警报
uchar a=0,m,k,h;
uchar code
dis[]={ 0Xc0, 0Xf9, 0Xa4, 0Xb0, 0X99,
0X92, 0X82, 0Xf8, 0X80, 0X90, 0Xff}; //断码
void delay(uchar x) //延时
{
uchar j;
while(x--)
for(j=0;j<120;j++);
}
xianshi() //显示部分
{
while(1)
{
while(1)
{
G1=1;R1=0;Y1=1;JG=0;
G2=0;R2=1;Y2=1;Z2=0;Z1=1;
k=35;h=30;
while(1) //主干道通行35s
{
if(K0==0) break; //判断K0是否被按下,如果按下跳出本循环
P0=0x01;
P1=dis[k/10];
delay(2);
P0=0x02;
P1=dis[k%10];
delay(2);
P0=0x04;
P1=dis[h/10];
delay(2);
P0=0x08;
P1=dis[h%10];
delay(2);
if(k==0) break;
if(h==0)
{
h=5;
G2=1;
R2=1;
Y2=0;
}
}
if(K0==0) break; //再判断一次K0,跳出本循环
G1=0;R1=1;Y1=1;JG=0;
G2=1;R2=0;Y2=1;Z2=1;Z1=0;
k=20;h=25;
while(1) //支道通行25s
{
if(K0==0) break;
P0=0x01;
P1=dis[k/10];
delay(2);
P0=0x02;
P1=dis[k%10];
delay(2);
P0=0x04;
P1=dis[h/10];
delay(2);
P0=0x08;
P1=dis[h%10];
delay(2);
if(h==0) break;
if(k==0)
{
k=5;
G1=1;
R1=1;
Y1=0;
}
}
if(K0==0) break;
}
if(K0==0)
{
while(1) //全部禁止通行
{
G1=1;R1=0;Y1=1;JG=1;P0=0x00;
G2=1;R2=0;Y2=1;Z2=1;Z1=1;
if(K0!=0) break;
}
}
}
}
void zhutong() interrupt 0 //主干道通行,支道禁止通行
{
EX0=0;
m=P2;
if(K1==0)
{
while(1)
{
G1=1;R1=0;Y1=1;JG=0;P0=0x00;
G2=0;R2=1;Y2=1;Z2=0;Z1=1;
if(K1!=0) break;
}
}
P2=m;
EX0=1;
}
void zhitong() interrupt 2 //支道通行,主干道禁止通行
{
EX1=0;
m=P2;
if(K2==0)
{
while(1)
{
G1=0;R1=1;Y1=1;JG=0;P0=0x00;
G2=1;R2=0;Y2=1;Z2=1;Z1=0;
if(K2!=0) break;
}
}
P2=m;
EX1=1;
}
void dss() interrupt 1 //1s的定时
{
a=a+1;
if(a==10)
{
k--;
h--;
a=0;
}
TH0=0x3C; TL0=0xB0;
}
void main()
{
TMOD=0x01;
TH0=0x3C; TL0=0xB0; //6M晶振,100ms初值
ET0=1;
TR0=1;
EA=1;
EX1=1;
EX0=1;
IT0=0;
IT1=0;
PX0=1;PX1=1;
xianshi();
while(1);
}
八.系统仿真
图 Protues仿真
九.参考文献
[1] 张迎新等.单片机初级教程[M].北京:北京航空航天大学出版社,2000。
[2] 王幸之等.AT89系列单片机原理与接口技术[M].北京:北京航空航天大学出版社,2004。
[3] 何立民.单片机高级教程[M].北京:北京航空航天大学出版社,2000。
[4] 李维偍,郭强. 液晶显示应用技术[M].北京:电子工业出版社,2000。
[5] 戴佳,戴卫恒.51单片机C语言应用程序设计实例精讲[M].北京:电子工业出版社,2006.4