[分享] 十字路口交通灯控制【课程设计】
604 查看
3 回复
 楼主 | 发布于 2019-07-06 | 只看楼主
分享到:


1 绪论1.1设计目的
单片机具有性价比高、集成度高、可靠性好、抗干扰性强等特点,广泛运用于各种智能仪器中。基于新型规则的可编程交通控制系统,可以实现对车辆、行人的控制,使的交通便于管理。所以,采用单片机自动控制交通灯有现实的社会意义。
通过本次设计,使学生不仅更加深刻领会微型计算机从硬件组成到软件编程的基本原理和知识,而且更要学会应用,务必做到理论和实践相结合,掌握硬件分析、软件设计的基本思想和方法,提高分析问题、解决问题和工程实践的能力。
1.2设计内容
1)设计一个十字路口交通灯控制器。用单片机控制LED灯模拟指示。模拟东西方向的十字路口交通信号控制情况。南北方向主干道计时时间为60s,东西方向次干道计时时间为45s。
2)红绿灯不变期间,在七段数码管上显示每秒倒计时。
3)计时到最后5秒时,两个方向的黄灯同时闪烁直至计时到0。

2 系统设计方案
2.1
设计思路
模拟交通灯控制器就是使用单片机来控制一些LED灯和数码管,模拟真实交通灯的功能。当南北主干道通车时绿灯亮,而东西次干道干道红灯亮;当55s通车时间到后,主干道绿灯熄灭,黄灯亮,黄灯亮5s后由主干道切换到次干道通车。此时主干道黄灯熄灭,红灯亮,而次干道红灯熄灭,绿灯亮,次干道开始通车; 40s通车时间到后,次干道绿灯熄灭,黄灯亮,黄灯亮5s后由次干道切换到主干道通车。此时次干道黄灯熄灭,红灯亮;而主干道红灯熄灭,绿灯亮,如此不断循环。红、黄、绿交替闪亮,利用数码管倒计数显示间隔等,用于管理十字路口的车辆及行人交通。
2.2方案设计
利用AT89C52单片机完成交通信号灯控制器的设计,该交通信号灯控制器由一条主干道和一条支干道汇合成十字路口,在每个入口处设置红、绿、黄三色信号灯,数码管显示剩余时间。红灯亮禁止通行,绿灯亮允许通行,黄灯亮则给行驶中的车辆有时间停在禁行线外。用红、绿、黄发光二极管作信号灯,8个共阴极数码管显示剩余时间,
根据设计功能及要求,我们可得系统的原理框图如图2-1所示。
图2-1  系统原理图(见51hei附件)
3 系统硬件电路设计
3.1 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存储器可有效地降低开发成本。
如下图3-1所示:
图3-1  AT89C52单片机
3.1.1晶振电路设计
时钟电路用于产生MCS-52单片机工作时所必须的时钟控制信号。其内部电路在时钟信号控制下,严格地按时序执行指令进行工作。在执行指令时,CPU首先要到程序存储器中取出需要执行的指令操作码,然后译码,并由时序电路产生一系列控制信号去完成指令所规定操作。
本设计采用12MHz晶振和两个27Pf瓷片电容,他们构成一个稳定的自激振荡器。该电容的大小影响振荡器频率的高低、振荡器的稳定性和起振的快速性。为单片机提供标准时钟。其中两个瓷片电容起微调作用。 如图3-2所示:
图3-2  晶振电路
3.1.2复位电路设计
复位引脚RST通过一个斯密特触发器与复位电路相连,斯密特触发器用来抑制噪声,在每个机器周期的S5P2,斯密特触发器的输出电平由复位电路采样一次,然后才能得到内部复位操作所需要的信号。
复位电路通常采用上电自动复位和按钮复位两种方式。
该设计采用加电直接复位,复位电容采用10uF,电阻10000欧。加电瞬间,RES管脚为高电平。通过电阻回路放电,使电压逐渐降为零,从而实现了复位功能。
其连接图如下图3-3所示:
图3-3  复位电路
3.2显示部分电路设计3.2.1数码管选择
此处采用的数码管时共阴极数码管,G、F、E、D、C、B、A七个端口是输入端口,对其各位进行赋值,置位则亮,复位则灭,用此来显示出相应的数字;1、2两端口用来控制高位和低位的选通显示,只要对端口置位,便可以选择该端口,并对其所代表的位进行赋值,显示。数码管如下图3-5所示。
图3-5 数码管

3.2.2十字路口交通灯设计
一条主干道和一条次干道汇合成十字路口,南北方向道路为主干道,东西方向干道为次干道。每个路口都采用了三个LED灯来显示,分别代表了红黄绿三种灯,来模拟路口交通灯的变换。LED信号灯如下图3-6所示。

图3-6 LED信号灯设计
3.3系统硬件总电路图
根据设计要求和所需电路,得到系统硬件总电路图如图3-7所示。
图3-7 系统硬件总电路图

4 系统软件程序设计4.1主程序设计4.1.1总体流程图


4.2其他子程序设计
4.2.1循环流程控制思路


5 调试与仿真5.1 Proteus软件系统仿真
打开Proteus软件,按照硬件系统图3-7所示接线,连线完毕后,通过keil把编好的c语言程序转换为.hex文件,并将其放入单片机内。
设置好仿真器后,编译程序无误后调试执行程序,结果显示符合要求。
5.2仿真结果
根据功能要求分别仿真各种情况下的亮灯情况,具体如下:
1.如下图5-1仿真图所示,南北方向主干道亮绿灯,东西次干道方向亮红灯。
图5-1  南北绿灯东西红灯


