该文件包括了电路图,仿真,程序,论文,资料等。当时是课设时做得,拿出来与大家分享。
所有资料下载:
智能交通指示灯.rar
(4.84 MB, 下载次数: 305)
下面是交通灯设计方案论证报告,压缩包里面还有完整的word格式的正式论文下载,很全面.
专业课程设计设计方案论证报告
一、课题研究的目的和意义 交通灯在我们的生活中起着非常重要的作用,不仅与人们的生命安全息息相关,同时也关系到交通的正常运行。随着人们安全意识的逐渐增高,人们对安全也有了新的认识,所以交通部门要认识到交通灯控制系统的重要性,努力完善交通控制系统。 二、课题研究的主要任务和预期目标 1.主要任务及要求 ①东西、南北方向均有红、黄、绿三种信号灯 ②带紧急制动按钮,按钮按下,所有方向亮红灯;再次按下,恢复正常显示 ③夜间模式按钮按下,所有方向显示黄灯闪烁 ④实时提醒绿灯亮的剩余时间 ⑤并可实现通行时间的按键输入。例如(1)南北红灯亮维持25S。在南北红灯亮的同时东西绿灯也亮,并维持20S。到20S时,东西绿灯闪烁,闪烁3S后熄灭。在东西绿灯熄灭时,东西黄灯亮,并维持2S。到2S时,东西黄灯熄,东西红灯亮。同时,南北红灯熄灭,南北绿灯亮。(2)东西红灯亮维持30S。南北绿灯亮维持25S。然后闪烁3S,熄灭。同时南北黄灯亮,维持2S后熄灭,这时南北红灯亮,东西绿灯亮。 2.预期目标 实现主要任务及要求,并在其基础上增添人行指示灯等其他功能。 三、设计方案 1.设计思想(总体的设计思路\想法) 一个交通指示灯系统分为指示灯显示、倒计时显示两个大部分。指示灯显示部分中各个灯的情况如图所示。
倒计时部分则利用晶振进行计时,设计一个1s的定时,设置初始值后每1s将初始值-1,并输出给数码管,从而达到倒计时的功能。 2.方案论证(要有多种方案的比较)
方案1:采用标准STC89C51单片机作为控制器通行倒计时显示采用2位LED数码管;指示灯采用发光二极管;LED显示采用动态扫描,以节省端口。紧急情况采用中断完成。以上系统结构框架设计,单片机端口刚好满足要求。该系统具有电路的简单,设计方便,显示清晰等特点。整体框图、流程图如图所示。
方案2:采用SCT89C2051单片机作为控制器,通行倒计时采用16X16点阵LED发光管;列驱动采用74LS595以实现串行端口扩展,行驱动采用4/16译码器74LS154动态扫描;译码器74LS154生成16条行选通信号线,再经过驱动器驱动对应的行线。每条行线上需要较大的驱动电流,应选用大功率三极管作为驱动。这种方案显示可以更加清晰明了,单片机占用端口少,但是需要大量硬件,电路复杂,耗电量大。整体电路如下图
3.设计中要解决的主要问题和措施 问题一:如何实现倒计时与灯的变化相同步 在整个交通系统中,指示灯与倒计时相同步是重要的问题,设定的时间不光是倒计时也是指示灯的显示时间,因此解决此问题就变得尤为重要。 问题二:如何能够调节数码管所显示的数值 任务要求需要使得倒计时时间可调,那就需要将数码管显示的数值进行合理调整,同时还要确保时间和指示灯相对应。 解决方案一:可以看出,无论倒计时数十多少,指示灯发生变化的时间都是最后5s,因此,我们想出的方案是,不用想倒计时一共是多少时间而是仅在最后5s时做出判断,判断出是绿灯闪烁还是黄灯亮起。 解决方案二:对于数码管数值调整,可以想到+1/-1的调整程序,这类程序,我们在单片机的课程中已经学习,通过+1/-1的程序从而实现对数码管数值的调整。 四、课题进度安排 1、第一天至第三天:熟悉课题、查阅资料、合理分工、撰写方案论证报告。 2、第四天至十一天:硬件电路设计及软件设计。 3、十二天至十九天:实物的焊接及调试。 4、二十至二十一天:准备材料答辩。
单片机智能交通指示灯仿真效果图:
智能交通指示灯的单片机源程序:
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- // 0 1 2 3 4 5 6 7 8 9
- uchar code smg_du[]={0xc0,0xf5,0x8c,0x94,0xb1,0x92,0x82,0xf4,0x80,0x90};
- uchar dis_smg[10] = {0xc0,0xf5,0x8c,0x94,0xb1,0x92,0x82,0xf4,0x80,0x90};
- uchar smg_i = 4; //位数
- sbit smg_we1 = P2^0;
- sbit smg_we2 = P2^1;
- sbit smg_we3 = P3^6;
- sbit smg_we4 = P3^7;
- sbit LE1 = P3^3;
- sbit LE2 = P3^3;
- char dx_s = 0; //倒计时开始
- char nb_s = 0;
- sbit dx_red = P2^4; //东西红灯
- sbit dx_green = P2^3; //东西绿灯
- sbit dx_yellow = P2^2; //东西黄灯
- sbit nb_red = P2^7; //南北红灯
- sbit nb_green = P2^6; //南北绿灯
- sbit nb_yellow = P2^5; //南北黄灯
- bit flag_1s = 0; //延时标志
- bit flag_500ms;
- bit flag_dx_nb;
- uchar flag_5m_value;
- uchar i;
- uchar nb_time = 10,dx_time = 15; //东西南北时间初值
- uchar flag_jdgz ; //交通灯
- // 数码管为位选
- void smg_we_switch(uchar i)
- {
- switch(i)
- {
- case 0: smg_we1 = 0; smg_we2 = 1; smg_we3 = 1; smg_we4 = 1; break;
- case 1: smg_we1 = 1; smg_we2 = 0; smg_we3 = 1; smg_we4 = 1; break;
- case 2: smg_we1 = 1; smg_we2 = 1; smg_we3 = 0; smg_we4 = 1; break;
- case 3: smg_we1 = 1; smg_we2 = 1; smg_we3 = 1; smg_we4 = 0; break;
- }
- }
- // 延时程序
- void delay_01ms(uint q)
- {
- uint i,j;
- for(i=0;i<q;i++)
- for(j=0;j<110;j++);
- }
- // 数码管显示
- void display()
- {
- uchar i;
- for(i=0;i<smg_i;i++)
- {
- P0 = 0xff;
- smg_we_switch(i);
- P0 = dis_smg[i];
- delay_01ms(3);
- }
- }
- // 定时器初始化
- void time0_init()
- {
- EA = 1;
- TMOD = 0X11;
- ET0 = 1;
- TR0 = 1;
- ET1 = 0;
- TR1 = 0;
- }
- // 交通灯管理
- void jiaotongdeng_dis()
- {
- if(flag_1s == 1)
- {
- flag_1s = 0;
- if(dx_s == 0)
- {
- if(flag_dx_nb == 1)
- {
- dx_s = nb_time; //南北时间
- nb_s = dx_time;
- }
- else
- {
- dx_s = dx_time; //东西时间
- nb_s = nb_time;
- }
- flag_dx_nb = ~flag_dx_nb;
- }
- dx_s --;
- nb_s --;
- }
- dis_smg[0] = smg_du[dx_s % 10] ;
- dis_smg[1] = smg_du[dx_s / 10] ;
- dis_smg[2] = smg_du[nb_s % 10] ;
- dis_smg[3] = smg_du[nb_s / 10] ;
- // 东西时间
- if(flag_dx_nb == 0)
- {
- if(nb_s > 5)
- {
- dx_red = 1; //东西红灯灭
- dx_green = 0; //东西绿灯亮
- dx_yellow = 1; //东西黄灯灭
- nb_red = 0; //南北红灯亮
- nb_green = 1; //南北绿灯灭
- nb_yellow = 1; //南北绿灯亮
- flag_5m_value = 0;
- }
- if(nb_s >= 0&&nb_s <= 5) //绿灯闪烁
- {
- dx_red = 1; //东西红灯灭
- dx_yellow = 1; //东西黄灯灭
- nb_red = 0; //南北红灯亮
- nb_green = 1; //南北绿灯灭
- nb_yellow = 1; //南北黄灯灭
- if(flag_500ms == 0) //绿灯闪烁
- {
- dx_green = 0;
- }
- else
- {
- dx_green = 1;
- }
- }
-
- if(nb_s==0)
- {
- dx_red = 1; //东西红灯灭
- dx_green = 1; //东西绿灯灭
- dx_yellow = 0; //东西黄灯亮
- nb_red = 0; //南北红灯亮
- nb_green = 1; //南北绿灯灭
- nb_yellow = 1; //南北黄灯灭
- }
-
- }
- // 南北时间
- if(flag_dx_nb == 1)
- { LE1=1;
- if(dx_s > 5)
- {
- dx_red = 0; //东西红灯亮
- dx_green = 1; //东西绿灯灭
- dx_yellow = 1; //东西黄灯灭
- nb_red = 1; //南北红灯灭
- nb_green = 0; //南北绿灯亮
- nb_yellow = 1; //南北黄灯灭
- flag_5m_value = 0;
- }
- if(dx_s >= 0&&dx_s <= 5) //绿灯闪烁
- {
- dx_red = 0; //东西红灯亮
- dx_green = 1; //东西绿灯灭
- dx_yellow = 1; //东西黄灯灭
- nb_red = 1; //南北红灯灭
- nb_yellow = 1; //男别黄灯灭
- if(flag_500ms == 0) //绿灯闪烁
- {
- nb_green = 0;
- }
- else
- {
- nb_green = 1;
- }
- }
-
- }
- }
- // 按键设置
- uchar key_can; //定义按键键值
- void key() //按键
- {
- static uchar key_new;
- key_can = 5; //键值最大
- P1 |= 0x1f;
- if((P1 & 0x1f) != 0x1f) //确定按键
- {
- delay_01ms(1); //消除抖动
- if(((P1 & 0x1f) != 0x1f) && (key_new == 1))
- { //确定键值按下
- key_new = 0;
- switch(P1 & 0x1f)
- {
- case 0x1e: key_can = 1; break; //模式键
- case 0x1d: key_can = 2; break; //加键
- case 0x1b: key_can = 3; break; //减键
- case 0x17: key_can = 4; break; //紧急模式键
- }
- }
- }
- else
- key_new = 1;
- }
- uchar menu_1,flag_s;
- // 四种键值
- void key_with()
- {
- if(key_can == 4) //紧急模式
- {
- flag_jdgz ++;
- if(flag_jdgz > 1)
- flag_jdgz = 0;
- if(flag_jdgz == 1) // 全部红灯亮
- {
- dx_red = 0;
- dx_green = 1;
- dx_yellow = 1;
- nb_red = 0;
- nb_green = 1;
- nb_yellow = 1;
- }
-
- }
- if(key_can == 1) //模式键
- {
- menu_1 ++;
- if(menu_1 > 3)
- {
- menu_1 = 0;
- }
- }
- if(menu_1 == 2) //东西时间调整
- {
- if(key_can == 2)
- {
- dx_time ++ ; //+1
- if(dx_time > 99)
- dx_time = 99;
- }
- if(key_can == 3)
- {
- dx_time -- ; //-1
- if(dx_time <= 10)
- dx_time = 10;
- }
- dis_smg[0] = smg_du[dx_time % 10] ; //显示时间
- dis_smg[1] = smg_du[dx_time / 10] ;
- dis_smg[2] = smg_du[10] ;
- dis_smg[3] = smg_du[10] ;
- }
- if(menu_1 == 3) //南北时间调整
- {
- if(key_can == 2)
- {
- nb_time ++ ; //+1
- if(nb_time > 99)
- nb_time = 99;
- }
- if(key_can == 3)
- {
- nb_time -- ; //-1
- if(nb_time <= 10)
- nb_time = 10;
- }
- dis_smg[0] = smg_du[10] ;
- dis_smg[1] = smg_du[10] ;
- dis_smg[2] = smg_du[nb_time % 10] ; //显示时间
- dis_smg[3] = smg_du[nb_time / 10] ;
- }
- }
- //主函数
- void main()
- {
- time0_init();
- dx_s = nb_time; //初始时间为南北时间
- nb_s = dx_time;
- while(1)
- {
- key();
- if(key_can < 5)
- key_with();
- if(menu_1 == 1) // 夜间模式
- {
- dx_red = 1;
- dx_green = 1;
- nb_red = 1; //红绿灯不亮
- nb_green = 1;
-
- if(flag_500ms == 0) //黄灯闪烁
- {
- dx_yellow = 0;
- nb_yellow = 0;
- }
- else
- {
- dx_yellow = 1;
- nb_yellow = 1;
- }
- }
- if((menu_1 == 0) && (flag_jdgz == 0))
- jiaotongdeng_dis();
- display();
- }
- }
- // 定时器中断服务
- void time0_int() interrupt 1
- {
- static uchar value; //延时10ms
- TH0 = 0x3c;
- TL0 = 0xb0; //50ms
- value ++;
- flag_5m_value++;
- if(flag_5m_value % 10 == 0)
- flag_500ms = ~flag_500ms;
- if(value >= 20)
- {
- value = 0;
- flag_1s = 1;
- }
- }
复制代码
|