精华内容
下载资源
问答
  • 交通灯控制电路设计,proteus仿真

    热门讨论 2010-03-20 12:10:44
    首先进行交通灯状态变换的分析和交通灯总体框架的设计,接着提出了2种电路设计方案,通过优劣比较后选定了方案2:先设计让倒计时显示器按规律运行的电路,再通过倒计时电路的信号来控制交通灯按4种状态循环变换。...
  • 内容: 1、设计一个十字路口的交通灯控制电路,要求东西方向车道和南北方向车道两条交叉道路上的车辆交替运行,每次通行时间都设为45秒。时间可设置修改。 2、在绿灯转为红灯时,要求黄灯先亮5秒钟,才能变换...
  • 45s交通灯电路设计

    2014-12-24 13:25:33
    45秒交通灯电路设计,有45s倒计时,定时电路,控制电路,秒脉冲设计
  • 设计一个基于单片机的交通灯信号控制器。已知东、西、南、北四个方向各有红黄绿色三个灯,在东西方向有两个数码管,在南北方向也有两个数码管。要求交通灯按照表1进行显示和定时切换,并要求在数码管上分别倒计时...
  • ①可用LED模拟交通灯; ②主道路绿、黄、红灯亮的时间分别为60秒、5秒、25秒; 次道路绿、黄、红灯亮的时间分别为20秒、5秒、65秒; ③主、次道路时间指示采用倒计时制,用2位数码管显示。 (2)扩展部分 ①主、...
  • 设计一个十字路口的红、绿、黄三色信号交通灯控制电路设计要求: 1). 用红、绿、黄三色发光二极管作信号灯。主干道为东西向,有红、绿、黄三个灯;支干道为南北向,也有红、绿、黄三个灯。红灯亮禁止通行;绿灯...
  • 基于51单片机的交通灯控制系统设计

    万次阅读 多人点赞 2018-11-24 13:38:11
    设计为基于51单片机交通灯系统的设计,采用模块化、层次化设计。运用单片机AT89C51进行数据的分析和处理,为显示提供信号,显示部分采用8位数码管显示倒计时值。系统电路简单、集成度高、工作稳定、调试方便、检测...

    第一章 硬件设计与原理
    以AT89C51单片机为核心,起着控制作用。系统包括数码管显示电路、复位电路、时钟电路、发光二级管电路和按键电路。设计思路分为六个模块:复位电路、晶振电路模块、AT89C51、数码管显示电路、发光二级管电路和按键电路这六个模块。

    在这里插入图片描述

    1.2 硬件设计分析
    1.2.1 电源的设计
    系统电源使用直流5伏。
    由电脑USB接口提供电源。
    USB是通用串行总线(Universal Serial Bus)接口的简称。它是目前使用比较广泛的电脑接口之一,主要版本有1.0、1.1和最新的2.0三种版本。根据USB总线的工业标准,它可以提供额定功率为5V/500mA的电源供USB设备使用。
    1.2.2 单片机最小系统
    51单片机是对目前所有兼容intel 8031指令系统的单片机的统称。该系列单片机的始祖是intel的8031单片机,后来随着技术的发展,成为目前广泛应用的8为单片机之一。单片机是在一块芯片内集成了CPU、RAM、ROM、定时器/计数器和多功能I/O口等计算机所需要的基本功能部件的大规模集成电路,又称为MCU。51系列单片机内包含以下几个部件:
    一个8位CPU;一个片内振荡器及时钟电路;
    4KB的ROM程序存储器;
    一个128B的RAM数据存储器;
    寻址64KB外部数据存储器和64KB外部程序存储空间的控制电路;
    32条可编程的I/O口线;
    两个16位定时/计数器;
    一个可编程全双工串行口;
    5个中断源、两个优先级嵌套中断结构。
    如图1-2-1所示为AT89C51单片机基本构造,其基本性能介绍如下:
    图1-2-1 AT89C51单片机

    AT89C51本身内含40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中端口,3个16位可编程定时计数器,2个全双工串行通信口,STC89C51RC可以按照常规方法进行编程,但不可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
    AT89C51的主要特性如下表所示:

    在这里插入图片描述

    AT89C51为40脚双列直插封装的8位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52相同,其主要用于会聚调整时的功能控制。功能包括对会聚主IC内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。主要管脚有:XTAL1(19脚)和XTAL2(18脚)为振荡器输入输出端口,外接12MHz 晶振。RST/Vpd(9脚)为复位输入端口,外接电阻电容组成的复位电路。VCC(40脚)和VSS(20脚)为供电端口,分别接+5V电源的正负端。P0~P3 为可编程通用I/O脚,其功能用途由软件定义,在本设计中,P0端口(32~39脚)被定义为N1功能控制端口,分别与N1的相应功能管脚相连接,13脚定义为IR输入端,10脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12脚、27脚及28脚定义为握手信号功能端口,连接主板CPU的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。
    P0口:P0口是一组8位漏极开路型双向I/O 口,也即地址/数据总线复用口。作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口P0写“1”时,可作为高阻抗输入端用。在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。在Flash 编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。
    P1口:P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。与AT89C51不同之处是,P1.0和P1.1还可分别作为定时/计数器2 的外部计数输入(P1.0/T2)和输入(P1.1/T2EX)。Flash编程和程序校验期间,P1接收低8位地址。
    P2口:P2是一个带有内部上拉电阻的8 位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口P2写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX @DPTR指令)时,P2口送出高8位地址数据。在访问8位地址的外部数据存储器(如执行MOVX @RI指令)时,P2口输出P2锁存器的内容。Flash编程或校验时,P2亦接收高位地址和一些控制信号。
    P3口:P3口是一组带有内部上拉电阻的8位双向I/O口。P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。此时,被外部拉低的P3口将用上拉电阻输出电流(IIL)。P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能P3口还接收一些用于Flash 闪速存储器编程和程序校验的控制信号。
    RST:复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。
    ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个AL脉冲。对Flash存储器编程期间,该引脚还用于输入编程脉冲(PROG)。如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。该位置位后,只有一条 MOVX 和MOVC指令才能将ALE激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE禁止位无效。
    PSEN:程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89C51由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。在此期间,当访问外部数据存储器,将跳过两次PSEN信号。
    EA/VPP:外部访问允许。欲使CPU仅访问外部程序存储器(地址为0000H—FFFFH),EA端必须保持低电平(接地)。需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。如EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。Flash存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。
    XTAL1:振荡器反相放大器的及内部时钟发生器的输入端。
    XTAL2:振荡器反相放大器的输出端。
    单片机最小原理图如图1-2-2所示。
    图1-2-2 单片机最小系统

    单片机最小系统说明:
    时钟信号的产生:在MCS-51芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,其输出端为引脚XTAL2。而在芯片的外部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器,这就是单片机的时钟振荡电路。
    时钟电路产生的振荡脉冲经过触发器进行二分频之后,才成为单片机的时钟脉冲信号。
    一般地,电容C2和C3取30pF左右,晶体的振荡频率范围是1.2-12MHz。如果晶体振荡频率高,则系统的时钟频率也高,单片机的运行速度也就快。
    单片机复位使CPU和系统中的其他功能部件都处在一个确定的初始状态下,并从这个状态开始工作。单片机复位条件:必须使9脚加上持续两个机器周期(即24个振荡周期)的高电平。
    1.2.3 显示系统
    数码管是一种半导体发光器件,其基本单元是发光二极管。
    数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。
    数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。
    1) 静态显示驱动:静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动(要知道一个89C51单片机可用的I/O端口才32个呢),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。
    2) 动态显示驱动:数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。
    本设计中数码管采用的是动态驱动方式。
    数码管外形如图1-2-3,数码管电路结构如图1-2-4。

    图1-2-3 数码管外形图
    图1-2-4 数码管电路结构示意图

    在这里插入图片描述
    图1-2-5 数码管显示电路
    1.2.4 发光二级管电路

    图1-2-6 发光二级管电路
    1.2.5 按键电路
    图1-2-7 按键电路

    第二章 软件设计与分析
    2.1 软件设计的组成
    该系统由延时子函数、数码管显示子函数、定时器0中断子函数、主函数和数据定义这几部分组成。
    在这里插入图片描述

    在这里插入图片描述

    //----------------------------------------------------------------------//
    上传过程感觉繁琐,里面可能有不全面的地方,请见谅。下面的是实现的目的。以及电路原理图

    **本次设计的主要目的是设计一个城市十字路口的交通灯控制系统,设计中将交通灯控制系统分为东西方向(主干道)和南北方向(次干道)两个方向,且在东西南北四个路口的每个路口设置红、绿、黄三个交通信号灯(用发光二极管模拟)和一个二位的LED数码显示管。设计的要求是规定在每一段时间内东西和南北两个方向中只有一个方向能够通行,另一个方向处于禁行状态,然后在经过一段时间后,禁行的方向和通行的方向互相转换状态,原来通行的状态变禁行状态,原来禁行的状态变为通行状态,如此循环下去。详细过程如下图2-1:
    状态① 状态②
    图 1图2-1 交通灯状态图
    状态①:东西方向的交通灯黄灯闪烁3秒后,红灯熄灭,绿灯点亮(东西方向允许车辆和行人通行),同时南北方向绿灯熄灭,红灯点亮(南北方向禁止车辆和行人通行),LED数码管倒计时显示40秒,在倒计时3秒时进入状态②。
    状态②:南北方向黄灯闪烁3秒后,红灯熄灭绿灯点亮(南北允许车辆和行人通行);同时东西方向绿灯熄灭,红灯点亮
    (东西方向禁止车辆和行人通行),LED数码管倒计时显示40秒,在倒计时3秒时进入状态①。
    接下来在没有人为干涉下将会一直按照上述进行循环。设计中还外设6个按键实现对交通灯控制系统的调控作用。

    电路原理图

    在这里插入图片描述

    在这里插入图片描述

    //——————————————————————————-——————————//
    相应的代码已经上传

    下载地址
    https://download.csdn.net/download/weixin_43442020/12231456

    下载链接里可以下载,解压后里面有压缩文件,压缩文件里面的资料更详细

    展开全文
  • 设计一个交通灯控制器,掌握倒计时计数器、译码器等的工作原理和设计方法。 要 求:  1.设计一个十字路口的的交通灯系统,要求甲车道和乙车道两条交叉道路口的车辆交替运行,每次通过时间都设为25秒。 2.要求...
  • (1) 设计一个十字路口的交通灯控制电路,要求东西方向车道和南北方向车道两条交叉道路上的车辆交替运行,每次通行时间都设为45秒。时间可设置修改。 (2) 在绿灯转为红灯时,要求黄灯先亮5秒钟,才能变换运行车道; ...
  • 1、设计一个十字路口的交通灯控制电路,要求东西方向车道和南北方向车道两条交叉道路上的车辆交替运行,每次通行时间都设为45秒。时间可设置修改。 2、在绿灯转为红灯时,要求黄灯先亮5秒钟,才能变换运行车道; 3、...
  • 器 计数器 译码驱动电路和数字显示电路等组成,它除了实现基本交通灯功能外,还具有倒计时显示 时间设置功能 相比于采用单片机或 FPGA 实现交通灯设计,新设计方法简单,不需要软件编程和调试 最后经 Proteus 软件...
  • AT89C51单片机的交通灯控制系统是由AT89C51单片机、键盘电路、LED倒计时交通灯显示等模块组成。系统除基本交通灯功能外,还具有通行时间手动设置、可倒计时显示、急车强行通过、交通特殊情况处理等相关功能,实验...
  • 【Electronics】数字电路实验——交通灯设计

    千次阅读 多人点赞 2019-04-12 23:08:07
    单元电路的工作原理4.1 单位时间模块4.2 二分频信号产生4.3交通灯控制电路模块4.4 倒计时数码管显示模块5.拓展部分:手动设置单位时间模块5.1 手动设置二、三分频切换模块5.2 手动设置数码管倒计时电路相应的切换6....

    1.内容摘要

           为了确保十字路口的车辆顺利、畅通地通过,往往都采用自动控制信号灯来进行指挥。其中红灯(R)亮,表示该条道路禁止通行;黄灯(Y)亮表示停车;绿灯(G)亮表示允许通行。
           本文探讨了简单的交通灯逻辑控制电路设计,设计了南北和东西两个方向的十字路口交通灯控制电路,同时实现简单的倒计时功能。

    2.设计任务及要求

    设计一个十字路口交通信号灯控制器。基本要求如下:
           1.满足图3.1.2顺序工作流程。图中设南北方向的红、黄、绿灯分别为NSR、NSY、NSG,东西方向的红、黄、绿灯分别为EWR、EWY、EWG。它们的工作方式有些必须是并行进行的,即南北方向绿灯亮,东西方向红灯亮;南北方向黄灯亮,东西方向红灯亮;南北方向红灯亮,东西方向绿灯亮;南北方向红灯亮,东西方向黄红灯亮。
           2.应满足两个方向的工作时序:即东西方向亮红灯时间应等于南北方向亮黄、绿灯时间之和,南北方向亮红灯时间应等于东西方向亮黄、绿灯时间之和。时序工作流程图3.1.3所示。图3.1.3中,假设每个单位时间为3秒,则南北、东西方向绿、黄、红灯亮时间分别15秒、3秒、18秒,一次循环为36秒。其中红灯亮的时间为绿灯、黄灯亮的时间之和。交通灯工作顺序流程图如下:
    在这里插入图片描述
    在这里插入图片描述
           3.十字路口要有数字显示,作为时间提示,以便人们更直观地把握时间。具体为:当某方向绿灯亮时,置显示器为某数,然后以每秒减1计数方式方式工作,直至减到绿灯灭为止;当黄灯亮时,置显示器为某数,然后以每秒减1计数方式方式工作,直至减到黄灯灭为止;当红灯亮时,置显示器为某值,然后以每秒减1计数方式方式工作,直至减到红灯灭为止。例如:假设每个单位时间为3秒,当南北方向从红灯转换成绿灯时,置南北方向数字显示为14,并使数显计数器开始减“1”计数。当减到绿灯灭而黄灯亮时,数显的值应从00跳回到02,黄灯计数,当数显值从2跳到0时,此时黄灯灭。而南北方向的红灯亮;数显的值应从00跳回到17,红灯计数减“1”计数,当减到红灯灭时数显为00。同时,东西方向的绿灯亮,并置东西方向开始计数。
           4.扩展功能,手动设置单位时间。固定R、G、Y的时间间隔为6:5:1,通过开关K可实现单位时间的切换(t=2或3秒)。

    3.方案比较

    交通灯控制电路的系统框图如图所示:
    在这里插入图片描述

    方案一:

    1、利用秒脉冲发生器产生信号,通过74HC190接成4进制计数器实现4分频信号,再通过74HC164接成12进制扭环形计数器以及相应的门电路来组成交通灯信号。
    2、倒计时数码管显示部分用74HC191和显示译码器CD4511以及相应的门电路来设计组成。

    方案二:

    1、脉冲发生器555产生,经过74HC74实现二分频,74LS164设计成12进制扭环型计数器,通过门电路组合出交通灯。
    2、倒计数数码管显示部分用74HC191和显示译码器CD4511以及相应的门电路来设计组成。
    由于使用二分频电路简单设计方便,没有那么多的门电路组成,以及在实际测试中,二分频相比四分频所用的时间更短,更加方便测试,所以使用方案二来进行设计。

    4.单元电路的工作原理

    4.1 单位时间模块

           我们选择2秒为—个单位时间,则要求计数器每计2秒输出—个脉冲。根据我们的方案,秒脉冲用555构成的多谐振荡器实现,并通过74HC74触发器二分频实现2秒的单位时间。
           555定时器为数-模混合集成电路,可构成施密特触发器、单稳态触发器和多谐振荡器。要用555定时器接成多谐振荡器,需先将其构成施密特触发器,然后改造成多谐振荡器。
    在这里插入图片描述
    在这里插入图片描述
    根据要求,令占空比q为66.67%,C取10μf,根据公式
    t1=(R1+R2)Cln2
    t2=R2Cln2
    q=t1/(t1+t2)
    T=t1+t2
    可求得R1=R2=51kΩ
    实际连接图如下:
    在这里插入图片描述

    4.2 二分频信号产生

           通过D触发器,连接D和Q’。采用74LS74(双D触发器)构成扭环形2进制计数器,即可得到输出周期为2s的信号,此信号作为交通灯控制电路的时钟信号。
    在这里插入图片描述
    实际连接图如下:
    在这里插入图片描述

    4.3交通灯控制电路模块

           要求计数器工作循环周期为12,所以可以采用12进制计数器。我们选用74LS164构成扭环形12进制计数器,输出QA,QB,QC,QD,QE,QF,控制6盏灯的亮灭。因此可以列出真值表,数值“1”表示红绿灯亮,数值“0”表示红绿灯灭。计数器输出通过逻辑门电路组合作为交通灯电路的输入,因此可得到南北和东西两个方向的红黄绿灯的控制信号。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    交通灯控制模块电路实际连接如图所示。
    在这里插入图片描述

    4.4 倒计时数码管显示模块

           计时控制电路利用两个数码管来进行显示一个方向的交通灯倒计时设计,选用一个方向的信号灯作为控制信号,如南北方向信号灯。当绿灯亮起那一刻十位和个位的数码管分别置数为0000和1001;当黄灯亮起那一刻十位和个位的数码管分别置数为0000和0001;当红灯亮起那一刻十位和个位的数码管分别置数为0001和0001。
    在这里插入图片描述
    将上图中填充颜色行取出如下:
    在这里插入图片描述
    则有:置数时,D7=D6=D5=0,D4=Q0Q5 ,D2=D1=0, D0=1, D3=Q0’
    令个位的74HC191一直处于减法计数状态,当其从0000减到1111时,其实产生置数信号,由于1111状态置数时只是一个暂态,在实际显示中并不体现,所以可以用个位的74HC191的(Q3Q2)’接到11脚LD’端,4脚S’接低电平。令十位的74HC191一直处于置数状态S’接高电平。

    在这里插入图片描述
    74HC191管脚图具体如上.
    在这里插入图片描述
    CD4511和数码管管脚图具体如上
    倒计时数码管显示模块实际连接电路如下图:
    在这里插入图片描述

    5.拓展部分:手动设置单位时间模块

           要求: 固定R、G、Y的时长比例为6:5:1,可用一个选择开关K选择单位时间长度。当K输入0时,设单位时间t=2秒,则R、G、Y的倒计时初值分别为11、9、1;当K1输入1时,设单位时间t=3秒,则R、G、Y的倒计时初值分别为17、14、2。
    设计具体思路分析:
           A:由一个选择开关K可知,当K取不同值时,电路状态不同,所以需要利用K来组成一个或的式子,如KA+K’B,则当K取1时,电路状态为A,当K取0时,电路状态为B。选择开关选用一条导线来代替,导线接VCC和接GND分别代表两种不同的状态。
           B:由于要可以手动设置单位时间t=2或3s,则首先就应该在单位时间模块进行改动,当K为0时,单位时间为2s,则电路实现二分频,当K为1时,单位时间为3s,则电路实现三分频。式子模型为:K×三分频+K’×二分频。
           C:同样的,在倒计时显示模块,当单位时间为2s时,红黄绿灯分别从11s,1s,9s开始倒计时;当单位时间为3s时,红黄绿灯分别从17s,2s,14s开始倒计时。相应的倒计时置数模块也要做相应的改动。K×三分频置数+K’×二分频置数。

    • 欢迎关注微信公众号【电子物语】,后台回复【交通灯设计】即可获取全文

    在这里插入图片描述

    展开全文
  • 设计就是采用单片机模拟十字路口交通灯的各种状态显示以及倒计时时间。 本设计系统由单片机I/O口扩展系统、交通灯状态显示系统、LED数码显示系统、紧急情况中断系统、复位电路等几大部分组成。系统除基本的交通灯...
  • 51系列单片机AT89C51为中心器件来设计交通灯控制电路,配以七段共阴极数码管显示时间的显示模块,交通灯显示模块,调时模块,晶振电路,复位电路以及控制电路,实现根据实际车流量通过AT89C51芯片的P3口设置红、绿灯...
  • 实验目的 1.基本掌握自顶向下的电子系统设计方法 2.学会使用PLD和硬件描述语言设计数字电路,掌握 Quartus II等开发工具的使用方法 3.培养学生自主学习、正确分析和解决问题的能力 ...(7)要求显示时间,倒计时
  • 摘要:AT89C51单片机的交通灯控制系统是由AT89C51单片机、键盘电路、LED倒计时交通灯显示等模块组成。系统除基本交通灯功能外,还具有通行时间手动设置、可倒计时显示、急车强行通过、交通特殊情况处理等相关功能...
  • 采用EDA技术,应用VHDL硬件电路描述语言实现交通灯系统控制器的设计,利用MAX+PLUSⅡ集成开发环境进行综合、仿真,并下载到CPLD可编程逻辑器件中,完成系统的控制作用。该灯控制逻辑可实现3种颜色灯的交替点亮、时间...
  • 1、 设计一个交通信号灯控制器,由一条主干道和一条支干道汇合成十字路口,在每个入口处设置红、绿、黄三色机动车辆信号,红灯亮禁止通行,绿灯亮允许通行,黄灯亮则给行驶中的车辆有时间停在禁行线外。...
  • 设计一个十字路口交通灯控制系统。 (1)东西(用A表示)、南北(用B表示)方向均有红灯、黄灯、红灯指示,其持续时间分别是20秒、5秒和15秒。正常工作模块整个过程用有限元状态机描述,状态描述如下: A方向绿灯亮...
  • 基于51单片机交通灯程序设计与仿真

    千次阅读 多人点赞 2020-05-10 17:57:15
    采用STC89C51芯片作为中心期间来设计交通灯控制电路,结合七段共阴极数码管显示时间的模块、交通灯显示模块、按键电路、IO口扩展电路等组成,通过程序设计和软件仿真来实现红、黄、绿、蓝燃亮时间以及双位数码管...
    基于51单片机交通灯程序设计与仿真
    摘要

    交通信号灯是城市交通安全、有序、快速运行的重要保障。本文提出一种基于单片机的交通信号灯控制系统的设计方案。该系统模拟现实中十字路口的通行指示,倒计时、紧急车辆通行、强制东西/南北通行、夜间模式灯、转向等功能。并结合交通灯,设计了人行道灯。采用STC89C51芯片作为中心期间来设计交通灯来控制电路,结合七段共阴极数码管显示时间的模块、交通灯显示模块、按键电路、IO口扩展电路等组成,通过程序设计和软件仿真来实现红、黄、绿、蓝燃亮时间以及双位数码管显示倒计时。

    关键字:交通信号灯、人行道灯、STC89C51单片机、紧急通行、转向功能

    51单片机交通灯Proteus仿真

    一、工程介绍

    1.1、实现要求

    1. 控制交通灯实现车辆东西通行后,南北通行功能
    2. 控制转向灯实现交通灯东西通行后左转,南北通行后左转功能
    3. 控制人行道灯实现交通灯东西通行的同时,同时南北人行道开启,同理南北通行亦如此
    4. 可以控制按钮实现东西时间的调整、夜间模式、紧急模式、强制东西/南北模式、查看时间

    二、仿真电路设计

    2.1环境介绍

    2.2、电路设计

    2.2.1、最小系统的实现

    关于51单片机最小系统可以查看我以前博客,2.2.1、最小系统实现参考链接
    src="51%E5%8D%95%E7%89%87%E6%9C%BA%E8%BD%A6%E6%B5%81%E9%87%8F%E4%BA%A4%E9%80%9A%E7%81%AF+%E4%BA%BA%E8%A1%8C%E9%81%93%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E4%B8%8E%E4%BB%BF%E7%9C%9F.assets/%E5%8E%9F%E4%BB%B6%E9%80%89%E6%8B%A9.png" align = "left" style="width:500px;height:300px" />
    从Proteus中选取元件有:74HC595芯片、74HC245芯片、AT89C51单片机、BUTTON开关、BUZZER蜂鸣器、CAP电容、CAP-ELEC电解电容、CRYSTAL晶振、LED-BLUE蓝色LED、LED-GREEN绿色LED、LED-RED红色LED、LED-YELLOW黄色LED、PNP三极管、RES电阻、RESPACK-8排阻、TRAFFICLIGHTS交通灯、7SEG-MPX2-CC两位八段共阴极数码管

    最小系统如下:

    2.2.2、数码管的使用

    数码管按段数可分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、3位、4位、5位、6位、7位等数码管。按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。

    一位数码管内部原图如图所示:

    在实际电路中数码管是要加驱动芯片的,因为单靠51单片机管脚输出电流是不够的,这里通过添加74HC245驱动芯片驱动各个数码管,用51单片机P0口传送数据给数码管,一定要加上拉电阻,并通过八同相三态总线收发器74HC245直接连接数码管的八个LED。

    74HC245芯片内部结构如下:

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    由于单片机或CPU的数据地址控制总线端口都有一定的负载能力,如果负载超过其负载能力,一般应加驱动器。主要应用于大屏显示,以及其它的消费类电子产品中增加驱动。

    仿真电路图如下:

    在这里插入图片描述
    在这里插入图片描述

    2.2.3、交通灯、人行灯及转向灯

    通过Proteus绘制路线以及人行道,可以画出如下电路图:

    2.2.4、74HC595芯片的使用

    74HC595是串口转并口芯片,可输出三种状态:高电平、低电平和高组态。一片74HC595芯片可实现3根口线扩展为8根口线.也可采用多片74HC595进行级联的方式扩展输出口线。控制可以采取如下控制:

    仿真电路图如下:

    2.2.6、蜂鸣器电路的设计

    当IO输出低电平时,三极管导通,蜂鸣器发出声音。

    2.2.7、按键电路的设计

    2.3、总体仿真电路图

    三、程序设计

    3.1、环境介绍

    3.2、定时器的使用

    89C51单片机内部有两个16位的定时/计数器,即定时器T0和定时器T1,这次仿真是要控制数码管每隔1S变化一次,所以应把两个定时器配置50MS的中断,响应10次即完成0.5S,响应20次完成1S。由于51单片机1个机器周期=12个时钟周期,系统时钟频率为12MHZ,则一个机器周期为1US,$ Sysclk = \frac{12MHZ}{12}=1MHZ$。下面是涉及定时器的相关寄存器:

    工作模式寄存器TMOD是用于控制定时器0/1的工作模式,通过对TMOD进行赋值,则可以改变定时器的工作模式具体各位的定义如下:

    定时器T0/T1有四种工作模式:模式0(13位定时器/计数器),模式1(16位定时器/计数器模式),模式2(8位自动重重装载模式),模式3(两个8位定时器/计数器)。T1除模式3外,其他工作模式与定时器/计数器0相同,T1载模式3无效,停止计数。

    定时器的控制寄存器TCON为定时器/计数器T0、T1的控制寄存器,同时也锁存T0、T1溢出中断源和外部请求中断源等,格式如下:

    配置T0和T1定时器程序如下:

    void TIMER_init(void)     // 定时器初始化配置
    {
    	TMOD=0X11;            // 设置T0和T1为模式1(16位定时器)
    	TH1=0X3C;		     // 定时器1置初值 0.05S
    	TL1=0XB0;
    	TH0=0X3C;		     // 定时器0置初值 0.05S
    	TL0=0XB0;
    	EA=1;				 // 开总中断
    	ET0=1;				 // 定时器0中断开启
    	ET1=1;				 // 定时器1中断开启
    	TR0=1;				 // 启动定时0
    	TR1=0;				 // 关闭定时1
    }
    

    定时器T0实现交通灯和转向灯程序流程:

    T0开始计时
    当东西/南北倒计时到0重置5秒
    开启黄灯闪烁和蜂鸣器
    黄灯闪烁完开启转向灯10秒
    当东西/南北转向灯倒计时为5S开启闪烁

    黄灯和转向灯闪烁程序如下:

    void Yellow_Flicker(void)
    {
    	if (countt0 == 10)						                    // 加到10也就是半秒
    	{
    		if ((sec_nb <= 5) && (dx_nb == 0) && (shanruo == 1))  	// 东西黄灯闪		
    		{
    			Green_dx = 0;
    			Yellow_dx = 0;
    			if (DX_LL == 1)
    				SendTo595(0XF7);
    			Buzz = 0;						                        // 蜂鸣器关
    		}
    		if ((sec_dx <= 5) && (dx_nb == 1) && (shanruo == 1)) // 南北黄灯闪		
    		{
    			Green_nb = 0;
    			Yellow_nb = 0;
    			if (NB_LL == 1)
    				SendTo595(0XFB);
    			Buzz = 0;					                          // 蜂鸣器关
    		}
    	}
    	if (countt0 == 20)	      // 定时器中断次数=20时(即1秒时)
    	{
    		if ((sec_nb <= 5) && (dx_nb == 0) && (shanruo == 1))  	// 打开交通灯		
    		{
    			Green_dx = 0;
    			Buzz = 1;						                        // 蜂鸣器关
    			if (DX_LL == 1)
    				SendTo595(DX_L);
    			else
    				Yellow_dx = 1;
    		}
    		if ((sec_dx <= 5) && (dx_nb == 1) && (shanruo == 1))  // 南北黄灯闪		
    		{
    			Green_nb = 0;
    			Buzz = 1;						                       // 蜂鸣器关
    			if (NB_LL == 1)
    				SendTo595(NB_L);
    			else
    				Yellow_nb = 1;
    		}
    	}
    }
    

    定时器0中断程序如下:

    void time0(void) interrupt 1 using 1  	 // 定时中断子程序
    {
    	TH0=0X3C;							                 // 重赋初值
    	TL0=0XB0;							                 // 12m晶振50ms//重赋初值
    	TR0=1;								                 // 重新启动定时器
    	countt0++;							               // 软件计数加1
    	Yellow_Flicker();
    		
    	if(countt0==20)	      // 定时器中断次数=20时(即1秒时)
    	{	countt0=0;					// 清零计数器
    		sec_dx--;						// 东西时间减1
    		sec_nb--;						// 南北时间减1
    				
    		if(sec_dx==0&&sec_nb==5) 		//当东西倒计时到0时,重置5秒,用于黄灯闪烁时间   
    		{
    			sec_dx=5;
    			shanruo=1;
    		}
    		if(sec_nb==0&&sec_dx==5)		//当南北倒计时到0时,重置5秒,用于黄灯闪烁时间   
    		{
    			sec_nb=5;
    			shanruo=1;
    		}
    		if(dx_nb==0&&sec_nb==0&&DX_LL==0)			//当东西通行时间完毕,开始东西左转
    		{
    			sec_nb = 10;
    			sec_dx = 10;
    			SendTo595(DX_L);		
    			DX_LL=1;
    			Yellow_dx = 0;
    		}
    		if(dx_nb==0&&sec_nb==0&&DX_LL==1)			//当黄灯闪烁时间倒计时到0时,
    		{
     	    	Buzz=1;						//蜂鸣器开
    			P2 &=0x81;					//重置东西南背方向的红绿灯
    			Green_nb=1;
    			Red_dx=1;
    			dx_nb=!dx_nb;
    			shanruo=0;
    			if(num_che_nb>set_timenb/2)//如果此时南北通行的车辆数大于预设通行量
    				set_timenb=set_timenb+5;	
    			if(num_che_nb==0)//如果南北方向无车辆通行,每次递减5秒
    				set_timenb=set_timenb-5;
    			if(set_timenb<=15)
    				set_timenb=15;
    			sec_nb=set_timenb;			//重赋南北方向的起始值
    			sec_dx=set_timenb+5;		//重赋东西方向的起始值
    			num_che_nb=0;//清零
    		  SendTo595(NB_R);	
          DX_LL=0;	
    		}	
    		if(dx_nb==1&&sec_dx==0&&NB_LL==0)			//当南北通行时间完毕,开始南北左转
    		{
    			sec_nb = 10;
    			sec_dx = 10;
    			SendTo595(NB_L);		
    			NB_LL=1;
    			Yellow_nb = 0;	
    		}
    		if(dx_nb==1&&sec_dx==0&&NB_LL==1)			//当黄灯闪烁时间到
    		{
    			P2&=0X81;						//重置东西南北的红绿灯状态
    			Green_dx=1;					 //东西绿灯亮
    			Red_nb=1;					 //南北红灯亮
    			dx_nb=!dx_nb;				 //取反
    			shanruo=0;					//闪烁
    			if(num_che_dx>set_timedx/2)//如果此时南北通行的车辆数大于预设通行量
    				set_timedx=set_timedx+5;	
    			if(num_che_dx==0)//如果东西方向无车辆通行,每次递减5秒
    				set_timedx=set_timedx-5;
    			if(set_timedx<=15)
    				set_timedx=15;
    			sec_dx=set_timedx;			//重赋东西方向的起始值
    			sec_nb=set_timedx+5;		//重赋南北方向的起始值
    			num_che_dx=0;//清零
    			SendTo595(DX_R);		
    			NB_LL=0;
    		}
    
    	}	
    }
    

    3.3、外部中断的使用

    程序使用两个外部中断实现东西/南北强制转换,分别使用了外部中断0和外部中断1,且中断结构如下。

    通过结构图可以看出使用外部中断步骤如下:

    1. 设置电平触发方式
    2. 开启EX0/1
    3. 开启总中断

    初始化外部中断程序如下:

    	IT0 = 1;//设置为下降沿触发
    	EX0 = 1;//使能外部中断
    	IT1 = 1;
    	EX1 = 1;
    

    两个外部中断具体使用的功能:

    //外部中断0
    void int0(void) interrupt 0 using 1	   //只允许东西通行
    {
    	TR0=0;								//关定时器0
    	TR1=0;								//关定时器1
    	P2=0x00;							//灭显示
    	Green_dx=1;							//东西方向置绿灯
    	Red_nb=1;							//南北方向为红灯
    	sec_dx=00;							//四个方向的时间都为00
    	sec_nb=00;	
    	SendTo595(null);	
    }
    //外部中断1
    void int1(void) interrupt 2 using 1	  	 //只允许南北通行 
    {
    	TR0=0;								//关定时器0
    	TR1=0;							   //关定时器1
    	P2=0x00;							//灭显示
    	Green_nb=1;							//置南北方向为绿灯
    	Red_dx=1;							//东西方向为红灯
    	sec_nb=00;							//四个方向的时间都为00
    	sec_dx=00;
    	SendTo595(null);	
    }
    

    3.4、控制595芯片

    我们都知道通信从大的方面有两种:串行和并行。串行的最大优点是占用总线少,但是传输速率低;并行恰恰相反,占用总线多,传输速率高。市面上有很多这样的芯片,有串入并出的(通俗讲就是 一个一个进,最后一块出来),有并入串出的(相对前者而言)。具体用哪种类型要根据我们得实际情况。比如利用单片机显示数码管单纯的显示一个数码管如果仅仅是为了显示 那么动用单片机一个端口(如P0或P1/P2/P3)那没有什么,当然这里我说的数码管是8段的(如果利用BCD类型 16进制数码管那么只需四个即可)就拿51类型的单片机来说,总共32个I/O口,一般如果不是做太大的工程是完全够用的,但有些时候你会恨单片机怎么不多长几条“腿”,怎么省还是不够用。这个时候就需要用到并转串或者串转并芯片来进行IO口的扩展,74HC595就是一种串行转并行的芯片。参考链接

    程序如下:

    #define NB_L 0XFE
    #define DX_L 0XFD
    #define NB_G 0XF7
    #define NB_R 0XF7
    #define DX_G 5
    #define DX_R 0XFB
    #define null 0XF3
    sbit DS = P2^0;
    sbit SH_CP = P2^7;
    sbit ST_CP = P1^4;
    void SendTo595(uchar Data)//发送一个字节数据给595再并行输出
    {
       char i=0;
    	ST_CP = 0;
       for(i;i<8;i++)
       {
          SH_CP = 0;  
          DS=0x80&Data;//&为按位运算符,即全1为1,有0为0,上式也就是 (1000 0000)&(1111 1111)=1000 0000,若高位为1则是1高位为0则这个式子为0 
          Data=_crol_(Data,1); //左移一位 将高位补给低位,如果二进制数为01010101 那么_crol_(1) 为10101010
          SH_CP = 1;           //上升沿让串行输入时钟变成高电平 并延时一个时钟周期
          _nop_(); 
       }    
                                /*位移寄存器完毕,转移到存储寄存器*/
       ST_CP = 1;               //上升沿,存储寄存器变为高电平 延迟两个时钟周期
       _nop_();
       _nop_();
     }
    

    3.5、数码管程序设计

    uchar code table[11]={	//共阴极字型码
    	0x3f,  //--0
    	0x06,  //--1
    	0x5b,  //--2
    	0x4f,  //--3
    	0x66,  //--4
    	0x6d,  //--5
    	0x7d,  //--6
    	0x07,  //--7
    	0x7f,  //--8
    	0x6f,  //--9
    	0x00   //--NULL
    };
    void display(void) //显示子程序
    {	
    
    	if(xianshi_fx==0)//正常显示
    	{
    	buf[1]=sec_nb/10; 		//第1位 东西显示秒十位
    	buf[2]=sec_nb%10; 		//第2位 东西显示秒个位
    	buf[3]=sec_dx/10; 		//第3位 南北显示秒十位
    	buf[0]=sec_dx%10; 		//第4位 南北显示秒个位	
    	}
    	if(xianshi_fx==1)//查看通行时间
    	{
    	buf[1]=set_timenb/10; 		//第1位 东西通行秒十位
    	buf[2]=set_timenb%10; 		//第2位 东西通行秒个位
    	buf[3]=set_timedx/10; 		//第3位 南北通行秒十位
    	buf[0]=set_timedx%10; 		//第4位 南北通行秒个位	
    	}
    
    	if(xianshi_fx==2)//查看红外计数值
    	{
    	buf[1]=num_che_nb/10; 		//第1位 东西红外计数值十位
    	buf[2]=num_che_nb%10; 		//第2位 东西红外计数值个位
    	buf[3]=num_che_dx/10; 		//第3位 南北红外计数值十位
    	buf[0]=num_che_dx%10; 		//第4位 南北红外计数值个位	
    	}
    	s1 = 1;s2 = 1;s3 = 1;s4 = 1;
    	P0=0x00;				 灭显示
    	s1 = 0;s2 = 1;s3 = 1;s4 = 1;
    	P0=table[buf[1]];		//送东西时间十位的数码管编码			
    	delay(1);				//延时
    	s1 = 1;s2 = 1;s3 = 1;s4 = 1;
    	P0=0x00;				//灭显示						   
    	s1 = 1;s2 = 0;s3 = 1;s4 = 1;
    	P0=table[buf[2]];		 //送东西时间个位的数码管编码
    	delay(1);				 //延时
    	s1 = 1;s2 = 1;s3 = 1;s4 = 1;
    	P0=0x00;				//关显示
    	s1 = 1;s2 = 1;s3 = 0;s4 = 1;
    	P0=table[buf[3]];		//送南北时间十位的数码管编码
    	delay(1);				//延时
    	s1 = 1;s2 = 1;s3 = 1;s4 = 1;	
    	P0=0x00;				 //关显示
    	s1 = 1;s2 = 1;s3 = 1;s4 = 0;	
    	P0=table[buf[0]];		//送南北时间个位的数码管编码
    	delay(1);				//延时
    }
    

    五、结果分析与改进

    1. 问题:仿真结果表明,当增加时间或者减小时间那么东西和南北的倒计时会同时增加
    2. 解决:通过设置独立按键把东西/南北倒计时时间分开即可解决

    参考资料:

    1. 51单片机 74hc595使用用法(利用proteus仿真)
    2. 74HC245 内部结构及作用
    展开全文
  • 主要内容有交通灯模拟系统设计方案,主要功能,各功能模块的介绍,电路设计,硬件部分设计,软件部分设计,模拟系统的仿真调试,设计方法以及课程设计的心得体会等等。 该设计中用光二极管来模拟信号灯,紧急车的...
  • 基本要求:利用STC-89C51单片机作为系统核心控制部分,用外围12个发光二极管(红、绿、蓝各4组)模拟交通灯的显示部分,自己设计电路和程序完成交通灯控制设计。 发挥部分: 1.扩展外部并口芯片(如8255A)对12个...
  • 设计一个十字路口的交通灯控制电路,要求东西方向车道和南北方向车道两条交叉道路上的车辆交替运行,每次通行时间都设为45秒。时间可设置修改。在绿灯转为红灯时,要求黄灯先亮5秒钟,才能变换运行车道;东西方向、...
  • 单片机课设并行扩展芯片82c55控制交通灯 ... 用Proteus模拟实现十字路口交通灯控制电路  用Keil与Proteus联调 **Protues电路原理图 **总电路图 电路图拆分 附代码 #include "reg51.h" #inclu

    单片机课设并行扩展芯片82c55控制交通灯

    设计要求:
    1、 了解一个十字路口交通灯基本工作原理,要求分主次干道,并加入倒计时功能;
    2、 单片机扩展82c55芯片作输出口,控制12个发光二极管亮灭,模拟交通灯管理;
    3、 倒计时显示由LED数码管显示;
     用Keil C51编程实现上述功能
     用Proteus模拟实现十字路口交通灯控制电路
     用Keil与Proteus联调

    **Protues电路原理图
    **总电路图
    在这里插入图片描述
    电路图拆分
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    附代码

    #include "reg51.h"
    #include "intrins.h"
    unsigned char code seg[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  //common-cathode seg
    char second = 0;
    unsigned char count = 0;
    
    sbit RD_ = P2^3;	//8255A拓展芯片的控制端口
    sbit WR_ = P2^4;
    sbit A0 = P2^5;
    sbit A1 = P2^6;
    sbit RST = P2^7;
    sbit SRCLK = P1^5;	//595控制端口
    sbit DIN = P1^6;
    sbit RCLK = P1^7;
    
    void delay(int x)  //毫秒延时
    {
    	unsigned int i,j;
    	for(i=x;i>0;i--)
    		for(j=120;j>0;j--);
    }
    
    void T0_init(void)	//T0初始化
    {
        TMOD = 0x01;
        TH0 = 0x3C;
        TL0 = 0x0B0;
        EA = 1;
        ET0 = 1;
        TR0 = 0;
    }
    
    void sent_byte(unsigned char wei,unsigned char duan)  //使用595发送2比特数据,先送位选,再送段选
    {
    	int j;
    	for(j=0;j<8;j++)
    	{
    		SRCLK = 0;
    		DIN = wei>>7;
    		wei <<= 1;
    		SRCLK = 1;
    		_nop_();
    		_nop_();	
    	}
    	for(j=0;j<8;j++)
    	{
    		SRCLK = 0;
    		DIN = duan>>7;
    		duan <<= 1;
    		SRCLK = 1;
    		_nop_();
    		_nop_();
    	}
    	RCLK = 0;
    	_nop_();
    	_nop_();
    	RCLK = 1;
    }
    
    void write_command(char dat)   //给8255写控制字
    {
    	RST = 1;
    	_nop_();
    	RST = 0;
    	WR_ = 1;
    	A0 = 1;
    	A1 = 1;
    	RD_ = 1;
    	P0 = dat;
    	WR_ = 0;
    }
    
    void write_A(char dat)		//将总线数据锁存到PA口
    {
    	WR_ = 1;
    	A1 = 0;
    	A0 = 0;
    	RD_ = 1;
    	P0 = dat;
    	WR_ = 0;
    }
    
    void write_B(char dat)	   //将总线数据所存到PB口
    {
    	WR_ = 1;
    	A1 = 0;
    	A0 = 1;
    	RD_ = 1;
    	P0 = dat;
    	WR_ = 0;
    }
    
    void display(void)	   //四个路口的时间显示
    {
    
    	char ge,shi;
    	ge = second%10;shi = second/10;
    	sent_byte(0xfb,seg[shi]);	//上
    	delay(3);
    	sent_byte(0xff,0x00);
    
    	sent_byte(0xf7,seg[ge]);
    	delay(3);
    	sent_byte(0xff,0x00);
    
    	sent_byte(0xfe,seg[shi]);	 //左
    	delay(3);
    	sent_byte(0xff,0x00);
    
    	sent_byte(0xfd,seg[ge]);
    	delay(3);
    	sent_byte(0xff,0x00);
    
    	sent_byte(0xef,seg[shi]);	 //下
    	delay(3);
    	sent_byte(0xff,0x00);
    
    	sent_byte(0xdf,seg[ge]);
    	delay(3);
    	sent_byte(0xff,0x00);
    
    	sent_byte(0xbf,seg[shi]);	//右
    	delay(3);
    	sent_byte(0xff,0x00);
    
    	sent_byte(0x7f,seg[ge]);
    	delay(3);
    	sent_byte(0xff,0x00);
    }
    
    void access(char s)  //0为次干道通行,1为主干道通行
    {
    	switch(s)
    	{
    		case(0):write_A(0xcf);write_B(0xfc);break;
    		case(1):write_A(0xf3);write_B(0xf3);break;
    	}	
    }
    
    void wait(char s) //0为次干道等待,1为主干道等待
    {
    	char i,j;
    	switch(s)
    	{
    		case(1):for(i=0;i<5;i++){write_A(0x33);write_B(0xf3);for(j=0;j<10;j++){display();}write_A(0xf3);write_B(0xf3);for(j=0;j<10;j++){display();}}break;
    		case(0):for(i=0;i<5;i++){write_A(0xcc);write_B(0xfc);for(j=0;j<10;j++){display();}write_A(0xcf);write_B(0xfc);for(j=0;j<10;j++){display();}}break;
    	}
    }
    
    void mainroad(void)	 //主干道函数
    {
    	bit flag = 0;
    	second = 20;
    	count = 0;
    	access(1);
    	TR0 = 1;
    	while(1)
    	{
    		display();
    		if(second <= 3&&flag == 0)
    		{	
    			wait(1);
    			flag = 1;	
    		}
    		if((second+1) == 0)
    		{
    			count = 0;
    			TR0 = 0;
    			return;	
    		}
    	}		
    }
    
    void secondaryroad(void)  //次干道处理函数
    {
    	bit flag = 0;
    	second = 15;
    	count = 0;
    	access(0);
    	TR0 = 1;
    	while(second+1 >= 0)
    	{
    		display();
    		if(second <= 3&&flag == 0)
    		{
    			wait(0);
    			flag = 1;
    		}
    		if((second+1) == 0)
    		{
    			count = 0;
    			TR0 = 0;
    			return;	
    		}
    	}
    
    }
    
    void main(void)
    {	
    	T0_init();
    	write_command(0x80);
    	while(1)
    	{
    		mainroad();	
    		secondaryroad();
    	}
    }
    
    void Timer0Interrupt(void) interrupt 1
    {
        TH0 = 0x3C;
        TL0 = 0x0B0;
    	count++;
        if(count>=20)
    	{
    		second--;
    		count = 0;
    	}
    	
    }
    
    展开全文
  • 利用单片机设计一个交通灯控制电路,用LED发光二极管模拟交通信号灯,用AT89C51完成对信号灯的控制,并由LED数码管显示倒计时。 基本要求: 1.利用单片机完成交通灯控制电路设计,利用定时器中断方式完成南北方向...
  • 2)显示部分:南北向和东西向各采用2个LED数码管计时,对该方向的指示的点亮时间进行倒计时,最长计时范围为99秒。 3)键盘部分:设置键、增加键、减少键。 本系统的工作流程: 1)系统启动后,系统按程序给定...
  • 设计一个十字路口的交通灯控制电路,要求甲车道和乙车道两条交叉道路上的车辆交替运行,主道每次通行30秒,干道每次通行时间为25秒,并以数码倒计时的方式对时间进行显示; 2.要求黄灯先亮5秒,才能变换运行车道; ...
  • 本文用Verilog HDL设计了一个交通灯控制系统,主干道交通灯按绿-黄-红变化,支干道交通灯按红-绿-黄变化。设计采用了自顶向下的设计方法,首先根据功能将电路分为div(包括div1和div2)、counter、controller、...

空空如也

空空如也

1 2 3
收藏数 41
精华内容 16
关键字:

交通灯倒计时控制电路设计