第一篇:基于Verilog HDL的交通灯控制器设计
目
录
第一章
设计原理.......................................................................................................................................1
1.1设计要求..........................................................................................................................1
1.2设计思路和原理............................................................................................................................1 1.3实现方法..........................................................................................................................................1 第二章
Verilog HDL程序设计...................................................................................................2
2.1整体设计...........................................................................................................................22.2 具体设计..........................................................................................................................3
第三章
仿真与硬件调试.........................................................................................................................7
3.1 波形仿真..........................................................................................................................7
3.2 硬件调试..........................................................................................................................9
第四章
设计总结.....................................................................................................................10 程序清单.....................................................................................................................................11 参考资料.....................................................................................................................................15
交通灯控制器设计
第一章
设计原理
1.1设计要求
设计一个交通控制器,用LED显示灯表示交通状态,并以7段数码显示器显示当前状态剩余秒数 主干道绿灯亮时,支干道红灯亮;反之亦然,二者交替允许通行,主干道每次放行35s,支干道每次放行25s。每次由绿灯变为红灯的过程中,亮光的黄灯作为过渡,黄灯的时间为5s。能进行特殊状态显示,特殊状态时东西、南北路口均显示红灯状态。用LED灯显示倒计时,并且能实现总体清零功能,计数器由初始状态开始计数,对应状态的显示灯亮。能实现特殊状态的功能显示,1.2设计思路和原理
本次设计是针对十字路口,进行南北和东西直行情况下交通灯控制。设定东西方向为主干道方向,根据交通灯的亮的规则,在初始状态下四个方向的都为红灯亮启,进入正常工作状态后,当主干道上绿灯亮时,支干道上红灯亮,持续35S后,主干道和支干道上的黄灯都亮启,持续5S后,主干道上红灯亮启,支干道上绿灯亮启持续25S,之后主干道和支干道上的黄灯都亮启5s,一个循环完成。循环往复的直行这个过程。其过程如下图所示:
0s主干道方向25s绿灯亮30s红灯亮黄灯亮65s支干道方向0s红灯亮35s绿灯亮黄灯亮60s65s
图1.交通灯点亮时间控制说明
1.3实现方法
本次采用文本编辑法,即利用Verilog HDL语言描述交通控制器,通过状态机计数法,实现设计所要求的交通灯控制及时间显示。设计中用两组红黄绿LED模拟两个方向上的交通灯,用4个7段数码管分别显示两个方向上的交通灯剩余时间,控制时钟由试验箱上频率信号提供。
第二章
Verilog HDL程序设计
2.1整体设计
根据上章设计原理,交通灯控制的关键是各个状态之间的转换和进行适当的时间延时,根据状态机的设计规范,本次设计了三个状态之间的循环转化,其真值表及状态转化图如下所示:
状状00状状00状状10状状11状状01状状01状状11状状10状状状状状状状状状状001状状状状状010状状状状状100状状状状状010状状状状状状状状状状100状状状状状010状状状状状001状状状状状010
图2.交通灯控制状态转化
说明:该状态图为交通灯在正常情况下的状态转化图,进入控制后,状态00时主干道绿灯及支干道红灯亮起,进入状态01后两路黄灯亮起,状态11时主干道红灯及支干道绿灯亮起。进入10状态两路黄灯亮起。结束一个循环,从00状态重新开始循环。
为实现控制与显示的功能,需要设计交通灯点亮顺序控制程序,倒数计时程序,七段数码管显示程序,数码管显示扫描程序,其系统结构图如下所示:
holdrst状状状状1Hz状状状状状状状状状状状状状状状状状状状clk1KHz状状状状状状状1Hz状状状状状状状状状状状状状状状状状状状状状
图3.交通灯控制系统结构图
其中rst为复位信号,clk为时钟信号,hold为特殊情况控制信号,输入hold时两个方向红灯无条件亮起。
2.2 具体设计
根据整体设计要求,编写各个功能部分Verilog HDL程序,设置各输入输出变量说明如下 clk: 为计数时钟; qclk:为扫描显示时钟;
en: 使能信号,为1 的话,则控制器开始工作; rst: 复位信号,为1的话,控制及技术回到初始状态;
hoid:特殊情况控制信号,为1的话,则两个方向无条件显示为红灯;
light1: 控制主干道方向四盏灯的亮灭;其中,light1[0]~light[2],分别控制主干道方向的 绿灯、黄灯和红灯;
light2: 控制支干道方向四盏灯的亮灭;其中,light2[0] ~ light2[2],分别控制支干道方向的 绿灯、黄灯和红灯;
num1: 用于主干道方向灯的时间显示,8 位,可驱动两个数码管; num2: 用于支干道方向灯的时间显示,8 位,可驱动两个数码管; counter:用于数码管的译码输出; st1,st2:数码管扫描信号。输入输出及中间变量设置如下:
module traffic(en,clk,qclk,rst,rst1,hold,num1,num2,light1,light2,counter,st1,st2);input en,clk,qclk,rst,hold,rst1;output st1,st2;output[7:0] num1,num2;output[6:0]counter;output[2:0] light1,light2;reg tim1,tim2,st1,st2;reg[1:0]state1,state2,ste;reg[2:0]light1,light2;reg[3:0]num;reg[6:0]counter;reg[7:0] num1,num2;reg[7:0] red1,red2,green1,green2,yellow1,yellow2;
1.二极管点亮控制
该部分程序的作用是根据计数器的计数值控制发光二极管的亮、灭,以及输出倒计时数值给七段数码管的译码电路。此外,当检测到特殊情况(hold=‘1’)发生时,无条件点亮红灯的二极管,当检测到复位信号,两个方向计数与控制回复到00状态。因为主、支干道两个方向二极管点亮的顺序与延迟时间不同,顾编写两个独立的部分来控制,具体程序如下: 1)主干道方向 always @(posedge clk)begin
if(rst)//复位与特殊情况控制
begin light1<=3'b001;num1<=green1;end else if(hold)begin light1<=3'b100;num1<=green1;end else if(en)
begin //使能有效开始控制计数
if(!tim1)//
begin //主干道交通灯点亮控制
tim1<=1;
case(state1)
2'b00:begin num1<=green1;light1<=3'b001;state1<=2'b01;end
2'b01:begin num1<=yellow1;light1<=3'b010;state1<=2'b11;end
2'b11:begin num1<=red1;light1<=3'b100;state1<=2'b10;end
2'b10:begin num1<=yellow1;light1<=3'b010;state1<=2'b00;end
default:light1<=3'b100;
endcase
end 2)支干道方向
always @(posedge clk)begin
if(rst)//复位与特殊情况控制
begin
light2<=3'b100;
num2<=red2;
end
else if(hold)
begin
light2<=3'b100;
num2<=red2;
end
else if(en)
begin
if(!tim2)
begin
tim2<=1;
case(state1)
2'b00:begin num2<=red2;light2<=3'b100;state2<=2'b01;end
2'b01:begin num2<=yellow1;light2<=3'b010;state2<=2'b11;end
2'b11:begin num2<=green2;light2<=3'b001;state2<=2'b10;end
2'b10:begin num2<=yellow2;light2<=3'b010;state2<=2'b00;end
default:light2<=3'b100;
endcase
end
2.倒数计时
该部分程序完成二极管发光时延的计数,并将计数结果送到数码管显示电路,每切换到一个状态,计数器的初值都被重置,以实现不同颜色二极管不同的时延要求。本次设计直接用逻辑运算完成2位十进制数的计数,未采用分位器的设计。因为主、支干道上计数器的结构完全相同,顾只列出一路的程序,其具体程序如下所示:
always @(posedge clk)begin else begin //倒数计时
if(num1>0)
if(num1[3:0]==0)
begin
num1[3:0]<=4'b1001;
num1[7:4]<=num1[7:4]-1;
end
else num1[3:0]<=num1[3:0]-1;
if(num1==1)tim1<=0;
end
end
else
begin
light1<=3'b010;
num1=2'b00;
tim1<=0;
end
end 3.数码管的译码及扫描显示
该段程序主要完成4个7段数码管的译码显示及扫描,使系统能正常显示主、支干道两个方向上的剩
余时间。译码的时钟频率要低,为Hz级。扫描的时钟频率要高,最低不得小于人眼分辨频率50Hz,具体程序如下所示: always @(posedge qclk)begin //数码管扫描
if(rst1)
begin
st1=0;
st2=0;
end else
begin
case({st2,st1})
2'b00:begin num<=num1[3:0];{st2,st1}<=2'b01;end
2'b01:begin num<=num1[7:4];{st2,st1}<=2'b10;end
2'b10:begin num<=num2[3:0];{st2,st1}<=2'b11;end
2'b11:begin num<=num2[7:4];{st2,st1}<=2'b00;end
endcase
end end
always @(posedge qclk)begin //数码管译码显示 case(num)4'b0000: counter<=7'b0111111;//0 4'b0001: counter<=7'b0000110;//1 4'b0010: counter<=7'b1011011;//2 4'b0011: counter<=7'b1001111;//3 4'b0100: counter<=7'b1100110;//4 4'b0101: counter<=7'b1101101;//5 4'b0110: counter<=7'b1111101;//6 4'b0111: counter<=7'b0000111;//7 4'b1000: counter<=7'b1111111;//8 4'b1001: counter<=7'b1101111;//9 default: counter<=7'b0111111;//0 endcase end endmodule 总体程序见程序清单所示
第三章
仿真与硬件调试
3.1 波形仿真
在QuartursⅡ软件下创建工程,新建编辑设计文件,将程序输入,整体编译后,新建波形仿真文件。设置仿真时间,时钟周期,输入输出端口,进行波形仿真。具体仿真波形图及说明如下所示: 仿真截止时间:100us; 时钟:clk 1us,qclk 0.1us 1.正常工作时波形仿真图
图4.正常工作时波形仿真图
图形说明
波形仿真主要完成了控制与计数以及数码管显示的波形图。en为低电品时,计数器置初值,高电平时开始正常控制与计数。控制发光二极管首次输出为“light1=001,light2=100”,表示主干道路绿灯亮,支杆道路红灯亮,计数器num1和num2从“00110101”开始递减计数,计数至“00000000”时,进入下一个状态,控制输出量为light=010,light2=010,表示主、支干道黄灯均亮起,计数器num1和num2从“00000101”开始计数递减,计数至”00000000”时进入下一个状态,light=100,light2=001,表示主干道路红灯亮,支杆道路绿灯亮。Counter根据num1,num2变化随时钟上升沿输出译码后的数据。由于屏幕显示大小有限,未仿真出一个完整周期。
2.特殊情况仿真波形
图5.特殊情况仿真波形
图形说明
当hold输入高电平时,在时钟上升沿的控制下,light 1与light2被强制置位为”100”,表示两路红灯均亮起 3.复位情况仿真波形
图6.复位情况仿真波形
图形说明
当rst输入高电平时,在时钟上升沿控制下,计数与控制都回到00状态,即light1=001,light2=100,计数器num1和num2从“00110101”开始递减计数。3.2 硬件调试
完成时序仿真确认无误后,进行实验箱管脚设置,注意设置完成后一定要再进行一次全局仿真,使程序真正对应于硬件输出输出。具体连接说明如下所示
输入变量:rst、clk、qclk、hold、en 其中en,hold,rst接”0-1”拨码开关,以稳定的输出可变化的电平。计数时钟clk接实验箱上1Hz时钟,扫描显示时钟qclk接125Khz时钟。
输出变量:light1[2:0]、light2[2:0]、counter[6:0]、st1、st2 其中light1[0]、light2[0]分别接绿色的发光二极管;light1[1]、light2[1] 分别接黄色的发光二极管;light1[2]、light2[2]分别接红色的发光二极管。counter[0]~counter[6],分别接七段数码管的a~f,st1、st2分别接试验箱上”4-16”译码器的低两位。
完成接线后将程序烧写到芯片上,开始功能调试。分辨改变使能信号,复位信号以及特殊情况信号,观察数码管以及发光二级管情况,实物照片如下所示:
图7.硬件实物图
第四章
设计总结
在设计中采用V erilog HDL语言设计交通灯控制系统, 借助其功能强大的语言结构, 简明的代码描述复杂控制逻辑设计, 与工艺无关特性, 在提高工作效率的同时达到求解目的, 并可以通过V erilog HDL 语言的综合工具进行相应硬件电路生成, 具有传统逻辑设计方法所无法比拟的优越性。
在设计过程中,觉得最难的部分是波形仿真部分,虽然程序编译通过但仿真出不了正确的波形,不是计数器无法正常计数,就是控制输出无法进入到下一个状态,每次出现问题就必须返回重新修改程序。实践证明,在编写一个较复杂的程序时,一开始一定要画流程图,弄清楚各个功能及实现它们的逻辑算法,做到心中有数后在开始下笔写编写程序。在编写的时候要尤其要注意语言的规范,如本次设计中编写的V erilog在Quartus7.0中可以正常生成时序图,而在低版本的软件中却无法生成,原因就是语言使用不规范,在解决这个问题时我总结了一些经验,首先程序要逻辑清晰,简洁明了,避免不必要的嵌套与条用,其次要适当地给程序加上注解文字,提高可读性,以方便之后的程序出错时进行查找,最后充分利用仿真软件提供的各项编译工具与报错消息,按图索骥,有方向的完成程序调试。
完成仿真后进行,进行试验箱上的硬件调试,该步骤主要是要求细心,按照引脚清单,逐一完成连线,本次设计用到两个时钟输入,注意一定要选择合适频率的时钟,以便达到期望的效果。注意观察实物的现象,看是否满足设计要求,不满足时检查是硬件问题还是程序问题,如果是程序问题,在修改完之后必须要重新编译,重新烧入。不断排查错误,直至达到满意的效果。
通过这次课程设计,熟悉了简单EDA设计的整个流程,加深了对Verilog HDL硬件描述语言的理解,提高了动手能力,并且锻炼了自己的耐心,收获颇丰,我会把在本次课程设计中学到的东西应用到今后的工作学习中。最后感谢同学及老师提供的帮助与指导。
程序清单
module traffic(en,clk,qclk,rst,rst1,hold,num1,num2,light1,light2,counter,st1,st2);input en,clk,qclk,rst,hold,rst1;output st1,st2;output[7:0] num1,num2;output[6:0]counter;output[2:0] light1,light2;reg tim1,tim2,st1,st2;reg[1:0]state1,state2,ste;reg[2:0]light1,light2;reg[3:0]num;reg[6:0]counter;reg[7:0] num1,num2;reg[7:0] red1,red2,green1,green2,yellow1,yellow2;
always @(en)if(!en)begin //设置计数初值 green1<=8'b00110101;red1<=8'b00100101;yellow1<=8'b00000101;green2<=8'b00100101;red2<=8'b00110101;yellow2<=8'b00000101;end
always @(posedge clk)begin if(rst)//复位与特殊情况控制
begin
light1<=3'b001;num1<=green1;
end else if(hold)
begin
light1<=3'b100;
num1<=green1;
end else if(en)
begin //使能有效开始控制计数
if(!tim1)//开始控制
begin //主干道交通灯点亮控制
tim1<=1;
case(state1)
2'b00:begin num1<=green1;light1<=3'b001;state1<=2'b01;end
2'b01:begin num1<=yellow1;light1<=3'b010;state1<=2'b11;end
2'b11:begin num1<=red1;light1<=3'b100;state1<=2'b10;end
2'b10:begin num1<=yellow1;light1<=3'b010;state1<=2'b00;end
default:light1<=3'b100;
endcase
end
else
begin //倒数计时
if(num1>0)
if(num1[3:0]==0)
begin
num1[3:0]<=4'b1001;
num1[7:4]<=num1[7:4]-1;
end
else num1[3:0]<=num1[3:0]-1;
if(num1==1)tim1<=0;
end
end
else
begin
light1<=3'b010;
num1=2'b00;
tim1<=0;
end
end
always @(posedge clk)begin
if(rst)//复位与特殊情况控制
begin
light2<=3'b100;
num2<=red2;
end
else if(hold)
begin
light2<=3'b100;
num2<=red2;
end
else if(en)
begin
if(!tim2)
begin
tim2<=1;
case(state1)
2'b00:begin num2<=red2;light2<=3'b100;state2<=2'b01;end
2'b01:begin num2<=yellow1;light2<=3'b010;state2<=2'b11;end
2'b11:begin num2<=green2;light2<=3'b001;state2<=2'b10;end
2'b10:begin num2<=yellow2;light2<=3'b010;state2<=2'b00;end
default:light2<=3'b100;
endcase
end
else
begin //倒数计时
if(num2>0)
if(num2[3:0]==0)
begin
num2[3:0]<=4'b1001;
num2[7:4]<=num2[7:4]-1;
end
else num2[3:0]<=num2[3:0]-1;
if(num2==1)tim2<=0;
end
end
else
begin
tim2<=0;
state2<=2'b00;
light2<=3'b010;
end
end
always @(posedge qclk)begin //数码管扫描
if(rst1)
begin
st1=0;
st2=0;
end else
begin
case({st2,st1})
2'b00:begin num<=num1[3:0];{st2,st1}<=2'b01;end
2'b01:begin num<=num1[7:4];{st2,st1}<=2'b10;end
2'b10:begin num<=num2[3:0];{st2,st1}<=2'b11;end
2'b11:begin num<=num2[7:4];{st2,st1}<=2'b00;end
endcase
end end
always @(posedge qclk)begin //数码管译码显示 case(num)4'b0000: counter<=7'b0111111;//0 4'b0001: counter<=7'b0000110;//1 4'b0010: counter<=7'b1011011;//2 4'b0011: counter<=7'b1001111;//3 4'b0100: counter<=7'b1100110;//4 4'b0101: counter<=7'b1101101;//5 4'b0110: counter<=7'b1111101;//6 4'b0111: counter<=7'b0000111;//7 4'b1000: counter<=7'b1111111;//8 4'b1001: counter<=7'b1101111;//9 default: counter<=7'b0111111;//0 endcase end endmodule
参考资料
[1] 夏宇闻.复杂数字电路与系统的V erilog HDL设计技术 [M ].北京: 北京航空航天大学出版社, 1998 [2] 郭梯云.移动通信[M ].西安: 西安电子科技大学出版社, 1995 [3] [法]M ichelMouly, M arie Bernadet te Pautet1GSM 数字移动通信系统[M ].骆健霞, 顾龙信, 徐云霄译.北京: 电子工业出版社, 1996 [4] 张毅刚, 乔立岩.虚拟仪器软件开发环境L abW indow söCV I 610 编程指南[M ].北京: 机械工业出版社, 2002 [5] 刘国权.GSM 手机的测试[J ].中国无线电管理, 2003 [6] 俞定玖, 刘湘慧.GSM 数字蜂窝移动交换系统测试[J ].电信科学, 2000 [7] 张明.V erilog HDL 实用教程[M ].成都: 电子科技大学出版社, 1999 [8] Hyde D C.Bucknell Handbook on V erilog HDL 1Computer Science Department, Bucknell U niversity L ew is burg, 1995 [9] 康华光.电子技术基础(数字部分)[M ].北京: 高等教育出版社, 1988
第二篇:交通灯控制器设计实验报告
设计性实验项目名称
交通灯控制器设计
实验项目学时:3学时
实验要求:■ 必修
□ 选修
一、实验目的
1、学习与日常生活相关且较复杂数字系统设计;
2、进一步熟悉EDA实验装置和QuartusⅡ软件的使用方法;
3、学习二进制码到BCD码的转换;
4、学习有限状态机的设计应用。
二、实验原理
交通灯的显示有很多方式,如十字路口、丁字路口等,而对于同一个路口又 有很多不同的显示要求,比如十字路口,车辆如果只要东西和南北方向通行就很 简单,而如果车子可以左右转弯的通行就比较复杂,本实验仅针对最简单的南北 和东西直行的情况。
要完成本实验,首先必须了解交通路灯的燃灭规律。本实验需要用到实验箱上交通灯模块中的发光二极管,即红、黄、绿各三个。依人们的交通常规,“红灯停,绿灯行,黄灯提醒”。其交通灯的燃灭规律为:初始态是两个路口的红灯全亮之后,主干道的绿灯亮,乡间道路的红灯亮,主干道方向通车,延时一段时间后,乡间公路来车,主干道绿灯灭,黄灯开始闪烁。闪烁若干次后,主干道红灯亮,而同时乡间公路的绿灯亮,延时一段时间后,乡间公路的绿灯灭,黄灯开始闪烁。闪烁若干次后,再切换到主干道方向,重复上述过程。
三、设计要求
完成设计、仿真、调试、下载、硬件测试等环节,在型EDA实验装置上实现一个由一条主干道和一条乡间公路的汇合点形成的十字交叉路口的交通灯控制器功能,具体要求如下:
1、有MR(主红)、MY(主黄)、MG(主绿)、CR(乡红)、CY(乡黄)、CG(乡绿)六盏交通灯需要控制;
2、交通灯由绿转红前有4秒亮黄灯的间隔时间,由红转绿没有间隔时间;
3、乡间公路右侧各埋有一个串连传感器,当有车辆准备通过乡间公路时,发出请求信号S=1,其余时间S=0;
4、平时系统停留在主干道通行(MGCR)状态,一旦S信号有效,经主道黄灯4秒(MYCR)状态后转入乡间公路通行(MRCG)状态,但要保证主干道通行大于一分钟后才能转换;
5、一旦S信号消失,系统脱离MRCG状态,即经乡道黄灯4秒(MRCY)状态进入MGCR状态,即使S信号一直有效,MRCG状态也不得长于20秒钟;
6、控制对象除红绿灯之外,还包括分别在主干道和乡间公路各有一个两位十进制倒计时数码管显示。
四、主要仪器设备
1、微机
1台
1套 1套
2、QuartusII集成开发软件
3、EDA实验装置
五、实验步骤
源程序:
0module traffic1(clk,s,rst,light,sel,SG);input clk,s,rst;output[5:0] light;
output [2:0]sel;output [7:0]SG;reg [5:0] light;reg clk1;reg [3:0] sc;
reg [7:0] count;reg [7:0] cnt,SG;reg [2:0] sel;reg [3:0]a;parameter s0=0,s1=1,s2=2,s3=3,s4=4;initial
begin
count<=8'b01100000;
light<=6'b001100;
sc=s0;
end
always @(posedge clk)begin
begin cnt=cnt+1;
if(cnt==100)begin clk1=1'b1;cnt=0;end
else clk1=1'b0;//100分频,CLK为数码管扫描频率,CLK1为计数频率
if(sel<7)sel=sel+1;else sel=6;
end //sel为数码管选择
begin
case(sel)
7: a=count[3:0];//0数码管为个位
6: a=count[7:4];//1数码管为十位
default: a=0;
endcase
case(a)
0:SG<=8'b00111111;1:SG<=8'b00000110;
2:SG<=8'b01011011;3:SG<=8'b01001111;
4:SG<=8'b01100110;5:SG<=8'b01101101;
6:SG<=8'b01111101;7:SG<=8'b00000111;
8:SG<=8'b01111111;9:SG<=8'b01101111;//8段译码值
default: SG=8'b11111111;
endcase
end end
always @(posedge clk1 or negedge rst)
begin
if(!rst)begin count = 0;sc=s3;end // count set nothing but else 0
else if(count == 0)
begin
case(sc)
s0: begin if(s)begin sc=s1;count = 8'b00000100;light=6'b010100;end else begin sc=s4;count = 8'b01100000;end end
s1: begin count = 8'b00100000;sc=s2;light=6'b100001;end
s2: begin count = 8'b00000100;sc=s3;light=6'b100010;end
s3: begin count = 8'b01100000;sc=s0;light=6'b001100;end
s4: begin if(s)begin sc=s1;count = 8'b00000100;light=6'b010100;end else begin sc = s4;count = 8'b01100000;light<=6'b001100;end end
default begin sc=s0;count =8'h60;end
endcase
end
else
if((sc==s2)&(s==0))begin sc=s3;count = 8'b00000100;light=6'b100010;end
else
if((sc==s4)&(s==1))begin sc=s1;count = 8'b00000100;light=6'b010100;end
else if(count[3:0] == 4'b0000)
begin count = count-7;end
else
begin count = count-1;end
end endmodule
管脚锁定
六、波形仿真
主干道60s倒计时
s信号为1时
七、实验心得
通过本次实验,让我进一步掌握了软件quartus的使用流程,一开始实验时波形仿真是正确的,但在电路上实现时主干道亮黄灯时,乡间道路亮的是绿灯,这显然是不对的,后面发现是管脚锁定时出现了问题,改回来之后就没问题了。管脚锁定时不能粗心,不然很容易出现问题。
曹军
生医121班
第三篇:基于FPGA的交通灯控制器设计
数字系统课程设计
基于FPGA的交通控制灯设计
姓名:
学号:
班级:
摘要
随着社会的发展,城市规模的不断扩大,城市交通成为制约城市发展的一大因素。人口和汽车日益增长,市区交通也日益拥挤,人们的安全问题当然也日益重要。因此,红绿交通信号灯成为交管部门管理交通的重要工具之一。有了交通灯,人们的安全出行也有了很大的保障。自从交通灯诞生以来,其内部的电路控制系统就不断的被改进,设计方法也开始多种多样,从而使交通灯显得更加智能化。尤其是近几年来,随着电子与计算机技术的飞速发展,电子电路分析和设计方法有了很大的改进,电子设计自动化也已经成为现代电子系统中不可或缺的工具和手段,这些都为交通灯控制系统的设计提供了一定的技术基础。本课程设计运用erilog HDL语言描述交通控制器,通过状态机计数法,实现设计所要求的交通灯控制及时间显示,并最后进行了软件实现,达到了系统要求的功能。
设计原理
1.1设计要求
设计一个交通控制器,用LED显示灯表示交通状态,并以7段数码显示器显示当前状态剩余秒数 主干道绿灯亮时,支干道红灯亮;反之亦然,二者交替允许通行,主干道每次放行35s,支干道每次放行25s。每次由绿灯变为红灯的过程中,亮光的黄灯作为过渡,黄灯的时间为5s。能进行特殊状态显示,特殊状态时东西、南北路口均显示红灯状态。用LED灯显示倒计时,并且能实现总体清零功能,计数器由初始状态开始计数,对应状态的显示灯亮。能实现特殊状态的功能显示,1.2设计思路和原理
本次设计是针对十字路口,进行南北和东西直行情况下交通灯控制。设定东西方向为主干道方向,根据交通灯的亮的规则,在初始状态下四个方向的都为红灯亮启,进入正常工作状态后,当主干道上绿灯亮时,支干道上红灯亮,持续35S后,主干道和支干道上的黄灯都亮启,持续5S后,主干道上红灯亮启,支干道上绿灯亮启持续25S,之后主干道和支干道上的黄灯都亮启5s,一个循环完成。循环往复的直行这个过程。其过程如下图所示:
0s主干道方向25s绿灯亮30s红灯亮黄灯亮65s支干道方向0s红灯亮35s绿灯亮黄灯亮60s65s
图1.交通灯点亮时间控制说明
1.3实现方法
本次采用文本编辑法,即利用Verilog HDL语言描述交通控制器,通过状态机计数法,实现设计所要求的交通灯控制及时间显示。设计中用两组红黄绿LED模拟两个方向上的交通灯,用4个7段数码管分别显示两个方向上的交通灯剩余时间,控制时钟由试验箱上频率信号提供。
Verilog HDL程序设计
2.1整体设计
根据上章设计原理,交通灯控制的关键是各个状态之间的转换和进行适当的时间延时,根据状态机的设计规范,本次设计了三个状态之间的循环转化,其真值表及状态转化图如下所示:
状状00状状00状状10状状11状状01状状01状状11状状10状状状状状状状状状状001状状状状状010状状状状状100状状状状状010状状状状状状状状状状100状状状状状010状状状状状001状状状状状010
图2.交通灯控制状态转化
说明:该状态图为交通灯在正常情况下的状态转化图,进入控制后,状态00时主干道绿灯及支干道红灯亮起,进入状态01后两路黄灯亮起,状态11时主干道红灯及支干道绿灯亮起。进入10状态两路黄灯亮起。结束一个循环,从00状态重新开始循环。
为实现控制与显示的功能,需要设计交通灯点亮顺序控制程序,倒数计时程序,七段数码管显示程序,数码管显示扫描程序,其系统结构图如下所示:
holdrst状状状状1Hz状状状状状状状状状状状状状状状状状状状clk1KHz状状状状状状状1Hz状状状状状状状状状状状状状状状状状状状状状 图3.交通灯控制系统结构图
其中rst为复位信号,clk为时钟信号,hold为特殊情况控制信号,输入hold时两个方向红灯无条件亮起。
2.2 具体设计
根据整体设计要求,编写各个功能部分Verilog HDL程序,设置各输入输出变量说明如下 clk: 为计数时钟; qclk:为扫描显示时钟;
en: 使能信号,为1 的话,则控制器开始工作; rst: 复位信号,为1的话,控制及技术回到初始状态;
hoid:特殊情况控制信号,为1的话,则两个方向无条件显示为红灯;
light1: 控制主干道方向四盏灯的亮灭;其中,light1[0]~light[2],分别控制主干道方向的 绿灯、黄灯和红灯;
light2: 控制支干道方向四盏灯的亮灭;其中,light2[0] ~ light2[2],分别控制支干道方向的 绿灯、黄灯和红灯;
num1: 用于主干道方向灯的时间显示,8 位,可驱动两个数码管; num2: 用于支干道方向灯的时间显示,8 位,可驱动两个数码管; counter:用于数码管的译码输出; st1,st2:数码管扫描信号。输入输出及中间变量设置如下:
module traffic(en,clk,qclk,rst,rst1,hold,num1,num2,light1,light2,counter,st1,st2);input en,clk,qclk,rst,hold,rst1;output st1,st2;output[7:0] num1,num2;output[6:0]counter;output[2:0] light1,light2;reg tim1,tim2,st1,st2;reg[1:0]state1,state2,ste;reg[2:0]light1,light2;reg[3:0]num;reg[6:0]counter;reg[7:0] num1,num2;reg[7:0] red1,red2,green1,green2,yellow1,yellow2;
1.二极管点亮控制
该部分程序的作用是根据计数器的计数值控制发光二极管的亮、灭,以及输出倒计时数值给七段数码管的译码电路。此外,当检测到特殊情况(hold=‘1’)发生时,无条件点亮红灯的二极管,当检测到复位信号,两个方向计数与控制回复到00状态。因为主、支干道两个方向二极管点亮的顺序与延迟时间不同,顾编写两个独立的部分来控制,具体程序如下: 1)主干道方向 always @(posedge clk)begin
if(rst)//复位与特殊情况控制
begin light1<=3'b001;num1<=green1;end else if(hold)begin light1<=3'b100;num1<=green1;end else if(en)
begin //使能有效开始控制计数
if(!tim1)//
begin //主干道交通灯点亮控制
tim1<=1;
case(state1)
2'b00:begin num1<=green1;light1<=3'b001;state1<=2'b01;end
2'b01:begin num1<=yellow1;light1<=3'b010;state1<=2'b11;end
2'b11:begin num1<=red1;light1<=3'b100;state1<=2'b10;end
2'b10:begin num1<=yellow1;light1<=3'b010;state1<=2'b00;end
default:light1<=3'b100;
endcase
end 2)支干道方向
always @(posedge clk)begin
if(rst)//复位与特殊情况控制
begin
light2<=3'b100;
num2<=red2;
end
else if(hold)
begin
light2<=3'b100;
num2<=red2;
end
else if(en)
begin
if(!tim2)
begin
tim2<=1;
case(state1)
2'b00:begin num2<=red2;light2<=3'b100;state2<=2'b01;end
2'b01:begin num2<=yellow1;light2<=3'b010;state2<=2'b11;end
2'b11:begin num2<=green2;light2<=3'b001;state2<=2'b10;end
2'b10:begin num2<=yellow2;light2<=3'b010;state2<=2'b00;end
default:light2<=3'b100;
endcase
end
2.倒数计时
该部分程序完成二极管发光时延的计数,并将计数结果送到数码管显示电路,每切换到一个状态,计数器的初值都被重置,以实现不同颜色二极管不同的时延要求。本次设计直接用逻辑运算完成2位十进制数的计数,未采用分位器的设计。因为主、支干道上计数器的结构完全相同,顾只列出一路的程序,其具体程序如下所示:
always @(posedge clk)begin else begin //倒数计时
if(num1>0)
if(num1[3:0]==0)
begin
num1[3:0]<=4'b1001;
num1[7:4]<=num1[7:4]-1;
end
else num1[3:0]<=num1[3:0]-1;
if(num1==1)tim1<=0;
end
end
else
begin
light1<=3'b010;
num1=2'b00;
tim1<=0;
end end
3.数码管的译码及扫描显示
该段程序主要完成4个7段数码管的译码显示及扫描,使系统能正常显示主、支干道两个方向上的剩余时间。译码的时钟频率要低,为Hz级。扫描的时钟频率要高,最低不得小于人眼分辨频率50Hz,具体程序如下所示: always @(posedge qclk)begin //数码管扫描
if(rst1)
begin
st1=0;
st2=0;
end else
begin
case({st2,st1})
2'b00:begin num<=num1[3:0];{st2,st1}<=2'b01;end
2'b01:begin num<=num1[7:4];{st2,st1}<=2'b10;end
2'b10:begin num<=num2[3:0];{st2,st1}<=2'b11;end
2'b11:begin num<=num2[7:4];{st2,st1}<=2'b00;end
endcase
end end always @(posedge qclk)begin //数码管译码显示 case(num)4'b0000: counter<=7'b0111111;//0 4'b0001: counter<=7'b0000110;//1 4'b0010: counter<=7'b1011011;//2 4'b0011: counter<=7'b1001111;//3 4'b0100: counter<=7'b1100110;//4 4'b0101: counter<=7'b1101101;//5 4'b0110: counter<=7'b1111101;//6 4'b0111: counter<=7'b0000111;//7 4'b1000: counter<=7'b1111111;//8 4'b1001: counter<=7'b1101111;//9 default: counter<=7'b0111111;//0 endcase end endmodule 总体程序见程序清单所示
仿真与硬件调试
3.1 波形仿真
在QuartursⅡ软件下创建工程,新建编辑设计文件,将程序输入,整体编译后,新建波形仿真文件。设置仿真时间,时钟周期,输入输出端口,进行波形仿真。具体仿真波形图及说明如下所示: 仿真截止时间:100us; 时钟:clk 1us,qclk 0.1us 1.正常工作时波形仿真图
图4.正常工作时波形仿真图
图形说明
波形仿真主要完成了控制与计数以及数码管显示的波形图。en为低电品时,计数器置初值,高电平时开始正常控制与计数。控制发光二极管首次输出为“light1=001,light2=100”,表示主干道路绿灯亮,支杆道路红灯亮,计数器num1和num2从“00110101”开始递减计数,计数至“00000000”时,进入下一个状态,控制输出量为light=010,light2=010,表示主、支干道黄灯均亮起,计数器num1和num2从“00000101”开始计数递减,计数至”00000000”时进入下一个状态,light=100,light2=001,表示主干道路红灯亮,支杆道路绿灯亮。Counter根据num1,num2变化随时钟上升沿输出译码后的数据。由于屏幕显示大小有限,未仿真出一个完整周期。
2.特殊情况仿真波形
图5.特殊情况仿真波形
图形说明
当hold输入高电平时,在时钟上升沿的控制下,light 1与light2被强制置位为”100”,表示两路红灯均亮起
3.复位情况仿真波形
图6.复位情况仿真波形
图形说明
当rst输入高电平时,在时钟上升沿控制下,计数与控制都回到00状态,即light1=001,light2=100,计数器num1和num2从“00110101”开始递减计数。3.2 硬件调试
完成时序仿真确认无误后,进行实验箱管脚设置,注意设置完成后一定要再进行一次全局仿真,使程序真正对应于硬件输出输出。具体连接说明如下所示
输入变量:rst、clk、qclk、hold、en 其中en,hold,rst接”0-1”拨码开关,以稳定的输出可变化的电平。计数时钟clk接实验箱上1Hz时钟,扫描显示时钟qclk接125Khz时钟。
输出变量:light1[2:0]、light2[2:0]、counter[6:0]、st1、st2 其中light1[0]、light2[0]分别接绿色的发光二极管;light1[1]、light2[1] 分别接黄色的发光二极管;light1[2]、light2[2]分别接红色的发光二极管。counter[0]~counter[6],分别接七段数码管的a~f,st1、st2分别接试验箱上”4-16”译码器的低两位。
完成接线后将程序烧写到芯片上,开始功能调试。分辨改变使能信号,复位信号以及特殊情况信号,观察数码管以及发光二级管情况。
程序清单
module traffic(en,clk,qclk,rst,rst1,hold,num1,num2,light1,light2,counter,st1,st2);input en,clk,qclk,rst,hold,rst1;output st1,st2;output[7:0] num1,num2;output[6:0]counter;output[2:0] light1,light2;reg tim1,tim2,st1,st2;reg[1:0]state1,state2,ste;reg[2:0]light1,light2;reg[3:0]num;reg[6:0]counter;reg[7:0] num1,num2;reg[7:0] red1,red2,green1,green2,yellow1,yellow2;
always @(en)if(!en)begin //设置计数初值 green1<=8'b00110101;red1<=8'b00100101;yellow1<=8'b00000101;green2<=8'b00100101;red2<=8'b00110101;yellow2<=8'b00000101;end
always @(posedge clk)begin if(rst)//复位与特殊情况控制
begin
light1<=3'b001;num1<=green1;
end else if(hold)
begin
light1<=3'b100;
num1<=green1;
end
else if(en)
begin //使能有效开始控制计数
if(!tim1)//开始控制
begin //主干道交通灯点亮控制
tim1<=1;
case(state1)
2'b00:begin num1<=green1;light1<=3'b001;state1<=2'b01;end
2'b01:begin num1<=yellow1;light1<=3'b010;state1<=2'b11;end
2'b11:begin num1<=red1;light1<=3'b100;state1<=2'b10;end
2'b10:begin num1<=yellow1;light1<=3'b010;state1<=2'b00;end
default:light1<=3'b100;
endcase
end
else
begin //倒数计时
if(num1>0)
if(num1[3:0]==0)
begin
num1[3:0]<=4'b1001;
num1[7:4]<=num1[7:4]-1;
end
else num1[3:0]<=num1[3:0]-1;
if(num1==1)tim1<=0;
end
end
else
begin
light1<=3'b010;
num1=2'b00;
tim1<=0;
end
end
always @(posedge clk)begin
if(rst)//复位与特殊情况控制
begin
light2<=3'b100;
num2<=red2;
end
else if(hold)
begin
light2<=3'b100;
num2<=red2;
end
else if(en)
begin
if(!tim2)
begin
tim2<=1;
case(state1)
2'b00:begin num2<=red2;light2<=3'b100;state2<=2'b01;end
2'b01:begin num2<=yellow1;light2<=3'b010;state2<=2'b11;end
2'b11:begin num2<=green2;light2<=3'b001;state2<=2'b10;end
2'b10:begin num2<=yellow2;light2<=3'b010;state2<=2'b00;end
default:light2<=3'b100;
endcase
end
else
begin //倒数计时
if(num2>0)
if(num2[3:0]==0)
begin
num2[3:0]<=4'b1001;
num2[7:4]<=num2[7:4]-1;
end
else num2[3:0]<=num2[3:0]-1;
if(num2==1)tim2<=0;
end
end
else
begin
tim2<=0;
state2<=2'b00;
light2<=3'b010;
end
end
always @(posedge qclk)begin //数码管扫描
if(rst1)
begin
st1=0;
st2=0;
end else
begin
case({st2,st1})
2'b00:begin num<=num1[3:0];{st2,st1}<=2'b01;end
2'b01:begin num<=num1[7:4];{st2,st1}<=2'b10;end
2'b10:begin num<=num2[3:0];{st2,st1}<=2'b11;end
2'b11:begin num<=num2[7:4];{st2,st1}<=2'b00;end
endcase
end end always @(posedge qclk)begin //数码管译码显示 case(num)4'b0000: counter<=7'b0111111;//0 4'b0001: counter<=7'b0000110;//1 4'b0010: counter<=7'b1011011;//2 4'b0011: counter<=7'b1001111;//3 4'b0100: counter<=7'b1100110;//4 4'b0101: counter<=7'b1101101;//5 4'b0110: counter<=7'b1111101;//6 4'b0111: counter<=7'b0000111;//7 4'b1000: counter<=7'b1111111;//8 4'b1001: counter<=7'b1101111;//9 default: counter<=7'b0111111;//0 endcase end endmodule
总结
在设计中采用V erilog HDL语言设计交通灯控制系统, 借助其功能强大的语言结构, 简明的代码描述复杂控制逻辑设计, 与工艺无关特性, 在提高工作效率的同时达到求解目的, 并可以通过V erilog HDL 语言的综合工具进行相应硬件电路生成, 具有传统逻辑设计方法所无法比拟的优越性。
在设计过程中,觉得最难的部分是波形仿真部分,虽然程序编译通过但仿真出不了正确的波形,不是计数器无法正常计数,就是控制输出无法进入到下一个状态,每次出现问题就必须返回重新修改程序。实践证明,在编写一个较复杂的程序时,一开始一定要画流程图,弄清楚各个功能及实现它们的逻辑算法,做到心中有数后在开始下笔写编写程序。在编写的时候要尤其要注意语言的规范,如本次设计中编写的V erilog在Quartus8.1中可以正常生成时序图,而在低版本的软件中却无法生成,原因就是语言使用不规范,在解决这个问题时我总结了一些经验,首先程序要逻辑清晰,简洁明了,避免不必要的嵌套与条用,其次要适当地给程序加上注解文字,提高可读性,以方便之后的程序出错时进行查找,最后充分利用仿真软件提供的各项编译工具与报错消息,按图索骥,有方向的完成程序调试。
完成仿真后进行,进行试验箱上的硬件调试,该步骤主要是要求细心,按照引脚清单,逐一完成连线,本次设计用到两个时钟输入,注意一定要选择合适频率的时钟,以便达到期望的效果。注意观察实物的现象,看是否满足设计要求,不满足时检查是硬件问题还是程序问题,如果是程序问题,在修改完之后必须要重新编译,重新烧入。不断排查错误,直至达到满意的效果。
通过这次课程设计,熟悉了简单EDA设计的整个流程,加深了对Verilog HDL硬件描述语言的理解,提高了动手能力,并且锻炼了自己的耐心,收获颇丰,我会把在本次课程设计中学到的东西应用到今后的工作学习中。
参考资料
[1] 夏宇闻.复杂数字电路与系统的V erilog HDL设计技术 [M ].北京: 北京航空航天大学出版社, 1998 [2] 郭梯云.移动通信[M ].西安: 西安电子科技大学出版社, 1995 [3] [法]M ichelMouly, M arie Bernadet te Pautet1GSM 数字移动通信系统[M ].骆健霞, 顾龙信, 徐云霄译.北京: 电子工业出版社, 1996 [4] 张毅刚, 乔立岩.虚拟仪器软件开发环境L abW indow söCV I 610 编程指南[M ].北京: 机械工业出版社, 2002 [5] 刘国权.GSM 手机的测试[J ].中国无线电管理, 2003 [6] 俞定玖, 刘湘慧.GSM 数字蜂窝移动交换系统测试[J ].电信科学, 2000 [7] 张明.V erilog HDL 实用教程[M ].成都: 电子科技大学出版社, 1999 [8] Hyde D C.Bucknell Handbook on V erilog HDL 1Computer Science Department, Bucknell U niversity L ew is burg, 1995 [9] 康华光.电子技术基础(数字部分)[M ].北京: 高等教育出版社, 1988
第四篇:基于单片机AT89C51的交通灯控制器的设计
2014届本科生毕业设计
分类号:TP368.1
题目:基于单片机AT89C51的交通灯控制器的设计
姓 名: 张建猛 学 号 : 2010080870 学 院: 机械与电子工程学院 专 业: 自动化 指导教师职称: 胡波 刘明
指导教师职称: 助教(硕士)工程师
2014-05-11
摘 要
本文采用AT89C51单片机芯片为核心控制器件设计的交通灯控制器,该系统主要包括单片机最小系统,按键,数码管显示,交通灯演示系统。系统主要具有有人行道,交通灯的基本功能,倒计时,紧急情况处理,根据具体情况手动控制等功能。通过AT89C51并接数码管和发光二极管来实现交通灯的变化规律,P1口设置红,绿灯点亮时间功能的实现;红绿灯循环点亮,倒计时剩余10秒时黄灯闪烁警示。本系统的研发周期短,可靠性高,实用性,操作简单,维护方便,扩展功能强大。本系统软硬件相结合,通过Proteus软件仿真,基本实现了交通信号灯的模拟。
关键词:AT89C51;数码管;交通灯控制器
ABSTRACT In this paper, AT89C51 chip as the core control device design traffic light controller, the system includes smallest single-chip system, keyboard, digital display, traffic lights demonstration system.System mainly has a sidewalk, the basic functions of traffic lights, countdown, emergency treatment, according to the specific circumstances of manual control and other functions.And connected via AT89C51 LED digital tube and realized traffic lights change, P1 port settings of red, green lighting time function is implemented;traffic light cycle light, countdown 10 seconds remaining yellow flashing warning.The system development cycle is short, high reliability, practicality, simple operation, easy maintenance, expansion and powerful.This system combines hardware and software, Through the Proteus Software Simulation,the basic realization of traffic lights simulation.Keywords: AT89C51;System;Digital pipe;Traffic light controller
目录
绪
论...........................................................................................................................1 1.整体方案设计...........................................................................................................2 1.1 方案分析.........................................................................................................2 1.2 方案确立.........................................................................................................3 2.系统的硬件设计.......................................................................................................3
2.1设计原理及方法..............................................................................................3 2.2 AT89C51单片机最小系统..............................................................................4 2.2.1 复位电路..............................................................................................4 2.2.2 时钟电路..............................................................................................5 2.2.2 EA脚的功能及接法.............................................................................6 2.3其它硬件模块介绍及连接..............................................................................7
2.3.1 倒计时显示模块.................................................................................7
2.3.2 交通灯显示模块................................................................................8
2.3.3 按键控制模块......................................................................................9 2.3.4 电源模块............................................................................................10 3.系统的软件设计.....................................................................................................10
3.1系统相关参数计算........................................................................................10 3.1.1 T0的计数初值...................................................................................10 3.1.2 倒计时显示的理论分析....................................................................10 3.1.2 交通灯状态显示的理论分析............................................................11 3.2系统主程序设计............................................................................................11 4.系统的 Proteus软件仿真....................................................................................12 4.1 Proteus仿真图............................................................................................12 4.2 Proteus仿真的结果分析............................................................................12 结束语.........................................................................................................................14 参考文献.....................................................................................................................14 致 谢.........................................................................................................................15 附录:程序源代码.....................................................................................................16
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
绪 论
随着人口的迅速增长,道路资源的有限性和交通工具爆炸性的发展,城市交通正面临着严峻考验,因此造成日益严重的交通问题,每天的交通拥堵成了家常便饭但又不得不忍受。在这种情况下,与我国城市道路交通的实际情况相结合,开发出适合我们自身特点的智能信号灯控制系统已成为一个主要的任务。一个好的交通灯控制系统,将给道路拥堵,违章行驶等方面给予技术创新。随着电子技术的发展,采用单片机技术,能够智能管理交通灯,已成为目前广泛使用的方法。
在人类的生活,工作环境中,交通扮演着极其重要的角色,人们的出行与交通时时刻刻打着交道。城市交通控制系统是基于城市交通信号控制技术为主导的发展,与汽车行业的发展并行。在其发展的不同阶段,由于交通出现的各种矛盾,人们总是试图把各个历史阶段的最新科技成果应用到交通自动控制中,从而促进交通自动控制技术不断发展。
早在1850年,城市交叉路口处安全和拥堵问题引起人们的关注,全球第一个自动交通灯诞生,打开城市交通控制的序幕。在1868年,英国工程师娜奕特在伦敦西部威斯敏斯特街口安装一个红色和绿色煤气照明灯,用来控制交叉路口的马车通行,但一次煤气爆炸事故致使交通信号灯消失了近半个世纪。1914年,美国克利夫兰,纽约和芝加哥重新出现的交通信号灯,他们使用电动驱动,与现在意义的交通信号灯几乎是一样的。随着时代的发展,各种运输方式和交通管制的需要,第一光名副其实的三色灯(红,黄,绿)出生于1918年。它的周围是三色圆形投影机被安装在纽约市五号街一座高塔上,由于它的诞生,城市交通大大改善。
在近一个世纪的发展,道路交通信号控制系统经历了一个手动到自动,从固定到灵活配时,从无感应控制到有感应控制,从单点控制到干线控制,从区域控制到网络控制的长期过程。
交通网络是城市的动脉,是一个城市的生活经济水平,工业文明的象征。交通关系到人民对财产,安全和时间相关的利益。凭借优良科学的交通控制技术对资源物流和人们出行是非常有价值的,确保交通安全线的畅通,才能确保舒适的出行,物流按时到位,甚至是生命通道延伸。为了确保安全,高效的交通秩序,除了制定一系列的交通规则,而且还必须通过一定的技术手段来实现。随着单片机和传感器技术的迅速发展,自动检测领域发生了翻天覆地的变化,交通自动检测控制研究已经取得了显着的进步,必将以其优良的性能价格比,逐步取代传统的交通控制措施。
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
1.整体方案设计
1.1 方案分析
交通灯一般设在城市道路的十字路口,可以分为东西方向(主干道)和南北方向(次干道),东西南北四个路口均设有有红绿黄3种灯和1个二位数码显示管。在某一时刻规定只有一个方向可以通行,另一方向被禁行,状态经过一定的过渡时间,将通行方向和禁行方向相互对换。其具体状态如下图所示。(白色表示灭)。通过具体的路口交通灯状态的演示分析我们可以把这四个状态归纳如图1:
图1 交通灯状态图
·东西方向(主干道)红灯灭,同时绿灯亮,南北方向(次干道)黄灯灭,同时红灯亮,倒计时显示60秒。在此种状态下,东西方向(主干道)允许通行,南北方向(次干道)禁止通行。
·东西方向(主干道)绿灯灭,同时黄灯闪烁,南北方向(次干道)红灯亮,倒计时显示10秒。在此种状态下,除了正在通行中的车辆外,其他所有的车辆都应该等待状态转换。
·南北方向(次干道)红灯灭,同时绿灯亮,东西方向(主干道)黄灯灭,同时红灯亮,倒计时50秒。在此种状态下,东西方向(主干道)禁止通行,南北向允许通行。
·南北方向(次干道)绿灯灭,同时黄灯闪烁,东西方向(主干道)红灯亮,倒计时10秒。在此种状态下,除了正在通行中的车辆外,其他所有车辆都应该等待状态转换。
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
1.2 方案确立
本设计系统以AT89C51单片机为控制核心,连接成最小系统,由倒计时显示模块、交通灯显示模块、按键开关控制模块组成。软件部分使用的是C 语言编程,由软件设置交通灯的初始时间,东西方向(主干道)通行60秒,南北方向(支干道)通行50秒,数码管采用动态显示,P0口送字形码,P2口送字位选通信号,通过单片机的P1口控制各种信号灯的点亮与熄灭,采用中断方式实现各按键的功能。
2.系统的硬件设计
2.1 设计原理及方法
本设计采用模块化的分层次设计方法,以单片机AT 89C 51为控制核心,连接成最小系统,由倒计时显示模块、交通灯显示模块、按键开关控制模块等组成。系统的总体框图如下所示。
图2 交通灯控制器框图
本系统采用AT89C51单片机及外围器件构成最小控制系统,12个发光二极管分成4组红绿黄三色灯构成信号灯指示模块,4个数码管东西南北方向各一个构成倒计时显示模块,通过四个按键K0、K1、K2、K3模拟控制交通灯东西通行,南北通行,返回,紧急情况各个交通灯工作情况之间相互转化。
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
2.2 AT89C51单片机最小系统
单片机最小系统一般有晶振、复位、电源、系统的输入控制、输出显示,以及其他外围模块(如通信、数据采集等)等模块组成。2.2.1 复位电路
单片机复位电路原理是在单片机的复位引脚RST上外接电阻和电容,实现上电复位。当复位电平持续两个机器周期以上时复位有效。复位电平的持续时间必须大于单片机的两个机器周期。具体数值可以由RC电路计算出时间常数。复位电路由手动复位和上电复位两部分组成。
(1)上电复位电路要求接通电源后,通过外部电容充电来实现单片机自动复位操作。上电瞬间RESET引脚获得高电平,随着电容的充电,RERST引脚的高电平将逐渐下降。RERST引脚的高电平只要能保持足够的时间(2个机器周期),单片机就可以进行复位操作。
(2)手动复位:手动复位就是在复位电容上并联一个开关,当开关按下时电容被放电、RST也被拉到高电平,而且由于电容的充电,会保持一段时间的高电平来使单片机复位。单片机复位期间不产生ALE和PSEN信号,即ALE=1和PSEN=1。这表明单片机复位期间不会有任何取指操作。
图3 单片机手动复位电路
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
2.2.2 时钟电路
单片机系统里都有晶振,在单片机系统里晶振作用非常大,全称叫晶体振荡器,它结合单片机内部电路产生单片机所需的时钟频率,单片机晶振提供的时钟频率越高,那么单片机运行速度就越快,单片机的一切指令的执行都是建立在单片机晶振提供的时钟频率。单片机晶振的作用是为系统提供基本的时钟信号。单片机的时钟电路由外接的一只晶振和两只起振电容,以及单片机内部的时钟电路组成,晶振的频率越高,单片机处理数据的速度越快,系统功耗也会相应增加,稳定性也会下降。
单片机的时钟电路设计有两种方式,一种是内部时钟方式,一种是外部时钟方式。
在内部时钟方式下单片机内部的高增益、反相放大器通过XTAL1、XTAL2外接作为反馈元件的外部晶体管振荡器与电容组成的并联谐振回路构成一个稳定的自激振荡器,向内部时钟电路提供振荡时钟。振荡器的频率主要取决于晶体的振荡频率。外部时钟方式是把外部已有的时钟信号引入到单片机内。此方式常用于多片单片机同时工作,以便于各单片机的同步。一般要求外部信号高电平的持续时间大于20μs,且为频率低于12MHz的方波。本设计采用内部时钟方式,单片机系统常用的晶振频率有6MHz、11.0592MHz、12MHz、本系统采用11.0592MHz晶振,电容选22pF或30pF均可。
图4 单片机时钟电路
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
2.2.2 EA脚的功能及接法
AT89C51 单片机的EA/VPP(31 脚)是内部和外部程序存储器的选择管脚。当EA 保持高电平时,单片机访问内部程序存储器;当EA 保持低电平时,则不管是否有内部程序存储器,只访问外部存储器。由于现在单片机内部的flash容量都很大,因此基本都是从内部的存储器读取程序,即不需要外接ROM来存储程序,因此,EA脚必须接高电平。
图5 单片机最小系统
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
2.3 其它硬件模块介绍及连接 2.3.1 倒计时显示模块
系统要求南北和东西方向的信号灯时间不一样,所以就利用单片机的P0口送出数据的段码,位选信号用P2口送出,用动态扫描的方法显示东西、南北的倒计时间。7段数码管一般由8个发光二极管组成,其中由7个细长的发光二极管组成数字显示,另外一个圆形的发光二极管显示小数点。当发光二极管导通时,相应的一个点或一个笔画发光。控制相应的二极管导通,就能显示出各种字符。本设计采用共阴数码管,需要接上470欧上拉电阻以提供足够大的电流来驱动数码管,数码管的每段的电流是约10毫安。
图6 数码管显示模块
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
2.3.2 交通灯显示模块
本系统利用单片机的P1口来驱动和控制各种信号灯的燃亮和燃亮时间,在实际中,交通灯的信号灯需要用高电压控制,在这里我们只是模拟一下它的控制信号,所以我们就只用单片机的信号引脚直接来控制发光二极管。发光二极管是半导体二极管的一种,可以把电能转化成光能,常简写为LED。发光二极管与普通二极管一样是由一个PN结组成,也具有单向导电性。当给发光二极管加上正向电压后,从P区注入到N区的空穴和由N区注入到P区的电子,在PN结附近数微米内分别与N区的电子和P区的空穴复合,产生自发辐射的荧光。不同的半导体材料中电子和空穴所处的能量状态不同。当电子和空穴复合时释放出的能量多少不同,释放出的能量越多,则发出的光的波长越短。常用的是发红光、绿光或黄光的二极管。发光二极管的反向击穿电压约5伏。它的正向伏安特性曲线
很陡,使用时必须串联限流电阻以控制通过管子的电流。
图7 交通灯模块
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
2.3.3 按键控制模块
本系统设置了有4个键:K0键,K1键,K2键,K3键。每个按键一端接地,另一端接上二极管。低电平有效,当按键按下端口接地,单片机捕获到低电平,从而得到相应的输入信息。本系统采用了二极管做开关,是为了防止有一按键被按下3根线同时被低,中断无效。二极管在正向电压作用下电阻很小,处于导通状态,相当于一只接通的开关;在反向电压作用下,电阻很大,处于截止状态,如同一只断开的开关。利用二极管的开关特性,可以组成各种逻辑电路。
程序开始运行先东西段通行、南北段禁止60s,后南北段通行、东西段禁止50s,依此循环。系统分三种工作模式:南北通行模式、东西通行模式、返回模式、紧急情况模式,并且通过四个按键K0、K1、K2、K3实现之间的相互转化。
图8 按键控制模块
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
2.3.4 电源模块
单片机工作时需要的+5V电压,所以在设计电源电路时,需要一个电子元件能提供+5V电压,由于78L05能够提供5V电压的三端稳压电源,78L05一脚为电源输入端,二脚为公共接地端,三脚即为我们所需要的+5V电压输出端.本系统采用典型的78L05提供电压的电路,即在78L05的1脚和公共接地端(即2脚)之间接入0.3μF的电容,在公共接地端和三脚+5V电压输出端之间接入0.1μF的电容.图9 电源模块
3.系统的软件设计
3.1 系统相关参数计算 3.1.1 T0的计数初值
T0的计数初值:X=216-12*50*1000/12=15536=3CB0H 3.1.2 倒计时显示的理论分析
倒计时显示的理论分析:利用定时器中断,设TH0=TH1=(65536-50000)/256,即每0.05秒中断一次。每到第20次中断即过了20*0.05秒=1秒时,使时间的计数值减1,便实现了倒计时的功能。
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
3.1.2 交通灯状态显示的理论分析
状态灯显示的理论分析:黄灯闪烁同样可以利用定时器中断。每到第10次中断即过了10*0.05秒=0.5秒时,使黄灯标志位反置,即可让黄灯1秒闪烁一次。
3.2 系统主程序设计
本系统采用AT89C51单片机实现交通灯的控制,程序的编写用C语言来完成。系统控制程序可以分为若干模块:初始化程序,按键开关控制程序,交通灯转换控制程序,LED数码管显示程序,按键消抖动程序,延时程序,中断服务子程序等。系统相应的程序流程如图所示。
图10 程序流程图
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
4.系统的 Proteus软件仿真
4.1 Proteus仿真图
交通灯控制系统的仿真是通过 proteus 软件实现的交通灯控制系统仿真效果,仿真如下图9所示:
图11 仿真图
4.2 Proteus仿真的结果分析
Proteus仿真实现东西方向和南北方向的十字路口的车辆相互交替通过,东西方向(主干道)每次通行时间设置为60秒、南北方向(次干道)通行时间设置为50秒。同时可以实现红灯、黄灯、绿灯各状态之间的相互转换,黄灯闪烁时间设置为10秒,数码管可以准确进行倒计时显示。按下东西放行键K0,东西方向(主干道)绿灯亮,南北方向(次干道)红灯亮;按下南北放行键K1,南北方向(次干道)绿灯亮,东西方向(主干道)红灯亮;无论在任何时候按下返回键K2,该控制系统都将返回到初始状态;若遇紧急情况,按下紧急情况按键K3,东西南北方向都亮红灯,实现主干道和支干道全部禁止通行;模拟了控制交通灯东西方向(主干道)通行,南北方向(次干道)通行,返回,紧急情况各个交通灯工作情况之间相互转化,实现了课程设计的要求。宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
结束语
通过这次毕业设计,使我受益匪浅。使我在软硬件结合的综合运用能力上有了进一步的提升,对课堂上所学的单片机知识有了进一步的加深和巩固,在C语言的掌握方面也向前迈了一大步,在老师和同学的帮助下,提高了个人分析解决实际问题的综合能力以及协同合作的能力,同时还锻炼了我查阅资料的能力、动手能力、发现问题、解决问题的能力。面对电脑搜索资料,一点点,一块块的电路慢慢拼成完整的电路经过一次次的反复修改终于设计出了属于自己的程序和电路,虽然还有诸多不足之处,不过使自己真正的体会到了探索事物的奥秘的快乐,同时自己也更深入的了解到了单片机的巨大的潜力,虽然有的时候可能遇到了一些困难,但是我最终解决了,我也会感觉到成功给我带来的喜悦,我知道我在专业知识上的掌握还是远远不够的,我还要更加努力的去学习,提高自己了实践能力。
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
参考文献
[1] 杨素行.模拟电子技术[M].北京:高等教育出版社.2006 [2] 余孟尝.数字电子技术[M].北京:高等教育出版社. 2006 [3] 邱关源,罗先觉.电路[M].北京:高等教育出版社.2011 [4] 张毅刚.单片机原理及应用[M].北京:高等教育出版社.2011 [5] 凌志浩.AT89C52单片机原理与接口技术[M].北京:高等教育出版社.2011 [6] 郭循钊,邝帆.基于单片机的多功能交通灯控制系统设计与仿真实现[J].公路交通技术.2010 [7] 刘日华,宋海.基于单片机的交通灯设计[J].科技致富向导.2012 [9] 高文庆,吕英英. 基于AT89C51单片机的数字秒表设计[J]. 电脑知识与技术.2012 [10] 谭浩强著,C程序设计 第三版[M].清华大学出版社.2006 [11] 彭虎,周佩玲. 微机原理与接口技术[M].电子工业出版社.2011 [12] GUO Haili.Design of Traffic Light Control System Based on Proteus and Single-chip Computer.Journal of Hengshui University[J].2012 [13] Tang Jing-nan, Qin Shen .Development and Examples of 51 Microcontroller's C Language [M].Posts & Telecom Press.2008
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
致 谢
本毕业设计在胡波和刘明老师的亲切关怀和悉心指导以及同学们的热心帮助下完成的。感谢他们在此次毕业设计过程中给予我的悉心指导与各方面的帮助,他们给了我许多非常有益的建议和意见,使我在思路上得到了很大的启发,从中认识到了自己存在的不足,并且学到了很多非常宝贵的知识。同时也要感谢系里其它同学和我的朋友在设计中给我提供的帮助和支持。总的来说,这次设计给了我一个很好的锻炼机会,让我学到了很多东西,让我将自己所掌握的理论知识切实运用于工作和生活实践中,这不仅有利于加深对书本知识的理解和巩固,而且在很大程度上提高了我们在理论知识的指导下观察、分析和解决问题的能力。最后,再次向所有帮助过我的老师、同学表示衷心的感谢!谢谢你们!宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
附录:程序源代码
/*#include
code 宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
{ uchar i;
while(ms--){ {} for(i=0;i<200;i++)}
} /*中断0处理程序*/ void int0(void)interrupt 0 { EA=0;/*CPU禁止响应一切中断*/ P1=0xF6,P0=duanma[0];/*东西南北方向均红灯亮,P0口输出0*/
{ P2=weima[0],P0=duanma[(SN_G+Y)%10];/*南北方向数码管显示可通行 while(1)/*无条件循环*/ 时间的个位*/ delayms(10);/*延时*/
P2=weima[1],P0=duanma[(SN_G+Y)/10];/*南北方向数码管显示可通行 delayms(10);/*延时*/ 时间的十位*/ P2=weima[2],P0=duanma[(WE_G+Y)%10];/*东西方向数码管显示可通行时间的个位*/ delayms(10);/*延时*/
P2=weima[3],P0=duanma[(WE_G+Y)/10];/*东西方向数码管显示可通行时间的十位*/
/*设置南北方向通行时间*/ if(K0==0)/*P3^7=0*/ { delayms(10);/*延时*/ 17 宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
delayms(20);/*延时,把抖动的时间抛掉*/ if(K0==0)*/ { } SN_G++;/*南北方向绿灯时间+1*/ if(SN_G==100)SN_G=0;/*由于使用的是两位数码管,当南北方向绿灯时间加到100后清零*/ }
} /*设置东西方向通行时间*/ if(K1==0)/*P3^6=0*/ { { while(K0==0)/*当松开K0开关时,跳出空循环,执行后面的程序 delayms(20);/*延时,把抖动的时间抛掉*/ if(K1==0){ while(K1==0)/*当松开K1开关时,跳出空循环,执行后面的程序*/ { } WE_G++;/*东西方向绿灯时间+1*/ if(WE_G==100)WE_G=0;/*由于使用的是两位数码管,当东西方向绿灯时间加到100后清零*/ }
} /*返回*/ if(K3==0)/*P3^5=0*/ delayms(20);/*延时,把抖动的时间抛掉*/ if(K3==0){ { 18 宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
while(K3==0)/*当松开K3开关时,跳出空循环,执行后面的程
{ } count=0;/*清零*/ k=0;/*南北方向通车,东西方向不通车*/ SN=SN_G,WE=SN_G+Y;/*南北方向显示时间为南北方向绿灯通行序*/ 时间,东西方向显示时间为南北方向绿灯通行时间加黄灯闪亮时间*/ light();/*调用交通灯函数*/
led();/*调用数码管函数*/ EA=1;/*CPU开放总中断*/
break;/*跳出*/ }
} } } /*中断1处理程序*/ {
P1=0xF6,P0=duanma[0];/*东西南北方向均红灯亮,P0口输出0*/ TR0=!TR0;/*计数器停止工作*/ {/*数码管扫描程序,*/ P2=weima[0];/*显示南北方向个位*/ delayms(10);/*延时*/ delayms(10);/*延时*/ P2=weima[2];/*显示东西方向个位*/ delayms(10);/*延时*/ P2=weima[3];/*显示东西方向十位*/ delayms(10);/*延时*/ /*返回*/ EA=0;/*CPU禁止响应一切中断*/ while(1)/*无条件循环*/
void int1(void)interrupt 2 P2=weima[1];/*显示南北方向十位*/ if(K3==0)/*P3^5=0*/ { 19 宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
delayms(20);/*延时,把抖动的时间抛掉*/
if(K3==0){ while(K3==0)/*当松开K3开关时,跳出空循环,执行后面的程序*/
{ } TR0=!TR0;/*启动计数器*/ EA=1;/*CPU开放总中断*/
break;/*跳出*/
}
} } } /*键盘程序*/ void key(){ /*南北有车而东西无车*/ if(K0==0)/*K0=0*/ { delayms(20);/*延时,把抖动的时间抛掉*/ if(K0==0){ while(K0==0)/*当松开K0开关时,跳出循环,执行后面的程序*/ { light();/*调用交通灯函数*/ led();/*调用数码管函数*/ } count=0;/*清零*/ k=0;/*南北方向通车,东西方向不通车*/ SN=SN_G,WE=SN_G+Y;/*南北方向显示时间为南北方向绿灯通行时间,东西方向显示时间为南北方向绿灯通行时间加黄灯闪亮时间*/ light();/*调用交通灯函数*/ led();/*调用数码管函数*/ } }
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
/*南北无车而东西有车*/ if(K1==0)/*K1=0*/ { delayms(20);/*延时,把抖动的时间抛掉*/ if(K1==0){ while(K1==0)/*当松开K1开关时,跳出循环,执行后面的程序*/ { light();/*调用交通灯函数*/ led();/*调用数码管函数*/ } count=0;/*清零*/ k=1;/*南北方向不通车,东西方向通车*/ SN=WE_G+Y,WE=WE_G;/*南北方向显示时间为东西方向绿灯通行时间加黄灯闪亮时间,东西方向显示时间为东西方向绿灯通行时间*/ light();/*调用交通灯函数*/
} /*定时函数*/ void time1(void)interrupt 1 {
TH0=0x3c;TL0=0xb0;/*计50000个数,用时50ms*/ count++;/*自增运算*/ if(count>=20)/*当count大于或等于20时,历时1s,执行程序*/ { SN--;/*自减运算*/ WE--;/*自减运算*/ count=0;/*清零*/ if(SN==0||WE==0)/*当SN=0或者WE=0时,执行程序*/ { } led();/*调用数码管函数*/ } k++;/*自增运算*/ if(k>3)/*当k>3时,执行程序*/ 21 宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
k=0;/*清零*/ switch(k)/*switch 语句*/ { case 0:SN=SN_G,WE=SN_G+Y;break;/*南北方向显示时间为南北方向绿灯通行时间,东西方向显示时间为南北方向绿灯通行时间加黄灯闪亮时间*/ case 1:SN=Y,WE=Y;break;/*东西南北方向显示时间均为黄灯闪亮时间*/ case 2:SN=WE_G+Y,WE=WE_G;break;/*南北方向显示时间为东西方向绿灯通行时间加黄灯闪亮时间,东西方向显示时间为东西方向绿灯通行时间*/ case 3:SN=Y,WE=Y;break;/*东西南北方向显示时间均为黄灯闪亮时间*/ } } } /*交通灯函数*/ void light(){
P1=deng[k];/*交通灯对应着k的值变化*/ if(P1==deng[1]&&count==0)/*当南北方向亮黄灯且count=0时,执行程序*/
{ TH1=(65536-50000)/256;
} TL1=(65536-50000)%256;/*延时50ms*/
P1=0xDF;/*南北方向黄灯熄灭,东西方向亮红灯*/ } else if(P1==deng[3]&&count==0)/*当东西方向亮黄灯且count=0时,执行程序*/ { TH1=(65536-300000)/256;
TL1=(65536-300000)%256;/*延时50ms*/ P1=0xFB;/*南北方向亮红灯,东西方向黄灯熄灭*/ 22 宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
} } /*数码管函数*/ void led(){
} /*主函数*/
void main(void){
init();/*调用程序初始化函数*/ { key();/*调用键盘程序*/ light();/*调用交通灯函数*/ led();/*调用数码管函数*/ } while(1)/*无条件循环*/ P2=weima[0],P0=duanma[SN%10];/*显示南北方向个位*/ P2=weima[1],P0=duanma[SN/10];/*显示南北方向十位*/ delayms(10);/*延时*/ P2=weima[2],P0=duanma[WE%10];/*显示东西方向个位*/ delayms(10);/*延时*/ P2=weima[3],P0=duanma[WE/10];/*显示东西方向十位*/ delayms(10);/*延时*/ delayms(10);/*延时*/ } 23
第五篇:数字系统课程设计交通灯控制器
东南大学
《数字系统课程设计》
设计报告
项目名称: 交通灯控制器
姓
名:
学
号:
专
业:
实 验 室: 电工电子实验中心
组
别:
无
同组人员:
无
设计时间: 2016 年月 26 日
——
2016 年 9 月 20日 评定成绩:
审阅教师:
目录
一.设计方案及论证……………………………………………… 3 二.模块设计……………………………………………………… 5 三.总体设计与仿真……………………………………………… 10 四.总结…………………………………………………………… 12 一.设计方案及论证
1.设计使用环境
本交通灯控制系统设计利用Verilog HDL语言进行设计编程,利用Cyclone EP1C6Q240C8芯片和一些外围器件组成硬件电路,利用Quartus II软件将编写好的程序进行编译和仿真,并将调试完成的程序下载到Cyclone EP1C6Q240C8芯片上,通过观测电路板上的红绿信号灯以及数码管显示来分析系统的性能。
2.设计任务分析
主干道与乡村公路十字交叉路口在现代化的农村星罗棋布,为确保车辆安全、迅速地通过,在交叉路口的每个入口处设置了红、绿、黄三色信号灯。红灯禁止通行;绿灯允许通行;黄灯亮则给行驶中的车辆有时间行驶到禁行线之外。主干道和乡村公路都安装了传感器,检测车辆通行情况,用于主干道的优先权控制。
设计要求:
1)当乡村公路无车时,始终保持乡村公路红灯亮,主干道绿灯亮。2)当乡村公路有车时,而主干道通车时间已经超过它的最短通车时间时,禁止主干道通行,让乡村公路通行。主干道最短通车时间为25s。
3)当乡村公路和主干道都有车时,按主干道通车25s,乡村公路通车16s交替进行。4)不论主干道情况如何,乡村公路通车最长时间为16s。
5)在每次由绿灯亮变成红灯亮的转换过程中间,要亮5s时间的黄灯作为过渡。6)用开关代替传感器作为检测车辆是否到来的信号。用红、绿、黄三种颜色的发光二极管作交通灯。7)数码管倒计时显示
3.测量控制原理
1)通过乒乓开关来控制FPGA输入信号的电平,从而控制交通灯工作。
2)利用FPGA输出的电平信号去驱动静态数码管及三色小灯来模拟交通灯。
4.顶层设计方案框图及说明
1)交通灯控制器框图
C表示乡村道路是否有车到来,1表示有,0表示无;SET用来控制系统的开始及停止;RST是复位信号,高电平有效,当RST为1时,恢复到初始设置;CLK是外加时钟信号;MR、MY、MG分别表示主干道的红灯、黄灯和绿灯;CR、CY、CG分别表示乡村道路的红灯、黄灯和绿灯,1表示亮,0表示灭。
2)流程图
MGCR表示主干道绿灯,乡村道路红灯;MYCR表示主干道黄灯,乡村道路红灯;MRCG表示主干道红灯,乡村道路绿灯;MRCY表示主干道红灯,乡村道路黄灯;T0=1表示主干道最短通车时间到,T1=1表示5秒黄灯时间到,T2=1表示乡村道路最长通车时间到。二.模块设计
1.模块功能及端口说明
1)分频模块
输入端为clk_in,即实验箱自带脉冲输入信号,输出端为clk,即想得到的频率。2)主控制模块
输入端为CLK、RST、C。其中c为乡村道路开关,为1时表示乡村道路有车;rst为初始化开关,为1时表示初始化为主干道绿灯,乡村道路红灯的状态。
输出端为MG、MY、MR、CG、CY、CR分别表示主干道和乡村道路的红黄绿灯,与LED灯相连;mh、ml、ch、cl分别表示主干道和乡村道路倒计时显示的高低位,与数码管相连。
3)数码管显示模块
输入端为clk和count,输出端为LED。
2.主要功能的设计方法
1)分频模块
试验箱可选晶振有2M和50M,选择使用2M后,设置分频系数为2000000,每计数到1000000,则输出取反,最终可得到1HZ的时钟信号。
2)主控制模块
设置两个外部控制条件:初始化(RST);乡村干道是否有车(C);
设置一个内部计数变量:NUM,通过相关运算取余取整得到数码管显示高低位;
通过有限状态机实现四个状态的循环切换。
3.Verilog设计程序及说明
1)分频模块
module fre(clk_in,clk);input clk_in;output clk;reg clk;reg [31:0]k;always @(negedge clk_in)begin
if(k>=1000000)//1000000分频 begin clk<=~clk;//取反
k<=0;end else
k<=k+1;//计数
end endmodule 2)主控制模块
module traffic(CLK,RST,C,MG,MY,MR,CG,CY,CR,mh,ml,ch,cl);input CLK,RST,C;output [3:0]mh,ml,ch,cl;output MG,MY,MR,CG,CY,CR;reg [3:0] mh,ml,ch,cl;reg MG,MY,MR,CG,CY,CR;reg [31:0] COUNT;reg [5:0]state;parameter s1=6'b100001,s2=6'b010001,s3=6'b001100,s4=6'b001010;always @(posedge CLK)if(RST)//初始化
begin
state = s1;//最初状态,主通行,乡村不通行 MG=1;MY=0;MR=0;CG=0;CY=0;CR=1;COUNT = 0;
mh=2;//主干道绿灯25s,乡村道路红灯5s
ml=5;
ch=3;
cl=0;
end else case(state)s1: begin COUNT = COUNT+1;
if((COUNT>=25)&&(C==1))//25s已计完且乡村道路来车,跳转到s2状态
begin
state = s2;//主干道黄灯,乡村道路红灯
MG=0;MY=1;MR=0;CG=0;CY=0;CR=1;COUNT = 0;mh=0;ml=5;ch=0;cl=5;end else if(COUNT<25)//25s没有计完,保持s1状态
begin
state = s1;
MG=1;MY=0;MR=0;CG=0;CY=0;CR=1;
mh=(25-COUNT)/10;//取整取余换算,倒计时显示
ml=(25-COUNT)%10;ch=(30-COUNT)/10;cl=(30-COUNT)%10;end else if(COUNT >= 25 && C == 0)//25s计完,乡村道路仍然没有车
begin
state = s1;//保持s1 MG=1;MY=0;MR=0;CG=0;CY=0;CR=1;mh=0;//数码管显示0
ml=0;
ch=0;
cl=0;
end
end s2: begin COUNT = COUNT+1;
if(COUNT==5)//5s黄灯已计完
begin
state = s3;//主干道红灯,乡村道路绿灯 MG=0;MY=0;MR=1;CG=1;CY=0;CR=0;COUNT = 0;
mh=2;//主干道21s红灯,乡村道路16s绿灯
ml=1;
ch=1;
cl=6;
end else
begin
state = s2;//5s黄灯未计完时,保持s2状态
MG=0;MY=1;MR=0;CG=0;CY=0;CR=1;
mh=0;
ml=5-COUNT;
ch=0;
cl=5-COUNT;
end end s3: begin COUNT = COUNT+1;
if(((COUNT>=16)&&(C==1))||(C==0))//乡村道路16s通行时间已结束,不管有无来车,均跳转s4状态
begin
state = s4;//主干道红灯,乡村道路黄灯
MG=0;MY=0;MR=1;CG=0;CY=1;CR=0;
COUNT = 0;
mh=0;
ml=5;
ch=0;
cl=5;
end else
begin
state = s3;//16s未结束,仍保持s3状态
MG=0;MY=0;MR=1;CG=1;CY=0;CR=0;
mh=(21-COUNT)/10;
ml=(21-COUNT)%10;
ch=(16-COUNT)/10;
cl=(16-COUNT)%10;
end end s4: begin COUNT = COUNT+1;if(COUNT==5)//5s黄灯时间结束
begin
state = s1;//回到s1状态
MG=1;MY=0;MR=0;CG=0;CY=0;CR=1;
COUNT = 0;
mh=2;
ml=5;
ch=3;
cl=0;
end else
begin
state = s4;//否则保持s4状态
MG=0;MY=0;MR=1;CG=0;CY=1;CR=0;
mh=0;
ml=5-COUNT;
ch=0;
cl=5-COUNT;
end end default:
begin
state = s1;
MG=1;MY=0;MR=0;CG=0;CY=0;CR=1;
COUNT = 0;
mh=0;
ml=5-COUNT;
ch=0;
cl=5-COUNT;
end endcase endmodule 3)数码管显示模块 module led(clk,count,LED);input clk;input [3:0]count;output [7:0]LED;reg [7:0]LED;always @(posedge clk)begin case(count)
4'b0000:LED=8'b00000011;
4'b0001:LED=8'b10011111;
4'b0010:LED=8'b00100101;
4'b0011:LED=8'b00001101;
4'b0100:LED=8'b10011001;
4'b0101:LED=8'b01001001;
4'b0110:LED=8'b01000001;
4'b0111:LED=8'b00011111;
4'b1000:LED=8'b00000001;
4'b1001:LED=8'b00001001;
default:LED=8'b00000001;endcase end endmodule 4.仿真图及说明
(1)分频模块
由于实际应用中分频较大,仿真时为方便观察,将分频频数设置为20。输入为clk_in,周期为10ns;输出为clk,其周期为200ns,与理论值相符。(2)主控制模块
与总体仿真相同,在此不再赘述。
三.总体设计与仿真
1.顶层设计图及说明
fre为分频模块,traffic为主控制模块,led为数码管显示模块。输入端有clk_in、c和rst,输出端有MG、MY、MR、CG、CY、CR和mh、ml、ch、cl。
2.仿真图及说明
输入有:C、CLK和RST 输出有:CG、CR、CY、MG、MR、MY、ch、cl、mh和ml C为乡村道路是否来车,1表示来车,0表示无车;CLK为时钟信号;RST为初始化功能,1有效;CG、CR、CY、MG、MR、MY分别表示乡村道路绿灯、红灯、黄灯,主干道绿灯、红灯、黄灯;ch、cl、mh、ml分别表示乡村道路和主干道红绿灯倒数显示高低位。
3.实验结果
(1)乡村道路无车时
乡村道路无车时,主干道25s倒数,乡村道路30s倒数结束后,保持0,且主干道绿灯亮,乡村道路红灯亮。(2)乡村道路有车时
若乡村道路一直有车,主干道25s(即S1状态)倒计时结束后,主干道切换黄灯,乡村道路保持红灯(即S2状态);5s黄灯倒计时结束后,主干道切换红灯,时间21s,乡村道路切换绿灯,时间16s(即S3状态);乡村道路16s绿灯结束后,切换黄灯,主干道保持红灯(即S4状态),5s黄灯结束后,回到S1状态,即主干道25s绿灯,乡村道路30s红灯,若一直有车,则循环进行。
四.总结
1.实验结果分析
(1)输入与输出
两个开关:一个初始化控制开关,一个乡村道路开关。初始化开关打开后复位,交通灯开始工作,乡村道路打开表示乡村公路上有车。
输出:四个数码管,两个显示主干道交通灯时间,两个显示乡村道路时间;六个led灯,两红两黄两绿分别表示主干道和乡村公路的红黄绿灯。(2)运行过程
1)初始状态(S1)
左侧为主干道倒计时,右侧为乡村道路倒计时;主干道绿灯亮,乡村道路红灯亮。K1为初始化按键,K2为乡村道路有无来车。
2)主干道25s绿灯结束后切换黄灯,乡村道路红灯(S2)
3)主干道5s黄灯结束,切换红灯21s,乡村道路切换绿灯16s(S3)
4)乡村道路16s绿灯结束,切换黄灯,主干道红灯(S4)
5s黄灯倒计时结束,回到S1状态,若一直有车,则循环S1-S2-S3-S4-S1。
2.问题解决方法
问题1:数码管显示与红绿灯切换不同时。
解决方法:红绿灯输出后面增加一延时模块,延时一个CLK,使其与数码管显示同步。问题2:理解错题意,在S3状态(即主干道红灯,乡村道路绿灯)时,此时若乡村道 路无车通过,应立即切换为S4状态(即主干道红灯,乡村道路黄灯),而不是等当前计数结束再切换。
解决方法:将代码修改为if(((COUNT>=16)&&(C==1))||(C==0)),修改后符合要求,解决了问题。
3.心得体会
通过此次系统设计,我对verilog HDL语言有了初步了解,并对利用quartus来进行系统设计有了更加深入的理解,操作也更加熟练。在设计过程中应该先设计好总体架构,再进行模块的具体设计,通过分析每个模块要实现的功能来写代码,并注意编写注释,便于以后的理解修改。编译时要注意设置顶层文件,先进行仿真观察结果是否正确,对代码进行修改,仿真结果正确后再下载到硬件,测试系统功能。
参考书目: [1] 夏宇闻,《Verilog数字系统设计教程》,北京,北京航空航天大学出版社,2013年 [2] 王金明,《数字系统设计与Verilog HDL》,北京,电子工业出版社,2011年