交通灯_交通灯控制 - CSDN
精华内容
参与话题
  • 基于51单片机的交通灯控制系统设计

    万次阅读 多人点赞 2020-03-06 13:30:46
    交通灯是生活中的重要系统。本设计为基于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

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

    展开全文
  • 交通灯设计

    千次阅读 2019-01-01 22:40:05
    (1) 交通灯从绿变红时,有5秒黄灯亮的间隔时间; (2) 交通灯红变绿是直接进行的,没有间隔时间; (3) 南北主干道上的绿灯时间为45秒,东西支干道的绿灯时间为25秒; (4) 在任意时间,显示每个状态到该状态...

    数电实验

    1. 问题描述(功能要求):
      T型路口交通信号灯的工作过程,利用实验板上的 红、黄、绿LED作为交通信号灯,设计一个交通信号灯控制器。要求:
      (1) 交通灯从绿变红时,有5秒黄灯亮的间隔时间;
      (2) 交通灯红变绿是直接进行的,没有间隔时间;
      (3) 南北主干道上的绿灯时间为45秒,东西支干道的绿灯时间为25秒;
      (4) 在任意时间,显示每个状态到该状态结束所需的时间。

    2. 运行环境要求:
      硬件环境:DDA-IIIA学习板
      软件环境:Quartus II

    T型路口的交通信号灯,信号灯由黄红绿三色组成,南到北 运行时,绿灯亮45秒钟,45秒后,黄灯亮5秒,东方向到北方向为红灯,且南北道和北南道的左转和右转灯不亮.5秒后,南北道和北南道的红灯亮,东西道的绿灯亮,且南北道和北南道的左转和右转灯都亮,25秒后,东西道的亮黄灯,且南北道和北南道的左转和右转灯的灯亮,5秒钟后, 东西道的亮红灯,且南北道和北南道的左转和右转灯的灯不亮,所有的出现的时间显示在数码管上面,即每个灯亮的时显示相应的秒数并计时.

    **设定实体**
    定义
    Clk:时钟信号
    resert--复位信号;
    clk1 --显示时钟
    right1 --南到北右转进入支通道 
    red1--南到北红灯
    yellow1--南到北黄灯
    green1--南到北绿灯     
    red2 --东到西红灯
    yellow2 –东到西黄灯
    green2--东到西绿灯
    red3 –北到南红灯
    yellow3—北到南黄灯
    green3 – 北到南绿灯
    left3--北到南左转
    sel :out std_logic_vector(6 downto 0 );数码管段选显示
    times:out std_logic_vector(7 downto 0);数码管位选选择
    


    signal times1: integer range 0 to 9; --从北到南直行灯的十位时间
    signal times2: integer range 0 to 9;–从北到南直行的灯个位时间
    signal times3: integer range 0 to 9;–从南到北直行的灯的十位时间
    signal times4: integer range 0 to 9;–从南到北直行的灯的个位时间
    signal times5: integer range 0 to 9; --从东右转,从南到北右转,从北到南左转的十位时间
    signal times6: integer range 0 to 9; --从东右转,从南到北右转,从北到南左转的个位时间

    pin脚分配
    输入/输出 变量 名称 Pin 按键位置
    输入 CLK 初始时钟 PIN_91 CLK4
    CLK2 显示时钟 PIN_89 CLK2
    reset 紧急信号 PIN_60 A0
    输出 Sel[6] 时间显示 PIN_133 数码管 A
    Sel[5] PIN_134 B
    Sel[4] PIN_135 C
    Sel[3] PIN_136 D
    Sel[2] PIN_137 E
    Sel[1] PIN_139 F
    Sel[0] PIN_141 G
    times[7] 数码管显示地址选择 PIN_132 SEL7
    times[6] PIN_129 SEL6
    times[5] PIN_126 SEL5
    times[4] PIN_125 SEL4
    times[3] PIN_122 SEL3
    times[2] PIN_121 SEL2
    times[1] PIN_120 SEL1
    times[0] PIN_119 SEL0
    green1 南到北绿灯 PIN_115
    Green2 东到西道的红灯 Pin_100
    Green3 北到南的绿灯 PIN_86
    Red1 南到北的红灯 Pin_114
    Red2 东到西的红灯 Pin_99
    Red3 北到南的绿灯 Pin_81
    yellow1 南到北黄灯 Pin_113
    Yellow2 东到西黄灯 Pin_97
    Yellow3 北到南黄灯 Pin_80
    left3 北到南左转 Pin_97
    right1 南到北向东右转 Pin_112

    	程序清单
    
    1. library ieee; use ieee.std_logic_1164.all; use
      ieee.std_logic_unsigned.all; entity traffic_light is port(clk:in
      std_logic;–时钟信号输入端,预设周期1秒 resert:in std_logic;–复位信号; clk1:in
      std_logic; --显示时钟
      right1, red1,yellow1,green1:out std_logic;–南->北右转、红、黄、绿5灯控制信号输出端
      red2,yellow2,green2:out std_logic;–东>西 右转、红、黄、绿5灯控制信号输出端 red3,yellow3,green3,left3:out std_logic;–北到南红绿黄,左转
      –次干道左转、右转、红、黄、绿5灯控制信号输出端 sel :out std_logic_vector(6 downto 0 ); times:out std_logic_vector(7 downto 0)); end traffic_light;
      architecture bhv of traffic_light is signal full : std_logic; signal
      times1: integer range 0 to 9; signal times2: integer range 0 to
      9;–从北到南直行以及从北左转的灯的时间 signal times3: integer range 0 to 9; signal
      times4: integer range 0 to 9;–从南到北直行的灯的时间 signal times5: integer
      range 0 to 9; signal times6: integer range 0 to 9;–从东左转的灯的时间
      signal num : std_logic_vector(2 downto 0); begin p1:process(clk)
      variable cont1 : integer range 100 downto 0; begin
      if(clk’event and clk=‘1’ and resert = ‘0’)then
      if(cont1=99)then
      cont1:=0;full<=‘1’;
      else cont1:=cont1+1;full<=‘0’;
      end if; end if; end process p1; p3:process(full) variable time : integer range 0 to 100; begin if(resert = ‘1’)then
      –如果暂停为1,全部为红灯,数码管上的数字暂停 right1<=‘0’;red1<=‘1’;yellow1<=‘0’;green1<=‘0’;
      red2<=‘1’;yellow2<=‘0’;green2<=‘0’;
      left3<=‘0’;red3<=‘1’;yellow3<=‘0’;green3<=‘0’; else if(full’event and full='1’and resert = ‘0’)then --按频率时间递减
      if(time=0)then
      time:=80;
      else
      –当各位为零时十位减一,否则各位自减一
      time:=time-1;
      if(times2 = 0)then
      times1 <= times1-1;
      times2 <= 9;
      else
      times2 <= times2-1;
      end if;
      if(times4 = 0)then
      times3 <= times3-1;
      times4 <= 9;
      else
      times4 <= times4-1;
      end if;
      if(times6 = 0)then
      times5 <= times5-1;
      times6 <= 9;
      else
      times6 <= times6-1;
      end if;
      end if; if time<80 and time >34 then right1<=‘0’;red1<=‘0’;yellow1<=‘0’;green1<=‘1’;
      red2<=‘1’;yellow2<=‘0’;green2<=‘0’;
      left3<=‘0’;red3<=‘0’;yellow3<=‘0’;green3<=‘1’;–两条主干道绿灯45秒,次方向红灯,转弯灯不亮,
      各个时间改变 if time= 79 then
      times1 <= 4;
      times2 <= 5;
      times3 <= 4;
      times4 <= 5;
      times5 <= 5;
      times6 <= 0; end if;
      end if; if time>29 and time<35 then –-两条主干道变黄灯,次干道还是黄灯,转弯灯不亮, 各个时间改变 right1<=‘0’;red1<=‘0’;yellow1<=‘1’;green1<=‘0’;
      red2<=‘1’;yellow2<=‘0’;green2<=‘0’;
      left3<=‘0’;red3<=‘0’;yellow3<=‘1’;green3<=‘0’; if(time=34)then
      times1 <= 0; times2 <= 5; times3 <= 0; times4 <= 5;
      end if; end if; if time>4 and time< 30 then
      –-两条主干道变红灯,次干道为绿灯,转弯灯亮,各个时间改变
      right1<=‘1’;red1<=‘0’;yellow1<=‘0’;green1<=‘0’;
      red2<=‘0’;yellow2<=‘0’;green2<=‘1’;
      left3<=‘1’;red3<=‘0’;yellow3<=‘0’;green3<=‘0’;
      if(time=29)then times1 <= 3; times2 <= 0; times3 <= 3; times4 <= 0; times5 <= 2; times6 <= 5; end if;
      end if; if time<5 then –-两条主干道变红灯,次干道为黄灯,转弯灯亮 各个时间改变 right1<=‘1’;red1<=‘0’;yellow1<=‘0’;green1<=‘0’;
      red2<=‘0’;yellow2<=‘1’;green2<=‘0’;
      left3<=‘1’;red3<=‘0’;yellow3<=‘0’;green3<=‘0’;–次干道黄4秒1 times5<=0; times6<= 5; end if; end if; end if; end
      process;–结束进程

      TIMEOUT: process(clk1,times6,times5,times4,times3,times2,times1) --显示模块
      variable smg7:std_logic_vector(6 downto 0);
      VARIABLE num:integer range 0 to 5;–设定变量num,通过num的自加1用于后面的位选选择
      begin
      if(clk1’event and clk1=‘1’)then
      –case语句来选择段和位选,当num = 0,1,2,3,4,5时,选择不同的语句进行,
      case num is when 0=>
      case times6 is

      				WHEN 0 => smg7:="1111110"; --显示数字0
      				WHEN 1 => smg7:="0110000"; --显示数字1
      				WHEN 2 => smg7:="1101101"; --显示数字2
      				WHEN 3 => smg7:="1111001"; --显示数字3
      				WHEN 4 => smg7:="0110011"; --显示数字4
      				WHEN 5 => smg7:="1011011"; --显示数字5
      				WHEN 6 => smg7:="1011111"; --显示数字6
      				WHEN 7 => smg7:="1110000"; --显示数字7
      				WHEN 8 => smg7:="1111111"; --显示数字8
      				WHEN 9 => smg7:="1111011"; --显示数字9
      	      end case;
      	      times<="11111110";--位选
      	      sel<=smg7;--将获得的数字给sel段选信号
      	     when 1=>
      				case times5 is
      			
      				WHEN 0 => smg7:="1111110"; --显示数字0
      				WHEN 1 => smg7:="0110000"; --显示数字1
      				WHEN 2 => smg7:="1101101"; --显示数字2
      				WHEN 3 => smg7:="1111001"; --显示数字3
      				WHEN 4 => smg7:="0110011"; --显示数字4
      				WHEN 5 => smg7:="1011011"; --显示数字5
      				WHEN 6 => smg7:="1011111"; --显示数字6
      				WHEN 7 => smg7:="1110000"; --显示数字7
      				WHEN 8 => smg7:="1111111"; --显示数字8
      				WHEN 9 => smg7:="1111011"; --显示数字9
      				end case;
      				times<="11111101";--位选
      	      sel<=smg7; --将获得的数字给sel段选信号
      	     when 2=>
      				case times4 is
      			
      				WHEN 0 => smg7:="1111110"; --显示数字0
      				WHEN 1 => smg7:="0110000"; --显示数字1
      				WHEN 2 => smg7:="1101101"; --显示数字2
      				WHEN 3 => smg7:="1111001"; --显示数字3
      				WHEN 4 => smg7:="0110011"; --显示数字4
      				WHEN 5 => smg7:="1011011"; --显示数字5
      				WHEN 6 => smg7:="1011111"; --显示数字6
      				WHEN 7 => smg7:="1110000"; --显示数字7
      				WHEN 8 => smg7:="1111111"; --显示数字8
      				WHEN 9 => smg7:="1111011"; --显示数字9
      				end case;
      				times<="11111011";--位选
      	      sel<=smg7; --将获得的数字给sel段选信号
      	      when 3=>
      				case times3 is
      			
      				WHEN 0 => smg7:="1111110"; --显示数字0
      				WHEN 1 => smg7:="0110000"; --显示数字1
      				WHEN 2 => smg7:="1101101"; --显示数字2
      				WHEN 3 => smg7:="1111001"; --显示数字3
      				WHEN 4 => smg7:="0110011"; --显示数字4
      				WHEN 5 => smg7:="1011011"; --显示数字5
      				WHEN 6 => smg7:="1011111"; --显示数字6
      				WHEN 7 => smg7:="1110000"; --显示数字7
      				WHEN 8 => smg7:="1111111"; --显示数字8
      				WHEN 9 => smg7:="1111011"; --显示数字9
      				end case;
      				times<="11110111";--位选
      	      sel<=smg7; --将获得的数字给sel段选信号
      	      when 4=>
      				case times2 is
      			
      				WHEN 0 => smg7:="1111110"; --显示数字0
      				WHEN 1 => smg7:="0110000"; --显示数字1
      				WHEN 2 => smg7:="1101101"; --显示数字2
      				WHEN 3 => smg7:="1111001"; --显示数字3
      				WHEN 4 => smg7:="0110011"; --显示数字4
      				WHEN 5 => smg7:="1011011"; --显示数字5
      				WHEN 6 => smg7:="1011111"; --显示数字6
      				WHEN 7 => smg7:="1110000"; --显示数字7
      				WHEN 8 => smg7:="1111111"; --显示数字8
      				WHEN 9 => smg7:="1111011"; --显示数字9
      				end case;
      				times<="11101111";--位选
      	      sel<=smg7; --将获得的数字给sel段选信号
      	      when 5=>
      				case times1 is
      			
      				WHEN 0 => smg7:="1111110"; --显示数字0
      				WHEN 1 => smg7:="0110000"; --显示数字1
      				WHEN 2 => smg7:="1101101"; --显示数字2
      				WHEN 3 => smg7:="1111001"; --显示数字3
      				WHEN 4 => smg7:="0110011"; --显示数字4
      				WHEN 5 => smg7:="1011011"; --显示数字5
      				WHEN 6 => smg7:="1011111"; --显示数字6
      				WHEN 7 => smg7:="1110000"; --显示数字7
      				WHEN 8 => smg7:="1111111"; --显示数字8
      				WHEN 9 => smg7:="1111011"; --显示数字9
      				end case;
      				times<="11011111";--位选
      				sel<=smg7; --将获得的数字给sel段选信号
      	end case;
      	num := num+1;
      	end if;
         end process;--结束进程
      

    end bhv; --结束这个程序

    上面的显示模块可以使用函数写出来,这样可以节省很多代码,在状态选择进程中可以在前面定义一个枚举设定为S0-s3,因为我的只有四个状态,枚举中写你的状态代表变量就行了
    
    展开全文
  • 51单片机模拟交通灯

    千次阅读 多人点赞 2016-09-17 22:40:01
    利用51单片机的控制二极管及数码管的显示来模拟交通灯,系统晶振为11.0592MHZ,东西方向红灯设置为30秒,南北方向红灯设置为20 秒,P1.3接一个应急按钮,按下第一次放开,南北方向绿灯一直亮,东西方向红灯一直亮...

    利用51单片机的控制二极管及数码管的显示来模拟交通灯,系统晶振为11.0592MHZ,东西方向红灯设置为30秒,南北方向红灯设置为20 秒,P1.3接一个应急按钮,按下第一次放开,南北方向绿灯一直亮,东西方向红灯一直亮(目的是为了方便大领导通行),按下放开第二次,南北绿灯闪3秒黄灯亮2秒后变红灯,东西方向变为绿灯,之后沿着之前的设置一直循环,下面是仿真图、程序源代码

    仿真图

    程序源代码如下:
    作者:胡琴
    联系qq:1257394091
    网站:http://www.51hei.com 

    本程序已经通过软件仿真以及在自己搭建的硬件上测试通过.
    org 0000h
    ajmp main
    org 000bh
    ajmp inti0
    org 0030h
    main:mov tmod,#01h
         mov ie,#82h
      mov th0,#4ch 
      mov tl0,#00h
      mov sp,#60h
      mov 31h,#30  ;东西绿灯初值30秒
      mov 32h,#30  ;南北红灯初值30秒
      clr 4fh  ;清标志位
      clr p1.1 ;开东西绿灯
      clr p1.5 ;开南北红灯
      setb tr0 ;启动T0
    loop:lcall display  ;调用显示子程序
         lcall key   ;调用应急按键判断
         ajmp loop
    inti0:push psw
          clr ea
       mov th0,#4ch
       mov tl0,#00h
       inc 35h
       mov a,35h
       cjne a,#20,out  ;判1秒是否到时
       mov 35h,#00
       jb 4fh,yi   ;判别标志位
       dec 31h ;东西时间每秒减1
       dec 32h ;南北时间每秒减1
       mov a,31h
       cjne a,#05,out ;判是否到25秒
       setb p2.0  ;到25秒关时间显示
       setb p2.1 
       setb p1.1   ;东西绿灯闪灭3秒
      lcall del500ms 
      clr p1.1
      lcall del500ms
      setb p1.1
      lcall del500ms
      clr p1.1
      lcall del500ms
      setb p1.1
         lcall del500ms
      clr p1.1
      lcall del500ms
      setb p1.1   ;灭东西绿灯
      sjmp er
    out:setb ea
        pop psw
     reti 
      er:clr p1.2  ;东西黄灯亮2秒
      mov 33h,#4   ;延时2秒
    loop1:lcall del500ms
          djnz 33h,loop1
       setb p1.2   ;2秒后灭东西黄灯
       clr p2.0  ;5秒后开时间显示
       clr p2.1
       mov 31h,#20   ;东西时间赋20秒初值
          mov 32h,#20 ;南北时间赋20秒初值
       setb 4fh
       setb p1.5  ;关南北红灯
       clr p1.0  ;点亮东西红灯
          clr p1.6  ;点亮南北绿灯
       sjmp out
       yi:dec 31h ;东西时间每秒减1
       dec 32h ;南北时间每秒减1
       mov a,31h
       cjne a,#5,out  ;判是否到15秒
       setb p2.6    ;到15秒关时间显示
       setb p2.7    ;
       setb p1.6  ;南北绿灯闪灭3秒
      lcall del500ms
      clr p1.6
      lcall del500ms
      setb p1.6
      lcall del500ms
      clr p1.6
      lcall del500ms
      setb p1.6
         lcall del500ms
      clr p1.6
      lcall del500ms
       setb p1.6    ;关南北绿灯
       clr p1.7   ;南北黄灯亮2秒
      mov 34h,#4   ;延时2秒
    loop2:lcall del500ms
          djnz 34h,loop2
       setb p1.7   ;2秒后灭南北黄灯
       clr p2.6 ;5秒后开时间显示
       clr p2.7 ;
       mov 31h,#30 ;东西时间重赋30秒初值
       mov 32h,#30 ;南北时间重赋30秒初值
       clr p1.1    ;点亮东西绿灯
       clr p1.5    ;点亮南北红灯
       setb p1.0    ;关东西红灯
       clr 4fh
       sjmp out
    display:mov a,31h  ;东西方向时间显示
            mov b,#10
      div ab
      mov 20h,a
      mov 21h,b
      disp1:mov a,20h
            mov dptr,#table
      movc a,@a+dptr
      mov p0,a
      clr p2.0
      lcall del1ms
      setb p2.0
      disp2:mov a,21h
            mov dptr,#table
      movc a,@a+dptr
      mov p0,a
      clr p2.1
      lcall del1ms
      setb p2.1
      disp3:mov a,32h   ;南北方向时间显示
      mov b,#10
      div ab
      mov 22h,a
      mov 23h,b
      disp4:mov a,22h
            mov dptr,#table
      movc a,@a+dptr
      mov p3,a
      clr p2.6
      lcall del1ms
      setb p2.6
      disp5:mov a,23h
            mov dptr,#table
      movc a,@a+dptr
      mov p3,a
      clr p2.7
      lcall del1ms
      setb p2.7
      ret
    table:db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h   ;0-9数字 
    del1ms:mov r7,#10   ;1ms延时子程序
    d1:mov r6,#50
       djnz r6,$
       djnz r7,d1
       ret
    del500ms:mov r5,#5  ;500ms延时子程序
    del3:mov r4,#200
    del4:mov r3,#250
         djnz r3,$
      djnz r4,del4
      djnz r5,del3
      ret
    key:jb p1.3,keyout
        jnb p1.3,$
     clr ea
     inc 36h
     mov a,36h
     cjne a,#2,key4
     mov 36h,#00
       setb p1.6   ;东西绿灯闪灭3秒
      lcall del500ms 
      clr p1.6
      lcall del500ms
      setb p1.6
      lcall del500ms
      clr p1.6
      lcall del500ms
      setb p1.6
         lcall del500ms
      clr p1.6
      lcall del500ms
      setb p1.6   ;灭东西绿灯
      clr p1.7  ;东西黄灯亮2秒
      mov 33h,#4   ;延时2秒
    loop3:lcall del500ms
          djnz 33h,loop3
       setb p1.7   ;2秒后灭东西黄灯
       setb p1.0   ;关东西红灯
       setb p1.6  ;关南北绿灯
       clr p1.1  ;开西绿灯
       clr p1.5  ;开南北红灯
       setb ea
       sjmp keyout
    key4:clr p1.6 ;;开南北绿灯
         clr p1.0   ;开东西红灯
      setb p1.1
      setb p1.2
      setb p1.3
      setb p1.4
      setb p1.5
      setb p1.7
     keyout:ret
    end

    利用51单片机的控制二极管及数码管的显示来模拟交通灯,系统晶振为11.0592MHZ,东西方向红灯设置为30秒,南北方向红灯设置为20 秒,P1.3接一个应急按钮,按下第一次放开,南北方向绿灯一直亮,东西方向红灯一直亮(目的是为了方便大领导通行),按下放开第二次,南北绿灯闪3秒黄灯亮2秒后变红灯,东西方向变为绿灯,之后沿着之前的设置一直循环,下面是仿真图、程序源代码

    仿真图

    程序源代码如下:
    作者:胡琴
    联系qq:1257394091
    网站:http://www.51hei.com 

    本程序已经通过软件仿真以及在自己搭建的硬件上测试通过.
    org 0000h
    ajmp main
    org 000bh
    ajmp inti0
    org 0030h
    main:mov tmod,#01h
         mov ie,#82h
      mov th0,#4ch 
      mov tl0,#00h
      mov sp,#60h
      mov 31h,#30  ;东西绿灯初值30秒
      mov 32h,#30  ;南北红灯初值30秒
      clr 4fh  ;清标志位
      clr p1.1 ;开东西绿灯
      clr p1.5 ;开南北红灯
      setb tr0 ;启动T0
    loop:lcall display  ;调用显示子程序
         lcall key   ;调用应急按键判断
         ajmp loop
    inti0:push psw
          clr ea
       mov th0,#4ch
       mov tl0,#00h
       inc 35h
       mov a,35h
       cjne a,#20,out  ;判1秒是否到时
       mov 35h,#00
       jb 4fh,yi   ;判别标志位
       dec 31h ;东西时间每秒减1
       dec 32h ;南北时间每秒减1
       mov a,31h
       cjne a,#05,out ;判是否到25秒
       setb p2.0  ;到25秒关时间显示
       setb p2.1 
       setb p1.1   ;东西绿灯闪灭3秒
      lcall del500ms 
      clr p1.1
      lcall del500ms
      setb p1.1
      lcall del500ms
      clr p1.1
      lcall del500ms
      setb p1.1
         lcall del500ms
      clr p1.1
      lcall del500ms
      setb p1.1   ;灭东西绿灯
      sjmp er
    out:setb ea
        pop psw
     reti 
      er:clr p1.2  ;东西黄灯亮2秒
      mov 33h,#4   ;延时2秒
    loop1:lcall del500ms
          djnz 33h,loop1
       setb p1.2   ;2秒后灭东西黄灯
       clr p2.0  ;5秒后开时间显示
       clr p2.1
       mov 31h,#20   ;东西时间赋20秒初值
          mov 32h,#20 ;南北时间赋20秒初值
       setb 4fh
       setb p1.5  ;关南北红灯
       clr p1.0  ;点亮东西红灯
          clr p1.6  ;点亮南北绿灯
       sjmp out
       yi:dec 31h ;东西时间每秒减1
       dec 32h ;南北时间每秒减1
       mov a,31h
       cjne a,#5,out  ;判是否到15秒
       setb p2.6    ;到15秒关时间显示
       setb p2.7    ;
       setb p1.6  ;南北绿灯闪灭3秒
      lcall del500ms
      clr p1.6
      lcall del500ms
      setb p1.6
      lcall del500ms
      clr p1.6
      lcall del500ms
      setb p1.6
         lcall del500ms
      clr p1.6
      lcall del500ms
       setb p1.6    ;关南北绿灯
       clr p1.7   ;南北黄灯亮2秒
      mov 34h,#4   ;延时2秒
    loop2:lcall del500ms
          djnz 34h,loop2
       setb p1.7   ;2秒后灭南北黄灯
       clr p2.6 ;5秒后开时间显示
       clr p2.7 ;
       mov 31h,#30 ;东西时间重赋30秒初值
       mov 32h,#30 ;南北时间重赋30秒初值
       clr p1.1    ;点亮东西绿灯
       clr p1.5    ;点亮南北红灯
       setb p1.0    ;关东西红灯
       clr 4fh
       sjmp out
    display:mov a,31h  ;东西方向时间显示
            mov b,#10
      div ab
      mov 20h,a
      mov 21h,b
      disp1:mov a,20h
            mov dptr,#table
      movc a,@a+dptr
      mov p0,a
      clr p2.0
      lcall del1ms
      setb p2.0
      disp2:mov a,21h
            mov dptr,#table
      movc a,@a+dptr
      mov p0,a
      clr p2.1
      lcall del1ms
      setb p2.1
      disp3:mov a,32h   ;南北方向时间显示
      mov b,#10
      div ab
      mov 22h,a
      mov 23h,b
      disp4:mov a,22h
            mov dptr,#table
      movc a,@a+dptr
      mov p3,a
      clr p2.6
      lcall del1ms
      setb p2.6
      disp5:mov a,23h
            mov dptr,#table
      movc a,@a+dptr
      mov p3,a
      clr p2.7
      lcall del1ms
      setb p2.7
      ret
    table:db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h   ;0-9数字 
    del1ms:mov r7,#10   ;1ms延时子程序
    d1:mov r6,#50
       djnz r6,$
       djnz r7,d1
       ret
    del500ms:mov r5,#5  ;500ms延时子程序
    del3:mov r4,#200
    del4:mov r3,#250
         djnz r3,$
      djnz r4,del4
      djnz r5,del3
      ret
    key:jb p1.3,keyout
        jnb p1.3,$
     clr ea
     inc 36h
     mov a,36h
     cjne a,#2,key4
     mov 36h,#00
       setb p1.6   ;东西绿灯闪灭3秒
      lcall del500ms 
      clr p1.6
      lcall del500ms
      setb p1.6
      lcall del500ms
      clr p1.6
      lcall del500ms
      setb p1.6
         lcall del500ms
      clr p1.6
      lcall del500ms
      setb p1.6   ;灭东西绿灯
      clr p1.7  ;东西黄灯亮2秒
      mov 33h,#4   ;延时2秒
    loop3:lcall del500ms
          djnz 33h,loop3
       setb p1.7   ;2秒后灭东西黄灯
       setb p1.0   ;关东西红灯
       setb p1.6  ;关南北绿灯
       clr p1.1  ;开西绿灯
       clr p1.5  ;开南北红灯
       setb ea
       sjmp keyout
    key4:clr p1.6 ;;开南北绿灯
         clr p1.0   ;开东西红灯
      setb p1.1
      setb p1.2
      setb p1.3
      setb p1.4
      setb p1.5
      setb p1.7
     keyout:ret
    end

    展开全文
  • 基于51单片机的交通灯控制设计

    万次阅读 多人点赞 2019-07-16 20:16:13
    题目 交通灯控制设计 课程设计目标与任务、计划与进度安排: 实践教学要求与任务: 1、了解交通灯的基本工作原理; 2、用Proteus模拟实现交通灯控制; 3、用Keil C51编程实现上述功能; 4、用Keil与Proteus联调。 工作...

    课程设计任务书及成绩

    课程名称

    单片机课程设计

    题目

    交通灯控制设计

    课程设计目标与任务、计划与进度安排:

    实践教学要求与任务:

    1、了解交通灯的基本工作原理;
    2、用Proteus模拟实现交通灯控制;
    3、用Keil C51编程实现上述功能;
    4、用Keil与Proteus联调。

    工作计划与进度安排:

    17周查找相关资料。
    18周详细设计。
    19周程序测试,书写论文,进行答辩。

    1 引言

    交通事业蓬勃发展,交通流量年年增长,大、中、小城市的汽车、摩托车等各种车辆与日俱增,道路交通繁忙,经常有严重堵车现象,特别是在交叉口,机动车、非机动车、行人来往非常混乱,为了在叉口的各条干道实现合理的科学分流。本人根据单片机具有物美价廉、功能强、使用方便灵活、可靠性高等特点,提出了一种用STC89c51单片机自动控制交通信号灯及时间显示的方法,同时给出了软硬件的实现方法,为交通指挥自动化提供了一种新的廉价手段,具有一定的推广意义。本文介绍了控制基本原理以及控制的表现,同时也介绍了城市交通信息系统的设计目标, 开发途径及其系统结构与功能和数据地理编码、建库, 同时, 论述了系统中交通现状、交通管理、交通规划及背景信息查询模块的建造及应用。介绍了用于城市交叉路口的三色程控交通信号时间显示器的研制方案,对其电源供电、发光二极管构成的负载结构、灯色时间检测都给出了精巧合理的优化结构,大幅度地提高了产品可靠性并降低了制造成本。

    2 应用软件介绍

    2.1 C语言介绍

    C语言是于1972年由贝尔实验室的Dennis Ritchie在B语言的基础上开发出来的。最初的C语言是作为UNIX操作系统的开发语言而被人们所认识。此后,贝尔实验室对C语言进行了多次改进和版本的公布,C语言的优点才引起人们的普遍注意。随着UNIX操作系统在各种机器上的广范使用,使C语言得到了迅速推广。1978年由Brian W. Kernighan和Dennis M. Ritchit合著了《The C Programming Language》一书,该书对C语言作了详细的描述,这本书对C语言发展影响深远,并成为了后来C语言版本的基础,称之为标准C。随后C语言在各种计算机上快速得以推广,并导致了许多C语言版本的出现。

    2.2 Keil C51

    Keil C51 是美国 Keil Software 公司出品的 51 系列兼容单片机 C 语言软件开发系统,与汇编相比,C 语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil 提供了包括 C 编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部分组合在一起。运行 Keil软件需要 WIN98、NT、WIN2000、WINXP 等操作系统。

    2.3 Proteus

    Proteus 软件是英国 Lab Center Electronics 公司出版的 EDA 工具软件。它不仅具有其它EDA 工具软件的仿真功能,还能仿真单片机及外围器件。它是目前比较好的仿真单片机及外围器件的工具。虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。 Proteus 是英国著名的 EDA 工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到 PCB 设计,真正实现了从概念到产品的完整设计。是目前世界上唯一将电路仿真软件、PCB 设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持 8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086 和 MSP430 等,2010年又增加了 Cortex 和 DSP 系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持 IAR、Keil 和 MATLAB 等多种编译器。

    3 硬件资源介绍

    3.1单片机简介

    单片机(MCU)又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择。
    目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能 IC 卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。更不用说自动控制领域的机器人、智能仪表、医疗器械了。因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。

    3.2 89C51 简介

    89C51 是一种带 4K 字节闪烁可编程可擦除只读存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能 CMOS8 位微处理器,俗称单片机。单片机的可擦除只读存储器可以反复擦除 100 次。该器件采用 ATMEL 高密度非易失存储器制造技术制造,与工业标准的 MCS-51 指令集和输出管脚相兼容。由于将多功能 8 位 CPU 和闪烁存储器组合在单个芯片中,ATMEL 的 89C51 是一种高效微控制器,89C2051 是它的一种精简版本。

    3.3 89C51 单片机的片内逻辑结构

    在这里插入图片描述

    3.4 89C51 硬件资源

    (1)微处理器(CPU):一个 8 位 CPU。
    (2)数据存储器(RAM):片内为 128B,片外最多可外扩 64KB。
    (3)程序存储器(4KB Flash ROM):片内为 4KB,片外最多可外扩程序存储器至 64KB。
    (4)4 个 8 位可编程并行 I/O 口(P0、P1、P2、P3),1 个全双工的串行口。
    (5)定时器/计数器:片内有 2 个 16 位的定时器/计数器,具有 4 种工作方式。
    (6)中断系统:具有 5 个中断源,2 级中断优先级。
    (7)特殊功能寄存器(SFR): 共有 21 个特殊功能寄存器,用于 CPU 对片内各功能部件进行管理、控制和监视。
    (8)1 个看门狗定时器(WDT)。

    3.5 89C51 的引脚图

    在这里插入图片描述

    (1)P0 口:8 位,漏极开路的双向 I/O 口。
    (2) P1 口:8 位,准双向 I/O 口,具有内部上拉电阻。
    (3)P2 口:8 位,专为用户使用的准双向 I/O 口,具有内部上拉电阻。
    (4)P3 口:8 位,准双向 I/O 口,具有内部上拉电阻。也可作为普通的 I/O 口使用。除此之外,P3 口还有第二功能的定义。

    4 设计课题

    交通灯控制设计:
    1.了解一个十字路口交通灯基本工作原理,要求分主次干道,并加入倒计时功能
    2.用Keil C51编程实现上述功能
    3.用Proteus模拟实现十字路口交通灯控制电路。
    4.用Keil与Proteus联调

    5.方案设计

    5.1交通灯四种通行模式及行车方向指示

    按照简单的交通路口规则,有四种模式

    1. 南北绿灯亮 东西红灯亮
    2. 南北黄灯闪 东西红灯亮
    3. 南北红灯亮 东西绿灯亮
    4. 南北红灯亮 东西黄灯闪

    在这里插入图片描述

    5.2 交通灯控制系统

    实用交通灯控制系统主要CPU控制模块为了、信号灯显示模块、倒计时显示模块等组成,如下图所示:
    在这里插入图片描述
    其中控制模块是最核心的部分,控制核心采用AT89C51单片机,利用AT89C51单片机内部定时器实现交通指示灯控制的计时功能,在正常情况下产生相应的控制信息控制倒计时显示电路,信号灯显示电路的正常运行。
    信号灯显示模块采用四个集成交通指示灯来模拟红、黄、绿交通指示灯,用单片机的P1口控制发光二极管的亮灭状态。
    倒计时显示模块的接口电路有静态显示和动态显示两种方式,由于动态显示方式在仿真软件中不易于查看,所以本次采用静态显示方式,这种方式优点是易于操作,缺点是浪费单片机接口资源。
    为了倒计时更加准确,采用外加晶振电路方法实现其功能。

    6硬件系统设计

    6.1 信号灯显示模块

    由于南北方向的信号灯始终是同一种状态,所以南北信号灯为一组,只需将对应的信号灯并联即可,东西方向同理。
    在这里插入图片描述

    6.2 倒计时显示模块

    选取8个7段数码管分别模拟显示四个方向的倒计时,数码管采用共阴极接法。
    为了提高P0、P2端口的电流输出能力,保证数码管亮度,保护端口引脚,在P0端口与数码管之间增加了74LS245芯片。
    在这里插入图片描述

    6.3 复位模块

    此系统可以通过复位按键实现从新工作,电路图如图所示:

    在这里插入图片描述

    7软件系统设计

    7.1 中断服务程序框图

    在这里插入图片描述

    7.2 主程序框图

    在这里插入图片描述
    7.3 程序代码

    #include<reg51.h>
    sbit g1=P1^0; 	//位定义
    sbit r1=P1^1; 
    sbit y1=P1^2; 
    sbit g2=P1^3; 
    sbit r2=P1^4; 
    sbit y2=P1^5; 
    unsigned char f=0;
    unsigned char nanbei_time=15;	 //定义南北的时间长度
    unsigned char dongxi_time=11;    //定义东西的时间长度
    unsigned char m; 
    unsigned char code  t[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x7F,0x6F}; 
    void init_timer0(void) 	   //中断初始化函数
    	{
      	TMOD=0x01;  
      	TH0=(65536-50000)/256;  
     	 TL0=(65536-50000)%256;  
     	 ET0=1;  
     	 EA=1;  
      	TR0=1; 
     	 } 
     void display(unsigned char x) 
     	 {  
      	unsigned char m,n;  
    	m=x/10;  
    	n=x%10;  
    	P0=t[m];  
    	P2=t[n]; 
    	} 
    void timer(void) interrupt 1 using 1  //中断服务函数
    {
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        f++;
        if(f==20)
        {
            f=0;
            m--;
        }
    }
    void main() 
    {
    	m=nanbei_time;
       	P1=0x00;  
    	init_timer0(); 
       	while(1)  {  
      	 do   {   
    	 display(m);   
       		g1=1;  
    		r1=0;
            g2=0;
            r2=1;
            }
            while(m!=3);
            do
            {        
                if(m<=3)
                {
                    y1=~y1;
    				r1=0;
    				g1=0;
                    r2=1;
    				g2=0;
                         }
            display(m);    
            		r1=0;
            g2=0;
            r2=1;
            }
            while(m!=3);
            do
            {        
                if(m<=3)
                {
                    y1=~y1;r1=0;g1=0;
                    r2=1;g2=0; 
                 }
            display(m);    
            }
    		while(m!=0);
    		if(m==0)
    {        m = dongxi_time;
    		y1 = 0;
    		y2 = 0;
        }
    	do{
    	display(m);
    	g1 = 0;
    	r1 = 1;
    	g2 = 1;
    	r2 = 0;
    	}
    	while(m!=3);
    	do{
    	      if(m<=3)
                {    
                    r1=1,g1=0;
                    y2=~y2,r2=0,g2=0;
              }
            display(m);
            }while(m!=0);
                if(m==0)
                {
                    m=nanbei_time;
                    y1=0;
                    y2=0;
                }
        }
    }
    

    8 电路仿真
    在这里插入图片描述
    在这里插入图片描述
    开始仿真:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    9设计总结
    通过这次单片机课设,我不仅学到了许多新的知识,而且加深了我对以前学习的理论知识的掌握。以前我们学的东西仅限于课本,对实实在在的应用还比较模糊,这次课程设计有利于同学们学习目的的明确性和主动性。通过这次课程设计,我们知道了哪些东西是应该确实掌握的,在实践中填充我理论知识的不足,可以将理论很好地应用到实际当中去。
    10参考文献
    1.《单片机原理及接口技术》 张毅刚 人民邮电出版社
    2.《单片机课程设计指导书》 皮大能 北京理工大学出版社

    展开全文
  • 交通灯课程设计:本设计是基于数字电路芯片完成的,内有Multisim仿真电路(已验证通过),具体设计说明书,基本思路采用74LS160十进制加法计数器来产生四种交通灯状态,计数器是由多功能计数器555产生的1Hz的秒脉冲...
  • 基于FPGA的交通灯

    千次阅读 2017-08-27 18:31:20
    一个简单FPGA的交通灯工程
  • EDA大作业——交通灯代码

    千次阅读 2014-06-30 23:11:40
    附件:程序设计 (1)分频器的设计 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;   entity arc_devide5m is port( clk : in std_logic; clk_out : out std_...
  • PLC实验四十字路口交通灯控制的模拟

    千次阅读 多人点赞 2017-04-25 20:31:34
    PLC实验四十字路口交通灯控制的模拟
  • 数字逻辑实验-交通灯控制设计

    万次阅读 多人点赞 2019-07-06 10:22:58
    题目:交通灯控制电路 下载链接:http://download.csdn.net/download/xunciy/9939818 一.任务 设计一交通灯控制电路 二.设计要求: (1) 设计一个十字路口的交通灯控制电路,要求东西方向车道和南北方向车道两条...
  • 设计一交通灯系统,要求有红,黄,绿,左转四盏灯,并且每个路口有需要一个倒数的计数器,绿灯维持的时间为40秒,黄灯为5秒,左转灯10秒,红灯60秒。要求在modelsim仿真波形中显示至少一个完整的交通灯变换周期,...
  • 交通灯数据集

    千次阅读 2020-01-11 10:17:28
    博世小交通灯数据集:用于深度学习的小型交通灯的数据集。 https://hci.iwr.uni-heidelberg.de/node/6132 LaRa交通灯识别:巴黎的交通信号灯数据集。 http://www.lara.prd.fr/benchmarks/trafficlightsrecognition ...
  • 基于51单片机的简单交通灯程序

    千次阅读 2020-05-19 07:33:49
    这是一个比较完整的程序。最近实习要做交通灯, 写了个程序。比较简单,不过初学者可以参考,呵呵 ;************************************* ;file name:traffic_light.asm ; ;FOUCTION :实现交通
  • 感谢@东东提供的基本电路图,在其上作了一些修正。先打开Quartus II新建一个工程。 选择事先建好的文件夹,输入工程名。 这时文件夹里就有这个工程了,但是还没有电路。 打开图形设计界面。...
  • 安徽大学2016年微机原理实验考试题:微机原理8255并行接口实验-红绿灯的模拟实现 SSTACK SEGMENT STACK DW 32 DUP(?) SSTACK ENDS CODE SEGMENT ASSUME CS:CODE START: MOV DX,0646H MOV AL,80H ...
  • 正如题目所说的,这个项目的主要工作实际上就是实现交通灯的检测。在智能交通领域关于交通标志,车道线,车辆前向碰撞预警,后向碰撞预警,车距检测等已经有比较广泛的研究。这些交通相关的计算机视觉方向也是目前...
  • 交通信号的检测与识别

    万次阅读 多人点赞 2018-05-16 09:52:50
    交通信号的检测与识别是无人驾驶与辅助驾驶必不可少的一部分,其识别精度直接关乎智能驾驶的安全。一般而言,在实际的道路场景中采集的交通信号图像具有复杂的背景,且感兴趣的信号区域只占很少的一部分,如下...
  • 写在前面 1)现实意义 早期使用的交通信号是固定配时的调控方式,无法随着车流量的变动而调整绿灯时间...智能交通系统的核心是交通信号的智能控制算法,根据实时交通流的大小,配置信号周期及各种色的闪亮时间...
  • 微机原理交通灯控制系统设计

    千次阅读 2018-09-10 15:24:29
    红灯停,绿灯行的交通规则,广泛用于十字路口,车站, 码头等公共场所,成为人们出行生活中不可少的必需品,由于计算机技术的成熟与广泛应用,使得交通灯的功能多样化,远远超过老式交通灯, 交通灯的数字化给人们生产生活...
  • 用VHDL设计交通灯

    千次阅读 2017-02-06 17:40:52
    一. 程序代码 1. 分频模块LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY fen_pin IS PORT( CLK : IN STD_LOGIC; CLK_1 : OUT STD_LOGIC ); END fen_pin;ARCHITECTURE BEHAV OF fen_pin IS
1 2 3 4 5 ... 20
收藏数 25,309
精华内容 10,123
关键字:

交通灯