精华内容
下载资源
问答
  • PAGE II PAGE I 毕业论文 基于单片机的交通灯控制系统设计 班 级 通 信 姓 名 学 号 指导教师 老师 目录 摘要 PAGE I 摘要 PAGE I 摘 要 本设计是在掌握了单片机及其仿真系统的使用方法的基础上综合应用单片机原理...
  • 摘 要:本文在综合分析了8255A 及8253 芯片的特点之后,运用二者的特性,进行了交通红绿灯模拟系统设计,在详细阐述了设计思想及电路设计方案之后,对该系统的有效性测试表明了该交通红绿灯模拟系统具有较为可靠的...
  • 模拟路灯控制系统以SCT89C58为控制核心。以DS1302为时钟源,以红外线传感器、光学传感器对移动物体和环境明暗变化进行信息采集,通过软件编程能实时显示时钟和设定、显示开关时间,控制整条支路根据设定时间、环境...
  • 因此本文在EDA技术的基础上,利用FPGA的相关知识设计交通灯控制系统,可以根据实际情况对灯亮时间进行自由调整,整个设计系统通过Max+PlusⅡ软件进行了模拟仿真,并到FPGA器件中进行硬件的调试,验证了设计的交通...
  • 微机原理交通灯控制系统设计

    万次阅读 多人点赞 2018-09-10 00:07:21
    此次综合设计模拟交通灯控制系统,是采用计算机通过编写汇编语言程序控制实验箱上的硬件资源实现的。红灯停,绿灯行的交通规则,广泛用于十字路口,车站, 码头等公共场所,成为人们出行生活中不可少的必需品,由于...

    前言

    此次综合设计为模拟交通灯控制系统,是采用计算机通过编写汇编语言程序控制实验箱上的硬件资源实现的。红灯停,绿灯行的交通规则,广泛用于十字路口,车站, 码头等公共场所,成为人们出行生活中不可少的必需品,由于计算机技术的成熟与广泛应用,使得交通灯的功能多样化,远远超过老式交通灯, 交通灯的数字化给人们生产生活带来了极大的方便,而且大大地扩展了交通灯的功能。诸如闪烁警示、鸣笛警示,时间程序自动控制、倒计时显示,所有这些,都是以计算机为基础的;还可以根据主、次干道的交通状况的不同任意设置各自的不同的通行时间。
    因此,在本设计中将采用Intel 8086系列CPU交通控制系统来实现。 整个交通灯控制系统由8086CPU、交通灯显示、键盘扫描、紧急处理、时间模式手动设置等模块组成。系统除基本交通灯功能外还具有通行时间手动设置、可倒计时显示、急车强行通过等相关功能。

    1 交通灯控制系统设计方案

    1.1、总体设计:

    1、东西方向和南北方向交替准行控制:
    东西方向准行时,东西方向上的绿灯亮,南北方向红灯亮,经过一段时间后,南北方向准行,南北方向上的绿灯亮,东西方向红灯亮,如此交替。各方向信号灯顺序为:红→绿→黄→红→绿→黄……,某一方向红灯亮的时间等于另一方向绿灯和黄灯亮的时间之和。
    2、各方向红、绿灯亮的时间为11~ 99秒(可灵活的任意设定),以满足不同交通路口的需要。
    3、当准行时间倒计时到最后10秒时,准行方向上绿灯灭,同时该方向的黄灯变为闪烁。
    4、各方向要有两位数码管分别显示准行时间或禁行时间,并以秒倒计时。
    5、设置功能按键:
    1)在发生交通事故时,东西方向和南北方向同时禁行。
    2)强制东西方向通行。
    3)强制南北方向通行。
    4)恢复正常交替通行。

    1.2 设计原理:

    综合利用实验箱上的资源,利用8254单元输入1MHz的时钟信号,连接MIR7定时向控制系统发出中断信号,实现倒计时的功能,通过8255单元控制的键盘及数码管显示单元,动态扫描通行时间的变化以及功能键模式下的显示,实时扫描键盘的输入,通过软件处理的方式,实现各个键盘的处理,开关及LED显示单元则来用显示交通灯的变化,B口输出数码管段码,A口与C口共同控制数码管的位选、键盘扫描以及LED灯的亮灭。
    如图1,是实现整个交通灯控制系统的接线图:
    实验接线图
    图1 实验接线图

    2 交通灯控制系统硬件原理

    2.1 8086CPU
    2.2 可编程并行接口芯片——8255A
    2.3 可编程计数/定时器芯片——8254
    2.4 可编程中断控制器——8259A

    3 交通灯控制系统软件设计:

    3.1设计总流程图:
    这里写图片描述
    3.2初始化流程图:
    3.3按键处理流程图:
    3.4显示流程图:
    3.5 按键扫描流程图:
    3.6 中断流程图

    4 实验内容

    根据接线图,将系统总线与8255单元、键盘及数码管显示单元、开关及LED显示单元连接,编写程序,扫描键盘输入,并将扫描结果进行处理后送数码管显示。
    实验具体内容如下:将键盘进行编号,记作0~F,当按下其中一个按键时:
    ①数字键“0~9”: 仅在设置通行时间时按键有效(设置键:“D”),实现通行时间设置的组合,数码管实时显示“XX——XX”(XX表示预设的时间)
    ②功能键“A”: 东西方向和南北方向同时禁行,数码管显示“888888”,东西方向和南北方向都亮红灯。
    ③功能键“B”: 强制东西方向通行,数码管显示“888888”,东西方向亮绿灯,南北方向亮红灯。
    ④功能键“C”: 强制南北方向通行,数码管显示“888888”,南北方向亮绿灯,东西方向亮红灯。
    ⑤设置键“D”:按一下可以对东西方向进入通行时间设置,再按一下对南北方向进入通行时间设置
    ⑤确定键“E”:将时间预设值修改,不符要求的方向不更改,按下后进入正常状态。
    ⑥取消键“F”:退出时间设置模式和功能键模式

    5 实验设备

    PC机一台,TD-PITE实验装置一套

    6 实验结果分析和讨论

    按要求接好线并下载程序后,能够正常实现交通灯的显示与功能键的启用,但在通行时间的设置上仍有一些问题:
    ①本应显示交通灯状态“-”“_”“¯”的数码管不按预想中的显示;
    ②数码管显示的顺序与预想中的相反
    解决办法:
    ①经过检查,是在存数码管段码的数组中,将A~F的也写了进去,对应“-”“_”“¯”的段码无法对应上去,把A~F的段码删去后正常显示。
    ②经过检查,是数码管的扫描与取段码的顺序不一致,所以只需要把动态扫描的顺序更换一下就可以,修改后正常显示。

    7 设计体会与小结

    此次综合设计可以说是获益匪浅。通过在图书馆和互联网上查阅了很多相关资料,了解到了许多汇编程序的思想,扩展了自己的视野,不再仅仅局限于书本中几条简短的程序,而且更重要的是明白写程序的态度:仔细谨慎,精益求精。
    在明白整个系统的工作流程后,我就开始一个代码一个代码地敲,从基本程序开始逐步添加功能,在没有实验环境的情况下,仔细地推敲自己的程序,把一个个例程打印出来做好笔记,用纸演算,综合处理较多的是按键处理和数码管模块,以及利用有限的I/O实现交通灯LED的开关模块显示。在按键处理中,运用合理的公式将数字键组成(11~99)的数字,利用计数器原理实现不同按键功能的切换;在数码管模块中,要根据不同的时间状态显示不同的字符,在实现动态扫描的同时,保留开关模块的LED交通灯状态,学会了让某一位置数或复位的技巧。
    现实是骨感的,再好的程序也需要去检验,在实验室调试过程中,首先就要排除语法错误等的错误,一些小的细节自己也无法即时检查出来,在系统加电调试中,针对一些问题,将错误之处缩小在最小范围内,通过后期一次次的排查终于将整个系统完善好。
    这次设计,我把学过的计算机编译原理的知识强化,能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解。以前对微机原理与系统的认识是模糊的,概念上的,现在通过自己动手做实验,从实践上认识了微机系统是如何处理命令的,如何协调各个部件运行,对微机编译原理的认识更加深刻。
    最后,综合所学微机原理与接口技术相关软件、硬件知识,并应用基础实验所获得的实验设计技能,独立设计解决实际应用问题的系统。

    前面部分源程序:详见完整报告文件

    /***********************************************************
     * 文件名: Traffic_Light.c
     * 功能描述: 使用8255、8253及8259完成交通灯综合设计实验
     **********************************************************
     *  8255的B口为数码管的段驱动
     *  A口  PA0~PA5    为数码管位驱动
     *  A口  PA0~PA3    为列扫描
     *  C口  PC0~PC3    为行扫描
     *  A口  PA6~PA7                        PC口为黄灯,方便置数/复位  
     *  C口  PC4     为东西方向指示灯    PA7-红,PA6-绿,PC4-黄
     *  C口  PC5~PC7    为南北方向指示灯    PC7-红,PC6-绿,PC5-黄
     *  按下按键,对应功能会被执行。
     ********************************************************/
    
    #include <stdlib.h>
    #include <conio.h>
    #define uchar unsigned char 
    
    //8254端口地址IOY3      接1MHz的CLK
    #define M8254_A     0x6c0
    #define M8254_B     0x6c2
    #define M8254_C     0x6c4
    #define M8254_CON   0x6c6
    
    //8255端口地址IOY0
    #define MY8255_A     0x0600
    #define MY8255_B     0x0602
    #define MY8255_C     0x0604
    #define MY8255_MODE  0x0606
    
    #define Rdata(port)     inportb(port)
    #define Wdata(port, x)  outportb(port, x)
    
    //晶振:12MHz
    void dis(void);
    void clear(void);           //清屏
    void ccscan(void);          //按键扫描
    void getkey(void);          //获取键值key_num
    void delay(int time);
    
    void Initial(void);
    void Ini_Interrupt(void);
    void Ini_Timer(void);
    void Button_Pro(void);
    
    void EW1_update(void);      //东西绿南北红
    void EW2_update(void);      //东西黄南北红
    void SN1_update(void);      //东西红南北绿
    void SN2_update(void);      //东西红南北黄
    void set_update(void);      //更新设置时应显示的值
    
    /******************************
    变量、控制位定义
    ******************************/
    uchar EW=12,SN=15;          //初始化交通灯通行时间
    
    /*  交通灯端口定义
    #define EW_red      PA7:X0000000b   
    #define EW_green    PA6:0X000000b   
    #define EW_yellow   PC4:000X0000b   
                    X=1,亮   X=0,灭
    #define SN_red      PC7:X0000000b   
    #define SN_green    PC6:0X000000b   
    #define SN_yellow   PC5:00X00000b   */
    
    uchar EW_SN;                //功能键标志
    uchar EW_EN;
    uchar SN_EN;
    uchar TIME_SET;             //设置键标志
    uchar EW_TEMP;
    uchar SN_TEMP;
    
    char Time_EW;               //东西方向计时变量
    char Time_SN;               //南北方向计时变量
    
    // 数码管显示对应值代码
    char a[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 
                0x6d, 0x7d, 0x07, 0x7f, 0x6f, 
                0x01, 0x40, 0x08};
    //最后3位是用数码管表示的东西南北方向红绿灯状态,分别是红"ˉ"、黄"-"、绿"_"
    
    //每0.5s进入一次中断,表示1Hz的方波时钟信号的电平,用给黄灯当闪烁频率
    uchar count=0;
    
    //设置模式下存放要显示的值,与a[]配合使用
    char SET_NUM [6];
    //char SET_NUM  = {EW_TEMP/10,EW_TEMP%10,'-','-',SN_TEMP/10,SN_TEMP%10};
    
    //正常模式下存放要显示的值,与a[]配合使用
    char TIME_NUM [6];
    //char TIME_NUM = {EW/10,EW%10,EW_STATE,SN_STATE,SN/10,SN%10};
    
    int  cc;
    //按键值0~f
    int  key_num;
    

    完整文档下载:
    https://download.csdn.net/download/u012579502/10655911

    展开全文
  • 基于可编程控制交通红绿灯模拟系统设计,高珩,邱烨,本文在综合分析了8255A及8253芯片的特点之后,运用二者的特性,进行了交通红绿灯模拟系统设计,在详细阐述了设计思想及电路设计方案
  • 为解决城市路灯照明系统存在的灯光控制方法和管理手段落后,所用灯具科技含量低等问题,设计了一个模拟路灯控制系统。采用高效节能LED路灯作为光源,采用AT89S52单片机作为控制中心,利用传感器模块、光控路灯模块、...
  • 摘 要:本文在综合分析了8255A 及8253 芯片的特点之后,运用二者的特性,进行了交通红绿灯模拟系统设计,在详细阐述了设计思想及电路设计方案之后,对该系统的有效性测试表明了该交通红绿灯模拟系统具有较为可靠的...
  •  在倡导绿色用电的今天,路灯节能控制日益成为人们关注的话题,这里设计并制作一套模拟路灯节能控制系统。节能控制系统结构如图1 所示。 图1 模拟路灯节能控制系统结构图  模拟路灯节能控制系统实现的功能: ...
  • 摘要:为解决城市路灯照明系统存在的灯光控制方法和管理手段落后,所用灯具科技含量低等问题,设计了一个模拟路灯控制系统。采用高效节能LED路灯作为光源,采用AT89S52单片机作为控制中心,利用传感器模块、光控路灯...
  • 系统采用单片机AT89C51为中心器件来设计交通灯控制器,系统实用性强、操作简单、扩展性强。本设计就是采用单片机模拟十字路口交通灯的各种状态显示以及倒计时时间。 本设计系统由单片机I/O口扩展系统、交通灯状态...
  • 摘要:为解决城市路灯照明系统存在的灯光控制方法和管理手段落后,所用灯具科技含量低等问题,设计了一个模拟路灯控制系统。采用高效节能LED路灯作为光源,采用AT89S52单片机作为控制中心,利用传感器模块、光控路灯...
  • C8051F020 单片机作为模拟路灯控制系统支路控制,实现模拟路灯控制系统的时钟功能,设定显示开关时间,并能控制支路按时开灯和关灯; 根据环境明暗的变化自动控制开灯和关灯; 根据交通情况自动调节亮灯状态; ...
  • 本文是基于张孝祥Java视频做的总结,本人新手,不喜勿喷 需求 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 异步随机生成按照各个路线行驶的车辆。 例如: 由南向而来去往北向的车辆 ---- 直行车辆 由西向...

    本文是基于张孝祥Java视频做的总结,本人新手,不喜勿喷

    需求

    模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:

    异步随机生成按照各个路线行驶的车辆。

    例如:

    由南向而来去往北向的车辆 ---- 直行车辆

    由西向而来去往南向的车辆 ---- 右转车辆

    由东向而来去往南向的车辆 ---- 左转车辆

    。。。

    信号灯忽略黄灯,只考虑红灯和绿灯。

    应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。

    具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。

    注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。

    每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。

    随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。

    不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。

    分析

    涉及到的对象有:车辆、交通灯、交通灯控制器、以及路线。

    由于是模拟交通灯管理逻辑,我们可以用字符串代替车辆来模拟这个过程

    车是否通过路口是通过交通灯决定的,所以每个路线对应一个交通灯,为了统一编程,右转路线也加入交通灯,只不过状态一直为绿灯即可

    这样就有12条线路,对应12个交通灯

    下面我们来看路口通行图示

     

    crossroad

    可以看到画相同线条的路线上的交通灯其实是同步的,由南向北与由北向南的灯应该同时绿,同时红,又由于右转灯维护为常绿,所以,需要交通灯控制器控制的灯,其实只有4个,分别是图中标注1,2,3,4的4条路线上的灯

    面向对象设计

    交通灯Lamp类设计:

    由于交通灯是贯穿整个逻辑的,同时又只存在12个灯的实例对象,所以我们可以设计成枚举

    内部维护自己的红绿状态

    对外提供改变自己与对应灯状态的方法

    路线Road类设计:

    每条路线需要有一个自己的名字来注明自己具体是哪条路线

    内部还需要维护一个集合类来存放车辆,这里车辆用字符串名称来模拟

    运行过程中通过一个定时器每隔一秒来判断自己路线上的灯是否为绿,为绿,则放行,为红,则等待

    交通灯管理器LampControler类设计:

    内部维护一个迭代器代表路口当前可通行的灯,通过定时器每隔固定时间改变当前灯的状态,并获取下一组灯,使之变绿

    实现

    Lamp类

       1: public enum Lamp {
       2:     /**
       3:      *                   |  N    |
       4:      *                   |       |
       5:      *                   |       |
       6:      *                   |       |
       7:      *                   |       |
       8:      * ------------------         ------------------
       9:      *                           
      10:      *  W                                        E
      11:      *                           
      12:      * ------------------         ------------------
      13:      *                   |       |
      14:      *                   |       |
      15:      *                   |       |
      16:      *                   |       |
      17:      *                   |  S    |
      18:      * */
      19:     
      20:     //表示12个路线上的灯
      21:     S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",false),
      22:     N2S(null,null,false),N2E(null,null,false),W2E(null,null,false),W2N(null,null,false),
      23:     S2E(null,null,true),E2N(null,null,true),N2W(null,null,true),W2S(null,null,true);
      24:     
      25:     //对应方向的灯
      26:     private String oppsite;
      27:     //下一个需要亮的灯
      28:     private String next;
      29:     //当前状态,true表示为绿
      30:     private boolean light;
      31:     
      32:     Lamp(String oppsite,String next,boolean light){
      33:         this.oppsite = oppsite;
      34:         this.next = next;
      35:         this.light = light;
      36:     }
      37:     
      38:     //lightUp表示亮起绿灯
      39:     public void lightUp(){
      40:         
      41:         light = true;
      42:         System.out.println(name()+ " 绿灯亮了");
      43:         //如果对应灯非空,则同时改变对应方向灯的状态
      44:         if(oppsite != null)
      45:             Lamp.valueOf(oppsite).lightUp();
      46:     }
      47:     
      48:     //lightDown表示亮起红灯
      49:     public Lamp lightDown(){
      50:         light = false;
      51:         System.out.println(name()+ " 红灯亮了");
      52:         
      53:         //如果对应灯非空,则同时改变对应方向灯的状态
      54:         if(oppsite != null)
      55:             Lamp.valueOf(oppsite).lightDown();
      56:         //返回下一个方向上的灯
      57:         if(next != null)
      58:             return Lamp.valueOf(next);
      59:         return null;
      60:     }
      61:     
      62:     //获得当前状态
      63:     public boolean isLight(){
      64:         return light;
      65:     }
      66: }

    LampControler类

       1: public class LampControler {
       2:     //表示循环控制的第一个灯,也为当前灯
       3:     Lamp currentLamp = Lamp.S2N;
       4:     
       5:     //提供开始交通灯控制的方法
       6:     public void start(){
       7:         
       8:         //当前灯亮绿灯
       9:         currentLamp.lightUp();
      10:         
      11:         //定时器
      12:         ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
      13:         
      14:         //每隔10秒改变灯的状态
      15:         timer.scheduleAtFixedRate(
      16:                 new Runnable(){
      17:                     public void run(){
      18:                         //当前灯变暗,并获得下一组灯的引用
      19:                         currentLamp = currentLamp.lightDown();
      20:                         //下一组灯亮绿灯
      21:                         currentLamp.lightUp();
      22:                     }
      23:                 }, 
      24:                 10, 
      25:                 10, 
      26:                 TimeUnit.SECONDS);
      27:     }
      28: }

    Road类

       1: public class Road {
       2:     
       3:     //路线名称
       4:     private String name;
       5:     //存放车辆的集合
       6:     private List<String> vechicles = new LinkedList<String>();
       7:     
       8:     public Road(String name){
       9:         this.name = name;
      10:         
      11:         //开一个线程池,每隔1-5秒产生一辆车
      12:         ExecutorService pool = Executors.newSingleThreadExecutor();
      13:         
      14:         pool.execute(new Runnable(){
      15:             public void run(){
      16:                 for(int i = 0 ; i < 1000 ; i ++){
      17:                     try {
      18:                         Thread.sleep((new Random().nextInt(5)+1)*1000);
      19:                     } catch (InterruptedException e) {
      20:                         // TODO Auto-generated catch block
      21:                         e.printStackTrace();
      22:                     }            
      23:                     vechicles.add(Road.this.name+"_"+i);
      24:                 }
      25:             }
      26:         });
      27:         
      28:         //定时器
      29:         ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
      30:         //每隔一秒判断一次当前路线上灯的状态
      31:         timer.scheduleAtFixedRate(
      32:                 new Runnable(){
      33:                     public void run(){
      34:                         //如果当前路线上有车
      35:                         if(vechicles.size() > 0){
      36:                             //如果当前灯是绿灯
      37:                             if(Lamp.valueOf(Road.this.name).isLight()){
      38:                                 //则通过一辆车
      39:                                 String car = vechicles.remove(0);
      40:                                 System.out.println(car+" has passed");
      41:                             }
      42:                         }
      43:                     }
      44:                 }, 
      45:                 1, 
      46:                 1, 
      47:                 TimeUnit.SECONDS);
      48:     }
      49: }

    测试类

       1: public class MainClass {
       2:  
       3:     /**
       4:      * @param args
       5:      */
       6:     public static void main(String[] args) {
       7:         //控制器开始工作
       8:         new LampControler().start();
       9:         
      10:         //创建12条路线实例
      11:         Lamp[] lamps = Lamp.values();
      12:         for(int i = 0 ; i < lamps.length ; i ++){
      13:             new Road(lamps[i].name());
      14:         }
      15:     }
      16: }

    总结

    再次声明,这是张孝祥老师视频的项目总结,上面实现过程基本是照抄的老师的代码

    由于还没有看设计模式,所以很多想法实现起来非常复杂,等以后深入了,再放上自己的代码

    总结下这个实现的利弊吧

    优点:

    思路非常清晰,逻辑简单明了,用来模拟一个逻辑是够用了

    不足:

    因为只是个逻辑,所有感觉程序扩展性不强,等以后深入了设计模式,会放上自己的框架

     

    现在对设计模式的理解只有一条原则,就是开放封闭原则

    即:对扩展开放,对修改封闭

    转载于:https://www.cnblogs.com/ShawnWithSmallEyes/p/3465895.html

    展开全文
  • 提出了一套自动交通灯比例时长智能交通控制方案,即根据车流量的实际情况,自动调节信号周期和红绿灯配时比例,以尽量减少道路交通路口的车辆滞留,实现交通灯的智能化控制;系统采用ZigBee和RFID相结合的无线控制技术,...
  • 针对道路交通拥挤、交叉路口经常出现拥堵的情况,本系统采用单片机作为核心控制器,组成一个集车流量...通过仿真本设计模拟基本的交通控制系统还能进行倒计时显示,车流量检测及调整,交通违规处理和紧急处理等功能。
  • 设计采用的是单片机AT89S52作为核心芯片,采用一些相应的外围电路,比如时钟晶振电路,复位电路,显示电路,系统模拟电路等等。在硬件电路的设计方面,主题思想是用一片单片机加上输出的LED显示器和LED发光二极管...
  • 1.东西、南北两个方向都通行25s(绿灯亮),警告5s(黄灯亮),禁行30s(红灯亮),用LED模拟交通灯 2.各个方向用数码管显示剩余时间 3.考虑到异常状态 东西发生异常时,东西通行,南北禁止,东西方向绿灯闪,南北...

    1.东西、南北两个方向都通行25s(绿灯亮),警告5s(黄灯亮),禁行30s(红灯亮),用LED模拟交通灯
    2.各个方向用数码管显示剩余时间
    3.考虑到异常状态
    东西发生异常时,东西通行,南北禁止,东西方向绿灯闪,南北方向红灯闪60s
    南北方向异常时,南北通行,东西禁行,南北方向绿灯闪,东西方向红灯闪60s
    4.两种异常用外部中断0和外部中断1管理,外接开关模拟异常发生

    proteus电路图如下:(如有需要原图的可评论找我拿)
    在这里插入图片描述

    代码如下:
    #include<reg51.h>
    sbit SN_green=P0^3;
    sbit SN_yellow=P0^4;
    sbit SN_red=P0^5;
    sbit EW_green=P0^0;
    sbit EW_yellow=P0^1;
    sbit EW_red=P0^2;
    //sbit SN_cg=P2^0;
    //sbit SN_cs=P2^1;
    //sbit EW_cg=P2^2;
    //sbit EW_cs=P2^3;
    unsigned char data cnt_sn,cnt_ew;
    unsigned int data T1_cnt;
    unsigned char data state_val_sn,state_val_ew;
    //char code led_seg_code[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
    char code led_seg_code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
    char code init_sn[3]={24,4,29};
    char code init_ew[3]={29,24,4};
    void delay(unsigned int t)
    {
    while(–t);
    }
    void led_show(unsigned int u,unsigned int v)
    {

    unsigned char i;
    i=u%10;
    P1=led_seg_code[i];
    P3=0xef;
    
    //SN_cg=0;
    //SN_cs=1;
    delay(50);
    P3=0xff;
    i=u%100/10;
    P1=led_seg_code[i];
    P3=0xdf;
    
    //SN_cg=0;
    //SN_cs=1;
    delay(50);
    P3=0xff;
    i=v%10;
    P2=led_seg_code[i];
    P3=0xbf;
    
    //EW_cg=0;
    //EW_cs=1;
    delay(50);
    P3=0xff;
    i=v%100/10;
    P2=led_seg_code[i];
    P3=0x7f;
    
    //EW_cg=1;
    //EW_cs=0;
    delay(50);
    P3=0xff;
    

    }
    void timer1() interrupt 3
    {
    T1_cnt++;
    if(T1_cnt>3999)
    {
    T1_cnt=0;

    if(cnt_sn!=0)
    {
    	cnt_sn--;
    }
    else
    {
    	state_val_sn++;
    	if(state_val_sn>2)state_val_sn=0;
    	cnt_sn=init_sn[state_val_sn];
    	if(state_val_sn==0)
    	{
    		SN_green=0;
    		SN_yellow=1;
    		SN_red=1;
    	}
    	else if(state_val_sn==1)
    	{
    		SN_green=1;
    		SN_yellow=0;
    		SN_red=1;
    	}
    	else if(state_val_sn==2)
    	{
    		SN_green=1;
    		SN_yellow=1;
    		SN_red=0;
    	}
    }
    if(cnt_ew!=0)
    {
    	cnt_ew--;
    }
    else
    {
    	state_val_ew++;
    	if(state_val_ew>2)state_val_ew=0;
    	cnt_ew=init_ew[state_val_ew];
    	if(state_val_ew==0)
    	{
    		EW_green=1;
    		EW_yellow=1;
    		EW_red=0;
    	}
    	else if(state_val_ew==1)
    	{
    		EW_green=0;
    		EW_yellow=1;
    		EW_red=1;
    	}
    	else  if(state_val_ew==2)
    	{
    		EW_green=1;
    		EW_yellow=0;
    		EW_red=1;
    	}
    }
    

    }
    }
    void abnorma1() interrupt 0 //异常1 南北通行
    {
    cnt_sn=60;
    cnt_ew=60;
    SN_green=0;
    SN_yellow=1;
    SN_red=1;
    EW_green=1;
    EW_yellow=1;
    EW_red=0;
    }
    void abnorma2() interrupt 2 //异常2 东西通行
    {
    cnt_sn=60;
    cnt_ew=60;
    SN_green=1;
    SN_yellow=1;
    SN_red=0;
    EW_green=0;
    EW_yellow=1;
    EW_red=1;
    }
    main()
    {
    cnt_sn=init_sn[0];
    cnt_ew=init_ew[0];
    T1_cnt=0;
    state_val_sn=0;
    state_val_ew=0;
    SN_green=0;
    SN_yellow=1;
    SN_red=1;
    EW_green=1;
    EW_yellow=1;
    EW_red=0;
    TMOD=0x20;
    TH1=0x19;
    TL1=0x19;
    EA=1;
    ET1=1;TR1=1;
    IT1=1;EX1=1;
    IT0=1;EX0=1;
    while(1)
    { delay(10);
    led_show(cnt_sn,cnt_ew);
    }
    }

    展开全文
  • 设计是关于单片机控制交通灯模拟系统设计。主要内容有交通灯模拟系统设计方案,主要功能,各功能模块的介绍,电路设计,硬件部分设计,软件部分设计模拟系统的仿真调试,设计方法以及课程设计的心得体会等等。...
  •  在倡导绿色用电的今天,路灯节能控制日益成为人们关注的话题,这里设计并制作一套模拟路灯节能控制系统。节能控制系统结构如图1 所示。 图1 模拟路灯节能控制系统结构图  模拟路灯节能控制系统实现的功能: ...
  • C8051F020 单片机作为模拟路灯控制系统支路控制核心,实现模拟路灯控制系统的时钟功能,设定显示开关时间,并能控制支路按时开灯和关灯; 根据环境明暗的变化自动控制开灯和关灯; 根据交通情况自动调节亮灯状态;...
  • 微机程序设计应用:交通信号灯控制系统

    千次阅读 多人点赞 2015-02-14 19:43:16
    2、总体方案设计与方案论证(1) 总体方案设计 设计路口交通灯控制系统,使用LED显示单元的两组发光二极管(红黄绿)分别模拟十字路口的两组交通灯。a、南北路口的绿灯、东西路口的红灯同时亮20秒。数码管20秒倒记时...

    1、设计任务

    	交通信号灯控制系统:要求能显示剩余时间和控制红、黄、绿三色灯的显示。
    

    2、总体方案设计与方案论证

    (1) 总体方案设计

    	设计路口交通灯控制系统,使用LED显示单元的两组发光二极管(红黄绿)分别模拟十字路口的两组交通灯。
    
    a、南北路口的绿灯、东西路口的红灯同时亮20秒。数码管20秒倒记时显示。
    b、南北路口的黄灯亮5秒,同时东西路口的红灯继续亮。数码管5秒倒记时显示。
    c、南北路口的红灯、东西路口的绿灯同时亮20秒。
    d、南北路口的红灯继续亮、同时东西路口的黄灯亮5秒。
    e、转(1)重复。(并能在此基础添加一些功能,如紧急开关按下,时间暂停,两组路口都显示红灯)
    

    (2) 方案论证

    	将交通灯的显示规律进行观察,发现有“红绿、红黄、绿红、黄红”四种状态,将交通灯的显示抽象为这四种状态的循环切换,如需产生不同的时间,只需将每种状态直接加入一个延时程序即可,为了更加准确的记录时间和显示剩余时间,我们觉得采用8253来控制一秒,循环执行十次就是十秒,二十次就是二十秒。这样便可以完成任务。
    	由上论证可知,方案可行,可以进行具体设计和操作。
    

    3、总框图及总体软件设计说明

    (1) 总框图

    (2) 总体软件设计说明

    a、通过8253计数,每1s输出一个脉冲,刷新10次,持续十秒钟,重复减一直至零为止;
    b、8255的C口低四位作为输入输出端口,C口高四位控制某个数码管显示,B口控制数码管显示值,A口控制交通灯;
    c、交替选中数码管的高低位码,计数的同时数码管显示数字,并且交通灯亮;
    d、8253锁存并读数进行;
    e、计数至零时状态转换,数码管重新显示下一状态的数字,交通灯转换至下一状态;       
    f、重复上述过程,使交通灯的四个状态不断循环秒钟;
    

    4、接口电路逻辑图及硬件设计说明,或系统资源使用说明

    (1) 接口电路逻辑图

    (2) 硬件设计说明

    8253芯片说明

    	8253有3个独立的16位计数器,有6种工作方式。
    	利用8253的减法计数器原理,每送来一个脉冲就减1,减到0产生一个定时信号输出。
    	因为计数频率为2MHz,计数器的最大数值为65536,所以最大的定时时间为0.5us*65536=32.768ms,达不到1S的要求,因此需要用两个计数器级联来解决问题。
    	将2MHz的的时钟信号直接加在CLK0输入端,并让计数器0工作在方式2,选择计数初始值为5000,则从out0端可得到2MHz/5000=400Hz的脉冲,周期为0.25ms。再将该信号连到CLK1输入端,并使计数器1工作在方式2下,为了使out1输出周期为20s的波形,所以取时间常数为400.然后由out1输出到8255的PC0上,通过上升下降沿来判断1s是否结束。
    

    8255芯片说明

    	 8255A可为外设提供3个8位I/O端口,即A口,B口,C口,每个端口又可分两组编程,能工作于3种操作模式。
    	该实验使用8255A来作为输入输出的控制操作,将C口分为上下口,分别由A,B口控制。PC0用来接收8253的out1输出的信号,通过沿来判断是否完成1S计时。PC1用来判断有无紧急键按下,若为高电平则是紧急状态,使四个路口的红灯都亮。
    	C口的高四位用来控制数码管的显示位数,测试知数码管为低电平有效,当状态控制字分别为1101,1110时对应的第二位和第一位亮。然后进行循环。
    	A口作为输出端连接到发光二极管上,通过接收状态控制字来显示对应的灯。
    	B口也是作为输出端按顺序连接到数码管的LA,B,C,D,E,F,G,H上。
    

    5、局部程序框图及其设计说明

        首先,利用8253初始化,使其产生周期为一秒的脉冲,将主程序中规定的循环次数(即、秒数)在子程序中控制产生脉冲的个数,一个脉冲即为一秒。
        判断是否为一个脉冲,采用上升沿判断,出现一个上升沿即产生一个脉冲,循环次数减一,直到有n个脉冲,即已经过了n秒。
        紧急键的按下在延时过程中进行判断,如果按下,则循环判断紧急键的状态,并一直输出紧急状态的情况。当紧急键放开,则继续紧急前的状态继续延时。
    

    	延时的剩余次数即为剩余时间,因此,只要将CX的值显示在数码管处即可达成显示时间的目的。
    	CX中存有两位数,此时,将CX的值处以10,在AH和AL中分别得到余数(个位数字)和商值(十位数字)。
    	让两位数字同时显示,则需要将两位数字分别在数码管的高低两位显示出来,并且不断循环显示,此时显示频率很快,肉眼看上去就是两位同时亮的状态。
    

    6、源程序清单(详细注释)

    CODE SEGMENT
     ASSUME CS:CODE
    START:MOV AX,CS
          MOV DS,AX
          MOV DX,203H			;8255初始化,连接端口IOY0
          MOV AL,10000001B		;A口输出接LED,B口输出接数码管,C0~C3输入,C4~C7输出
          OUT DX,AL
    	  CALL INITIAL_8253		;8253初始化
    A1:   MOV DX,200h   		;8255的A口接
          MOV AL,01101111B  	;东西红,南北绿
          OUT DX,AL         	;将灯状态传送给LED显示
          MOV CX,20       		;计时20秒
          CALL action
          MOV DX,200h   		;东西红,南北黄     
          MOV AL,01111011B
          OUT DX,AL
          MOV CX,5         	;计时5秒
          CALL action
          MOV DX,200h			;东西绿,南北红   
          MOV AL,10011111B
          OUT DX,AL
          MOV CX,20     		;计时20秒
          CALL action  
          MOV DX,200h   		;东西黄,南北红    
          MOV AL,10110111B
          OUT DX,AL
          MOV CX,5        		;计时5秒
          CALL action
          JMP A1            	;循环到状态A1,即东西红,南北绿
    EXIT: MOV AH,4CH
          INT 21H
          
    
    action PROC
    	  PUSH AX
          PUSH DX
          PUSH CX
          mov ah,al					;保存紧急状态前的路灯的状态	
    LOOP2:
    	  mov dx,202h
          in al,dx
          test al,02h				;判断c口倒数第二位是否有状态
          JnZ L1 					;无紧急状态         
        						;有紧急键则转到紧急键处理
          CALL DISP				;显示当前时间  
          mov dx,200h
    	  mov AL,00111111B		;路口都显示红灯
    	  out dx,al
          JMP LOOP2
    L1:	  mov dx,200h
          mov al,ah
    	  out dx,al
          CALL DISP
    L2:   MOV DX,202h				;检测1s是否计完
    wait1:
    	  CALL DISP
    	  IN AL,DX
          TEST AL,01H
          JZ wait1                	;若1s没计数完,继续    
    wait2:
    	  CALL DISP
    	  IN AL,DX
          TEST AL,01H
          JNZ wait2   
          LOOP LOOP2             ;20s或5s计数完全?若没计数完,继续
          POP CX
          POP DX
          POP AX
          RET 
    action ENDP
    
    INITIAL_8253  PROC          ;8253初始化,1s
          PUSH AX
          PUSH DX
    	  mov al,00110101B
    	  mov dx,20Bh
    	  out dx,al
    	  mov al,00h
    	  mov dx,208h
    	  out dx,al
    	  mov al,50h
    	  mov dx,208h
    	  out dx,al
    	  mov al,01110101B
    	  mov dx,20Bh
    	  out dx,al
    	  mov al,00h
    	  mov dx,209h
    	  out dx,al
    	  mov al,04h
    	  mov dx,209h
    	  out dx,al
          POP DX
          POP AX
          RET
    INITIAL_8253 ENDP
    
    time1 PROC near
            lea di,time
            lea si,x1
            MOV CX,2
            MOV AL,11101111b  		;AL=DFH 1101 1111  控制 Y1~Y5 循环点亮
            MOV [si],AL      
    l31:	    mov dx,202h
     		mov al,0ffh
     		out dx,al
            MOV DX,201H	   		;B口输出段码
       	    MOV AL,[DI]
    	    OUT DX,AL	 
    	    INC DI		
    	    MOV AL,[si]
            MOV DX,202H    		;c口输出
    	    OUT DX,AL
    	    ROl byte ptr[si],1			;循环左移一位   
    	    loop l31
    	    RET
    time1 ENDP
    
    DISP PROC                  	 	;数码管显示
    	   	PUSH AX
    		PUSH BX
    		PUSH DX
    		PUSH CX		
    		lea di,time
    		MOV AX,CX
    		MOV CL,0AH  			;将CL中16进制数转化为十进制数
    		DIV CL
    		MOV BX,OFFSET table1
    		XLAT
    		mov [di],al
    		inc di
    		mov al,ah
    		MOV BX,OFFSET table1
    		XLAT
    		mov [di],al			
    		call time1		
    		POP CX
    		POP DX
    		POP BX
    		POP AX
    		RET
    DISP ENDP
    
    table1 DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH  
    time db 2 dup(?)
    x1 db ?
    
    code ends
    	end start
    

    7、系统功能与操作说明

    a、南北路口的绿灯、东西路口的红灯同时亮20秒。数码管20秒倒记时显示。
    b、南北路口的黄灯亮5秒,同时东西路口的红灯继续亮。数码管5秒倒记时显示。
    c、南北路口的红灯、东西路口的绿灯同时亮20秒。
    d、南北路口的红灯继续亮、同时东西路口的黄灯亮5秒。
    e、转a循环
    f、期间,紧急开关按下,时间暂停,两组路口都显示红灯;紧急开关拨起,继续暂停前的状态继续
    

    8、总结

    	这个设计是利用四种状态来表示两个路口的红绿灯状态,使用这样化整为零的方法,再利用8255对四种状态进行切换控制,使每种状态之间利用一个延时子程序先进行大概的延时,再利用8253进行对一秒钟的准确延时,利用循环的方式,循环十次为十秒,则完成了对每种信号灯状态的准确定时;为了解决AB口都被占用,而还需要输出口进行对数码管高低位选择的控制,则想到了使用C口的高四位进行该项操作,至于之后的紧急状态的设置,则靠C口的低四位进行输入控制,只需判断相应位置的状态便可以进行这一类的操作。
    	整个实验最困难的地方就是最开始对四种状态的分析,世界上的任何事物总可以使用各种状态来表示,事物的变换规律也可以使用状态之间的转化来体现出来。我们可以将身边的事物转化为某种逻辑关系,这样就能实现各种功能的设备了。
    
    展开全文
  • :使用凌阳科技的SPCE061A 单片机以及模拟交通灯控制模组建立了带语音提示功能的十字路口智能交通灯控 制系统,并在此平台上完成对交通灯状态进行模拟控制的软件设计。充分利用SPCE061A 的语音特性,不仅具有红绿灯显 ...
  • 鉴于此,本文介绍一种基于S7-200 PLC信号灯控制系统设计方案,通过用可编程控制器(S7-200 PLC)控制交通灯模拟工作,详细叙述了交通灯的PLC控制系统的设计方法。该设计方案详细介绍了交通灯的PLC控制系统的设计...
  • 摘要 模拟交通信号控制下路口的交通情况,是用程序在模拟现实生活中的路面和十字路口的交通情况,这样做是非常有实际意义的。在现实生活中,观察和调试一个路口的交通信号和路面的状况是要花要化很长的时间。如果...
  • 利用8253定时,8259中断及8255输出实现十字路口交通灯模拟控制。 2.实现能自动控制和手动控制。 3.实现能随时可以调整自动模式的绿灯和红灯时间 4.设计电路并在实验台上连接线路。 备注:希望能够给需要的人带来...

空空如也

空空如也

1 2 3 4 5 6
收藏数 101
精华内容 40
关键字:

交通灯控制系统模拟设计