找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6910|回复: 3
打印 上一主题 下一主题
收起左侧

单片机智能交通灯 设计方案论证报告 仿真,程序,正式论文等

[复制链接]
跳转到指定楼层
楼主
该文件包括了电路图,仿真,程序,论文,资料等。当时是课设时做得,拿出来与大家分享。

所有资料下载:
智能交通指示灯.rar (4.84 MB, 下载次数: 303)


下面是交通灯设计方案论证报告,压缩包里面还有完整的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、二十至二十一天:准备材料答辩。

单片机智能交通指示灯仿真效果图:


智能交通指示灯的单片机源程序:
  1. #include <reg52.h>               
  2. #define uchar unsigned char   
  3. #define uint  unsigned int         



  4. //                                                                                 0     1    2    3           4           5        6                 7          8           9        
  5. uchar code smg_du[]={0xc0,0xf5,0x8c,0x94,0xb1,0x92,0x82,0xf4,0x80,0x90};                 

  6. uchar dis_smg[10] = {0xc0,0xf5,0x8c,0x94,0xb1,0x92,0x82,0xf4,0x80,0x90};        
  7. uchar smg_i = 4;    //位数


  8. sbit smg_we1 = P2^0;         
  9. sbit smg_we2 = P2^1;
  10. sbit smg_we3 = P3^6;
  11. sbit smg_we4 = P3^7;
  12. sbit LE1                 = P3^3;
  13. sbit LE2                 = P3^3;

  14. char dx_s = 0;                                                        //倒计时开始
  15. char nb_s = 0;        
  16. sbit dx_red    = P2^4;            //东西红灯
  17. sbit dx_green  = P2^3;                        //东西绿灯
  18. sbit dx_yellow = P2^2;                        //东西黄灯

  19. sbit nb_red    = P2^7;                        //南北红灯
  20. sbit nb_green  = P2^6;                        //南北绿灯
  21. sbit nb_yellow = P2^5;                        //南北黄灯


  22. bit flag_1s = 0;                                                //延时标志
  23. bit flag_500ms;
  24. bit flag_dx_nb;                 
  25. uchar flag_5m_value;
  26. uchar i;
  27. uchar nb_time = 10,dx_time = 15;   //东西南北时间初值
  28. uchar flag_jdgz ;                             //交通灯


  29. // 数码管为位选
  30. void smg_we_switch(uchar i)
  31. {
  32.         switch(i)
  33.         {
  34.                 case 0: smg_we1 = 0;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 1; break;
  35.                 case 1: smg_we1 = 1;  smg_we2 = 0; smg_we3 = 1;  smg_we4 = 1; break;
  36.                 case 2: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 0;  smg_we4 = 1; break;
  37.                 case 3: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 0; break;
  38.         }        
  39. }



  40. // 延时程序

  41. void delay_01ms(uint q)
  42. {
  43.         uint i,j;
  44.         for(i=0;i<q;i++)
  45.                 for(j=0;j<110;j++);
  46. }


  47. // 数码管显示

  48. void display()
  49. {
  50.         uchar i;
  51.         for(i=0;i<smg_i;i++)
  52.         {               
  53.                 P0 = 0xff;                  
  54.                 smg_we_switch(i);            
  55.                 P0 = dis_smg[i];            
  56.                 delay_01ms(3);
  57.         }
  58. }

  59. // 定时器初始化

  60. void time0_init()         
  61. {
  62.         EA  = 1;                  
  63.         TMOD = 0X11;         
  64.         ET0 = 1;                  
  65.         TR0 = 1;                  
  66.         ET1 = 0;                  
  67.         TR1 = 0;                  
  68. }

  69. // 交通灯管理

  70. void jiaotongdeng_dis()
  71. {
  72.         if(flag_1s == 1)
  73.         {
  74.                 flag_1s = 0;
  75.                 if(dx_s == 0)
  76.                 {
  77.                         if(flag_dx_nb == 1)
  78.                                 {
  79.                                 dx_s = nb_time;          //南北时间
  80.                                 nb_s = dx_time;
  81.                                 }
  82.                         else
  83.                                 {
  84.                                 dx_s = dx_time;          //东西时间
  85.                                 nb_s = nb_time;
  86.                                 }
  87.                         flag_dx_nb = ~flag_dx_nb;
  88.                 }
  89.                 dx_s --;
  90.                 nb_s --;
  91.         }
  92.         dis_smg[0] = smg_du[dx_s % 10] ;
  93.         dis_smg[1] = smg_du[dx_s / 10] ;
  94.         dis_smg[2] = smg_du[nb_s % 10] ;
  95.         dis_smg[3] = smg_du[nb_s / 10] ;

  96. // 东西时间
  97.                 if(flag_dx_nb == 0)  
  98. {               
  99.                         if(nb_s > 5)
  100. {
  101.                                 dx_red    = 1;  //东西红灯灭
  102.                                 dx_green  =        0;        //东西绿灯亮
  103.                                 dx_yellow = 1;        //东西黄灯灭
  104.                                 nb_red    = 0;  //南北红灯亮
  105.                                 nb_green  =        1;        //南北绿灯灭
  106.                                 nb_yellow = 1;        //南北绿灯亮
  107.                                 flag_5m_value = 0;        
  108.                         }
  109.                          if(nb_s >= 0&&nb_s <= 5)                 //绿灯闪烁
  110. {
  111.                                 dx_red    = 1;            //东西红灯灭
  112.                                 dx_yellow  =        1;          //东西黄灯灭
  113.                                 nb_red    = 0;            //南北红灯亮
  114.                                 nb_green  =        1;                  //南北绿灯灭
  115.                                 nb_yellow = 1;                  //南北黄灯灭
  116.                                 if(flag_500ms == 0) //绿灯闪烁
  117. {
  118.                                         dx_green = 0;
  119.                                 }
  120.                                 else
  121. {
  122.                                         dx_green = 1;
  123.                                 }
  124.                         }
  125.                         
  126.                         if(nb_s==0)
  127. {
  128.                                 dx_red    = 1;  //东西红灯灭
  129.                                 dx_green  =        1;        //东西绿灯灭
  130.                                 dx_yellow = 0;        //东西黄灯亮
  131.                                 nb_red    = 0;  //南北红灯亮
  132.                                 nb_green  =        1;        //南北绿灯灭
  133.                                 nb_yellow = 1;        //南北黄灯灭
  134.                                 }
  135.                         

  136.                 }

  137. // 南北时间
  138.                 if(flag_dx_nb == 1)  
  139. {                        LE1=1;
  140.                         if(dx_s > 5)
  141. {
  142.                                 dx_red    = 0;     //东西红灯亮
  143.                                 dx_green  =        1;           //东西绿灯灭
  144.                                 dx_yellow = 1;           //东西黄灯灭
  145.                                 nb_red    = 1;     //南北红灯灭
  146.                                 nb_green  =        0;           //南北绿灯亮
  147.                                 nb_yellow = 1;           //南北黄灯灭
  148.                                 flag_5m_value = 0;        
  149.                         }
  150.                         if(dx_s >= 0&&dx_s <= 5)                 //绿灯闪烁
  151. {
  152.                                 dx_red    = 0;     //东西红灯亮
  153.                                 dx_green  =        1;           //东西绿灯灭
  154.                                 dx_yellow = 1;           //东西黄灯灭
  155.                                 nb_red    = 1;     //南北红灯灭
  156.                                 nb_yellow =        1;           //男别黄灯灭
  157.                                 if(flag_500ms == 0)           //绿灯闪烁
  158. {
  159.                                         nb_green = 0;        
  160.                                 }
  161.                                 else
  162. {
  163.                                         nb_green = 1;        
  164.                                 }
  165.                         }

  166.                         
  167. }
  168. }
  169. // 按键设置
  170. uchar key_can;         //定义按键键值

  171. void key()         //按键
  172. {
  173.         static uchar key_new;
  174.         key_can = 5;                   //键值最大
  175.         P1 |= 0x1f;
  176.         if((P1 & 0x1f) != 0x1f)                //确定按键
  177.         {
  178.                 delay_01ms(1);                     //消除抖动
  179.                 if(((P1 & 0x1f) != 0x1f) && (key_new == 1))
  180.                 {                                                //确定键值按下
  181.                         key_new = 0;
  182.                         switch(P1 & 0x1f)
  183.                         {
  184.                                 case 0x1e:  key_can = 1;  break;         //模式键
  185.                                 case 0x1d:  key_can = 2;  break;         //加键
  186.                                 case 0x1b:  key_can = 3;  break;         //减键
  187.                                 case 0x17:  key_can = 4;  break;         //紧急模式键
  188.                         }
  189.                 }                        
  190.         }
  191.         else
  192.                 key_new = 1;        
  193. }

  194. uchar menu_1,flag_s;


  195. // 四种键值
  196. void key_with()
  197. {
  198.         if(key_can == 4)   //紧急模式
  199.         {
  200.                 flag_jdgz ++;
  201.                 if(flag_jdgz > 1)
  202.                         flag_jdgz = 0;        
  203.                 if(flag_jdgz == 1)         //  全部红灯亮
  204.                 {
  205.                         dx_red    = 0;  
  206.                         dx_green  =        1;        
  207.                         dx_yellow = 1;        
  208.                         nb_red    = 0;   
  209.                         nb_green  =        1;        
  210.                         nb_yellow = 1;                        
  211.                 }

  212.         
  213.         }
  214.         if(key_can == 1)          //模式键
  215.         {
  216.                 menu_1 ++;
  217.                 if(menu_1 > 3)
  218.                 {
  219.                         menu_1  = 0;
  220.                 }
  221.         }

  222.         if(menu_1 == 2)           //东西时间调整
  223.         {
  224.                 if(key_can == 2)
  225.                 {
  226.                         dx_time ++ ;                //+1
  227.                         if(dx_time > 99)
  228.                                 dx_time = 99;
  229.                 }
  230.                 if(key_can == 3)
  231.                 {
  232.                         dx_time -- ;                //-1
  233.                         if(dx_time <= 10)
  234.                                 dx_time = 10;
  235.                 }
  236.                 dis_smg[0] = smg_du[dx_time % 10] ;        //显示时间
  237.                 dis_smg[1] = smg_du[dx_time / 10] ;        
  238.                 dis_smg[2] = smg_du[10] ;               
  239.                 dis_smg[3] = smg_du[10] ;        

  240.         }        
  241.         if(menu_1 == 3)           //南北时间调整
  242.         {
  243.                 if(key_can == 2)
  244.                 {
  245.                         nb_time ++ ;                //+1
  246.                         if(nb_time > 99)
  247.                                 nb_time = 99;
  248.                 }
  249.                 if(key_can == 3)
  250.                 {
  251.                         nb_time -- ;                //-1
  252.                         if(nb_time <= 10)
  253.                                 nb_time = 10;
  254.                 }
  255.                 dis_smg[0] = smg_du[10] ;
  256.                 dis_smg[1] = smg_du[10] ;        
  257.                 dis_smg[2] = smg_du[nb_time % 10] ;                //显示时间        
  258.                 dis_smg[3] = smg_du[nb_time / 10] ;        

  259.         }
  260. }


  261. //主函数
  262. void main()
  263. {
  264.         time0_init();

  265.         dx_s = nb_time;          //初始时间为南北时间
  266.         nb_s = dx_time;
  267.         while(1)
  268.         {
  269.                 key();
  270.                 if(key_can < 5)
  271.                         key_with();
  272.                                 if(menu_1 == 1)         //  夜间模式
  273.         {
  274.                         dx_red    = 1;  
  275.                         dx_green  =        1;        
  276.                         nb_red    = 1;  //红绿灯不亮
  277.                         nb_green  =        1;        
  278.                         
  279.                         if(flag_500ms == 0)  //黄灯闪烁

  280. {
  281.                                         dx_yellow = 0;
  282.                                         nb_yellow = 0;
  283.                                 }
  284.                                 else
  285. {
  286.                                         dx_yellow = 1;
  287.                                         nb_yellow = 1;        
  288.                                 }

  289.                 }

  290.                 if((menu_1 == 0) && (flag_jdgz == 0))
  291.                         jiaotongdeng_dis();
  292.                 display();        
  293.         }
  294. }  

  295. // 定时器中断服务
  296. void time0_int() interrupt 1  
  297. {                                                   
  298.         static uchar value;                         //延时10ms
  299.         TH0 = 0x3c;
  300.         TL0 = 0xb0;     //50ms
  301.         value ++;
  302.         flag_5m_value++;
  303.         if(flag_5m_value % 10 == 0)
  304.                 flag_500ms = ~flag_500ms;
  305.         if(value >= 20)
  306.         {
  307.                 value = 0;
  308.                 flag_1s = 1;
  309.         }
  310. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

地板
ID:467919 发表于 2019-3-26 10:01 | 只看该作者
谢谢LZ
回复

使用道具 举报

板凳
ID:26572 发表于 2017-10-13 11:35 | 只看该作者
不错,谢谢LZ
回复

使用道具 举报

沙发
ID:1 发表于 2017-2-12 22:44 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表