2.如下图5-2所示,南北方向倒计时5s后变为黄灯,东西为绿灯。
图5-2南北黄灯东西红灯












3.如下图5-3所示,东西方向变为绿灯,南北方向变为红灯。

图5-3南北红灯灯东西绿灯

4.如下图5-4所示,东西方向在变为黄灯
            





单片机源程序如下:
  1.       #include<reg52.h>
  2.               #include<intrins.h>
  3.               #define uint unsigned int
  4.               #define uchar unsigned char
  5.               uchar temp,aa,nn;
  6.               sbit rn=P2^0;                               
  7.               sbit nb=P2^1;
  8.               sbit gn=P2^2;
  9.               sbit rw=P2^3;
  10.               sbit dx=P2^4;
  11.               sbit gw=P2^5;
  12.               sbit shi=P3^6;
  13.               sbit ge=P3^7;                            /*对要使用的单片机各个口进行定义*/
  14.               bit flag=0;

  15.               uchar code table[]={
  16.               0x3f,0x06,0x5b,0x4f,
  17.               0x66,0x6d,0x7d,0x07,
  18.               0x7f,0x6f,0x77,0x7c,
  19.               0x39,0x5e,0x79,0x71};         /*将数字0123456789的16进制数定义成数组用以显示*/

  20.               void delay(uint z);
  21.               void disp(uint n);
  22.               void nb_flash(void);
  23.               void dx_flash(void);
  24.               void  xint0();
  25.               void timer0();
  26.               void  LED_ON();
  27.               void  xint1();
  28.               void  LED_OFF();
  29.               void nanbei();
  30.               void dongxi();                 /*将所使用的子函数定义*/

  31.               void main()
  32.               {
  33.                             uint num;
  34.                             num=0;
  35.                             aa=0;
  36.                             TMOD=0x01;
  37.                             TH0=(65536-50000)/256;
  38.                             TL0=(65536-50000)%256;
  39.                             EA=1;
  40.                             ET0=1;
  41.                             TR0=1;
  42.                             EX0=1;
  43.                             IT0=0;
  44.                             EX1=1;
  45.                             IT1=1;                       /*中断初始化*/
  46.                             while(1)
  47.                             {
  48.                                           nanbei();             
  49.                                           nb_flash();
  50.                                           dongxi();
  51.                                           dx_flash();                /*主函数中显示部分*/
  52.         }
  53.               }

  54.               void delay(uint z)                    /*延时子函数*/
  55.               {
  56.                             uint x,y;
  57.                             for(x=z;x>0;x--)
  58.                                           for(y=110;y>0;y--);
  59.               }

  60.               void timer0() interrupt 1             /*定时器初始化*/
  61.               {
  62.                             TH0=(65536-50000)/256;
  63.                             TL0=(65536-50000)%256;
  64.                             aa++;
  65.                             if(aa==18)
  66.                             {
  67.                                           aa=0;
  68.                                           flag=1;
  69.                             }             
  70.               }
  71.               void disp(uint n)                    /*显示子函数*/
  72.               {
  73.                 while(!flag)
  74.                 {
  75.                               ge=0;
  76.                               P0=table[n%10];
  77.                               delay(50);
  78.                               shi=1;ge=1;
  79.                               shi=0;
  80.                               P0=table[n/10];
  81.                               delay(50);
  82.                               shi=1;ge=1;
  83.                  }
  84.                 if(flag==1)
  85.                    flag=0;
  86.               }
  87.               void nanbei()                    /*南北方向的红绿灯和数码管显示子函数*/
  88.               {                            uint num;
  89.                                           num=60;
  90.                                           disp(num);
  91.                                           while(num<=60&&num>0)
  92.                                           {              num--;
  93.                                                P2=0xde;
  94.                                                            disp(num);                                         
  95.                                           }
  96.               }
  97.               void dongxi()                     /*东西方向的红绿灯和数码管显示子函数*/
  98.               {                            uint num;                                         
  99.                                           num=60;
  100.                                           while(num<=60&&num>0)
  101.                                           {              P2=0xf3;               
  102.                                                         disp(num);
  103.                                                         num--;
  104.                                           }
  105.               }
  106.               void nb_flash(void)              /*南北方向的黄灯和数码管显示子函数*/
  107.               {
  108.                             uint a;
  109.                             for(a=3;a>0;a--)
  110.                             {              P2=0xdd;
  111.                                           nb=1;
  112.                                           delay(100);
  113.                                           nb=0;
  114.                                           disp(a);
  115.                             }
  116.               }
  117.               void dx_flash(void)                /*东西方向的黄灯和数码管显示子函数*/
  118.               {
  119.                             uint a;
  120.                             for(a=3;a>0;a--)
  121.                             {              P2=0xeb;
  122.                                           dx=1;
  123.                                           delay(100);
  124.                                           dx=0;
  125.                                           disp(a);
  126.                             }
  127.               }
  128.               void  xint0()  interrupt 2                     /*中断定义*/
  129. {             
  130.               TH0=(65536-50000)/256;
  131.               TL0=(65536-50000)%256;             
  132.               LED_ON();             
  133. ……………………
(0 ) (0 )
回复 举报

回复于 2019-07-06 沙发

感谢分享
(0 )
评论 (0) 举报

回复于 2019-07-07 2#

支持下,谢谢分享!
(0 )
评论 (0) 举报

回复于 2019-07-09 3#

谢谢分享!!!
(0 )
评论 (0) 举报
  • 发表回复
    0/3000





    举报

    请选择举报类别

    • 广告垃圾
    • 违规内容
    • 恶意灌水
    • 重复发帖

    全部板块

    返回顶部