• 单片机控制交通灯V1.0

    2009-12-02 23:39:00
    单片机控制交通灯V1.0要求:(1)、十字路口南北、东西方向各装有绿、黄、红指示灯,南北通行时间为15s,东西通行时间为10s,当由绿灯变为红灯前的3s内,绿灯灭而黄灯亮。(2)、通行时间各由两位7段LED显示器指示,...

    单片机控制交通灯V1.0

    要求:

    1)、十字路口南北、东西方向各装有绿、黄、红指示灯,南北通行时间为15s,东西通行时间为10s,当由绿灯变为红灯前的3s内,绿灯灭而黄灯亮。

    2)、通行时间各由两位7LED显示器指示,且为倒时间指示(即从1510逐次减一,禁止通行时显示器灭)。

    3)、当某方向显示红灯时,容许人工干预强行改变两个方向的指示灯颜色,以让救护车之类的车辆通行,但发出改变通行命令后有3s时间使显示绿灯的方向改变显示黄灯,并以每秒10次的频率闪烁,以示警告。

     

    小结:本实验用ISIS 7 ProfessionalKeil uVision2仿真,由于是学单片机以来做的第一个实验,在南北、东西两个方向四个数码管倒计时那里控制得不好,用动态描扫实现,闪烁比较明显,希望在后面的理论学习中找到更好的实现方法。

     

     

     

    参考源程序:

    #include"reg52.h"

     

    #define uchar unsigned char

    #define uint unsigned int

     

     

    sbit one=P3^4;      //数码段位选控制

    sbit two=P3^5;

    sbit three=P3^6;

    sbit four=P3^7;

     

    sbit d_lu=P0^1;

    sbit d_huang=P0^2;

    sbit d_hong=P0^3;

     

    sbit x_lu=P2^1;

    sbit x_huang=P2^2;

    sbit x_hong=P2^3;

     

    sbit n_lu=P2^4;

    sbit n_huang=P2^5;

    sbit n_hong=P2^6;

     

    sbit b_lu=P0^4;

    sbit b_huang=P0^5;

    sbit b_hong=P0^6;

     

    uint fangxiang=0;

    uint m,n,k;

     

    code unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90};//7LED对应于数字'0','1'...'9'

    void delay(uint z)

    {

        uint x,y;

        for(x=z;x>0;x--)

            for(y=110;y>0;y--);

    }

     

     

     

    void delayMs(uint timer_num, uint fxang)

    {

        uchar aa,bb,j;

        TMOD=0x10;                  //设定T1为方式1

        TR1=1;                      //启动定时器工作 

        fangxiang=fxang;                          

        for(j=0;j<10;j++)           //每隔100ms中断一次,中断10次为1s

        {

            TH1=0x3c;                   //定初值                  

            TL1=0xb0;

            if(fxang==0)            //东西方向通行

            {

               do

                           {

                    aa=timer_num/10;

                    bb=timer_num%10;

                    one=1;          //数码管动态扫描,位选

                         two=0;

                    three=0;

                    four=0;

                    P1=tab[aa];     //数码管动态扫描,段选

                    delay(50);

     

                         one=0;

                         two=1;

                    three=0;

                    four=0;

                    P1=tab[bb];

                    delay(50);

                }while(!TF1);

                         

                TF1=0;

              }

             else

                if(fxang==1)        //南北方向通行

                {

                               do

                               {

                        aa=timer_num/10;

                        bb=timer_num%10;

                        one=0;

                             two=0;

                             three=1;

                             four=0;

                        P1=tab[aa];

                        delay(50);

     

                             one=0;

                             two=0;

                             three=0;

                             four=1;

                        P1=tab[bb];

                        delay(50);

                     }while(!TF1);

                    TF1=0;

                 }

        }

    }

     

    void zhuangtai_1() 

    {

      d_lu=0;

      d_hong=1;

      d_huang=1;

     

      x_lu=0;

      x_hong=1;

      x_huang=1;

     

      n_hong=0;

      n_huang=1;

      n_lu=1;

     

      b_hong=0;

      b_lu=1;

      b_huang=1;

     

     

    }                                 

     

    void zhuangtai_2()      

    {

      d_lu=1;

      d_huang=0;

      d_hong=1;

     

      x_lu=1;

      x_huang=0;

      x_hong=1;

     

      n_hong=0;

      n_huang=1;

      n_lu=1;

     

      b_hong=0;

      b_huang=1;

      b_lu=1;

    }

    void zhuangtai_3() 

    {

      d_lu=1;

      d_huang=1;

      d_hong=0;

     

      x_lu=1;

      x_huang=1;

      x_hong=0;

     

      n_hong=1;

      n_huang=1;

      n_lu=0;

     

      b_hong=1;

      b_huang=1;

      b_lu=0;

     

    }

    void zhuangtai_4()  

    {

        d_lu=1;

        d_huang=1;

        d_hong=0;

     

        x_lu=1;

        x_huang=1;

        x_hong=0;

     

        n_hong=1;

        n_huang=0;

        n_lu=1;

     

        b_hong=1;

        b_huang=0;

        b_lu=1;

    }

     

    void exint0(void) interrupt 0   //人工干预,外部中断0实现

    {

        EA=0;

       

        one=0;                      //关闭所有数码管

        two=0;

        three=0;

        four=0;

        TMOD=0x10;                  //设定T1为方式1

        TR1=1;                      //启动定时器工作                                    

        for(m=0;m<30;m++)           //改变通行命令后3s

        {

            TH1=0x3c;                   //定初值                  

            TL1=0xb0;

             do

                 {

                delay(50);

                delay(50);

            }while(!TF1);

            TF1=0;

        }

       

        if(fangxiang==0)            //fangxiang为产生外部中断时通行的方向,0为东西方向

        {

            n_hong=0;

            b_hong=0;

            d_lu=1;

            x_lu=1;

            for(n=0;n<10;n++)       //使黄灯每秒闪10

                 {

                TR1=1;              //启动定时器工作 

                TH1=0x3c;               //定初值                  

                TL1=0xb0;

                     do

                           {

                    delay(100);

                }while(!TF1);

                TF1=0;

                          

                d_huang=0;

                x_huang=0;

                delay(1000);

                d_huang=1;

                x_huang=1;

                 }

        }

        else                        //产生中断时,通行方向为南北方向

        {

            d_hong=0;

            x_hong=0;

            n_lu=1;

            b_lu=1;

            for(k=0;k<10;k++)//每秒10

                 {

                TR1=1;              /* 启动定时器工作 */

                TH1=0x3c;           //定初值                  

                TL1=0xb0;

                     do

                           {

                    delay(100);

                }while(!TF1);

                TF1=0;

                          

                                   

                n_huang=0;

                b_huang=0;

                delay(1000);

                n_huang=1;

                b_huang=1;

                 }

        }

     

        EA=1;

    }

        

     

    main()

    {

        int i;

        TCON=0x55;

        IE=0x81;

        while(1)

        {

                for(i=10;i>=4;i--)      //东西通行10s

                     {

                    zhuangtai_1();

                    delayMs(i,0);

                }

                for(i=3;i>=0;i--)              

                {

                    zhuangtai_2();

                    delayMs(i,0);         

                      

                 }

                          

                for(i=15;i>=4;i--)      //南北通行15s              

                {           

                    zhuangtai_3();

                    delayMs(i,1);

                           }

                       

                for(i=3;i>=0;i--)

                {

                    zhuangtai_4();           

                    delayMs(i,1);                                      

                }                            

         } 

    }                       

                        

                   

                                

      

     

     

    展开全文
  • 本设计为基于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

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

    展开全文
  • 基于51单片机模拟交通灯程序 系统概要:由于该交通系统设计一个十字路口,A道为主干道,B道为支干道。由于主干道的交通压力较大车流量大,所以A道的通行时间(即A道的绿灯与黄灯的时间应该比B道的绿灯与黄灯时间长)...

    基于51单片机模拟交通灯程序

    系统概要:由于该交通系统设计一个十字路口,A道为主干道,B道为支干道。由于主干道的交通压力较大车流量大,所以A道的通行时间(即A道的绿灯与黄灯的时间应该比B道的绿灯与黄灯时间长),只有A道的通行时间比B道的通行时间长才能合理的分配十字交通路口的交通压力。并且该系统应该有紧急的交通情况,也就是遇到交通的紧急情况,A道与B道的交通灯应该为红色,禁止A道与B道的车辆通过,使紧急车辆通过后。重新恢复到A道与B道红绿灯状态。在这里插入图片描述
    首先a道方向绿灯亮,b到方向红灯亮,同时开始计时60s,在段数码管上显示时间60秒倒数。当时间少于10s倒计时A道方向切换黄灯,B道依然为红灯。当60s倒计时结束后,A道方向黄灯开始转变为红灯,B道方向红灯开始转变为绿灯。并开始倒计时30秒,当时间少于5s时B道方向由绿灯转变为黄灯,A道方向还是红灯亮。当5s倒计时结束后B道黄灯转变为红灯,A道开始由红灯转变为绿灯。接着又开始循环以上步骤。应该还包含一个紧急车辆的情况,当有紧急车辆通过时,AB道都应该为红灯。(绿灯用亮3个灯,黄灯亮一个灯,红灯则不亮,紧急情况用按下按键K3)
    废话不多说直接上代码:

    #include<reg51.h>
    #define uchar unsigned char
    #define uint unsigned int
    
    sbit DU=P2^0;//段码锁存器开关
    //sbit DU1=P2^0;
    //sbit DU2=P2^0;
    sbit WE=P2^1;//位码锁存器开关
    sbit beep=P2^3;
    sbit gd=P2^2;
    
    //sbit B_red=P1^5
    
    sbit anniu=P3^2;
    
    unsigned int pp;
    unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,	 //0到6显示
                            0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//7到f显示
    uchar j,k,l=255;
    uchar a1,a0;
    uchar shijian,deng=1;
    void delay(unsigned int i) //位码的转换	3*5*125=1875ms=1.875s
    {
      for(j=i;j>0;j--)
        for(k=125;k>0;k--);
    }
    
    void display(unsigned char sh_c,unsigned char g_c)
    {  gd=0;
       DU=0;
       P0=table[sh_c]; //时间十位
       DU=1;
       DU=0;
       
       WE=0;
       P0=0xfe;
       WE=1;
       WE=0;
       delay(5);
       
       P0=table[g_c];//时间个位
       DU=1;
       DU=0;
       
       P0=0xfd;
       WE=1;
       WE=0;
       delay(5);
    }
    
    
    
    void int0(void) interrupt 0	//interrupt是声明函数为中断服务函数,0是编译器对中断的编号
    {							//外部中断0
    P1=0Xff;		            //特殊情况A,B道都为红灯
    while(anniu==0);            //低电频触发
    }
    
    
    
    
    
    
    void main()
    {
    	TMOD=0x01;//使用定时器T0的工作方式一
    	TR0=1;//使用定时器T0;
    	TH0=(65536-46080)/256;// 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。
    	TL0=(65536-46080)%256;//46080的来历,为50000*11.0592/12
    	EA=1; //打开中断总允许
    	ET0=1;//定时器0允许位
    	EX0=1;//外部中断0允许位
    	PX0=1;//外部中断0优先级
    	PT0=1;//定时器0优先级
    	while(1)
    	{	
    		if(shijian==0)
    		{
    			switch(deng)
    			{
    			/*	case 0: shijian=50;		  //红灯
    						deng=1;
    						break;
    				case 1: shijian=15;		  //黄灯
    						deng=2;
    						break; */
    				case 1: shijian=60;	//A道行驶,B道禁止	  //绿灯
    						deng=2;
    						break;
    				case 2: shijian=30;	//A道禁止,B道行驶	  //黄灯
    						deng=1;
    						break;
    			}
    		}
    		if(pp==20)
    		{	pp=0;
    			shijian--;
    		}
    		a0=shijian%10; //时间个位
    		a1=shijian/10; //时间十位
    		display(a1,a0);
    		switch(deng)
    		{
    			/*case 1: /*P1=0X00;			 //红灯
    					break;
    					P1=0xde;
    					break;
    			case 2: 			//黄灯
    					/*if(shijian%2==0)
    					P1=0x00;
    					if(shijian%2==1)
    					P1=0xff;				  1
    					break;
    					P1=0xee;
    					break;*/	 
    			case 2: 		//绿灯
    					/*if(shijian%2==0)
    					P1=0x55;
    					if(shijian%2==1)
    					P1=0xaa;
    					break; */
    					P1=0xdc;
    					if(shijian<=10){ //当时间<=10,A道进入黄灯
    					P1=0xfe;
    					}
    					break;
    			case 1:	/*if(shijian%2==0)	  //黄灯
    					P1=0x00;
    					if(shijian%2==1)
    					P1=0xff;
    					break;*/
    					P1=0xe3;
    					if(shijian<=5){//当时间<=5,B道进入黄灯
    					P1=0xf7;
    					}
    					break;	
    		}
    	}
    }
    
    void time0() interrupt 1        //定时器T0溢出中断
    {	TH0=(65536-46080)/256;     //fc(计数器频率)=fosc(晶振频率)/12;
    	TL0=(65536-46080)%256;	  //T=1/f;T为周期;
    	pp++;					  //X=2的十六次方-T/T机;
    }
    

    本项目较为困难的是段位码、定时器和外部中断0的使用,多看几遍相信大家都能看懂
    如果大家想看整个完整项目可以到我博客上传资源那里下载链接如下:
    点击此处下载:(https://download.csdn.net/download/weiweiweiIT/12166055

    展开全文
  • 单片机控制交通灯说明书一、设计思路 如何使主干道通车时间 ,可任意设置;次干道通车时间 ,可任意设置;黄灯亮时间 ,可任意设置;怎样采用倒计时的方式,用两位十进制数字显示红、绿、黄色信号灯的倒计时时间...
     
    

                     单片机控制交通灯说明书<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

    一、设计思路

          如何使主干道通车时间 ,可任意设置;次干道通车时间 ,可任意设置;黄灯亮时间 ,可任意设置;怎样采用倒计时的方式,用两位十进制数字显示红、绿、黄色信号灯的倒计时时间。

    二、电路图

            二、           使用材料

    1、单片机89c51                        两片

    2、CD4072                             一片

    3、LED七段吗数码管                    四个

    4、CD4511 四片

    5、红,绿,黄发光二极管                各两个

    三、元器件结构与工作原理

    1、单片机89c51  

         89C51包含了运算器、控制器、片内存储器、四个

    I/O 接口,串行接口、定时器和计数器、中断系统、振

    荡器。                      

     1)主电源引脚

    Vcc接+5V电源正端

    Vss接+5V电源地端

     2)外接晶体引脚

    XTAL1:片内反相放大器输入端

    XTAL2:片内反相放大器输出端。外接晶体时,XTAL1与XTAL2各接晶体的一端,接外接晶体与片内反相器构成振荡器。

    3)输入输出引脚

        本电路运用了P1.0---P1.7:P1口的8个引脚。可作为准双向I/O接口使用。

    P2.0~P2.7:P2口的8个引脚。一般可作为准双向I/O接口;在接有片外存储器或扩展I/O接口且寻址范围超过256个字节时,P2口用 的为高8位地址总线。

    P3.0~P3.7:P3口的8个引脚。除作为准双向I/O接口使用外,还具有第二功能。

    4)RST是复位端。单片机的振荡器工作时,该引脚上出现两个机器周期的高电平就可实现复位操作,使单片机回复道初始状态。

    2. CD 40511

      CD4511是一个用于驱动共阴极LED(数码管)显示器的BCD码-七段码译码器,特点如下:具有BCD转换,消隐和锁存控制、七段译码及驱动功能的CMOS电路能提供较大的拉电流。可直接驱动LED显示器。

      BI:4脚是测试消隐输入控制端,当BI=0时,不管其它输入端状态如何,七段码均处熄灭状态,不显示数字。

      LT:3脚是测试输入端,当BI=1,LT=0时,译码输出全为1,不管输入 DCBA 状态如何,七段均发亮,显示“8”。它主要用来检测数码管是否损坏。 &

    四、实验原理

    采用两片51系列单片机芯片AT89C51,完成交通信号控制系统。该系统的技术指标:主干道通车时间 ,可任意设置;次干道通车时间 ,可任意设置;黄灯亮时间 ,可任意设置;采用倒计时的方式,用两位十进制数字显示红、绿、黄色信号灯的倒计时时间。

    备注:

          org  0000h
            mov  sp,#70h
            sjmp main
            org  0023h
            ljmp sent
    main:   mov  a,#00h
            mov  p2,a
            lcall del1
            mov  a,p2
            mov  r1,a
            lcall del1
            mov  a,#00h
            mov  p2,a
            mov  a,p2
            xrl  a,r1
            cjne a,#00h,error ;绿灯时间储入r1  缺一错误跳转 

            mov  a,#00h
            mov  p0,a
            mov  a,p0
            anl  a,#00fh
            mov  r2,a         ;黄灯时间储入r2
             lcall del1
            mov  a,#00h
            mov  p0,a
            mov  a,p0
            anl  a,#00fh
            xrl  a,r2
            cjne a,#00h,error ;```
            mov  a,r1
            add  a,r2
            mov  r3,a          ;黄灯加红灯时间存入r3
                             

            mov  a,#66h
            add  a,r3         ;判断r3是否大于99大于99则出错
            jc   error
    cus:    mov  scon, #90h    ;设置串行口为方式2
            setb ea            ;开中断
            setb es            ;允许串行口中断
            lcall sout           ;先发送红灯数据
            mov   r0,#02h
            cjne   r0,#00,$    ;等待两次中断
    start:  mov  a,   r1
            mov  30h, a         ;将绿灯时间存入30h单元
            mov  a,   r2
            mov  31h, a         ;将黄灯时间存入31h单元
            mov  a,   r3
            mov  32h, a         ;将绿灯加红灯时间存入32h单元
            mov  a,   r4
            mov  33h, a         ;将红灯时间存入33h单元
    main0:  mov  a,   32h        ;取红灯加黄灯时间
            mov  2ah, a          ;存入2ah  倒计时显示时间
            mov  r3,  #0bfh      ;数码管控制码 绿灯亮其他灭
            mov  a,   30h
            mov  r7,  a          ;取延时时间存入r7,即绿灯亮时间
    main1:  lcall del            ;调用一秒延时子程序 并显示倒计时时间
            djnz  r7,main1       ;判断延时时间是否到  没到则 转main1循环
            mov   r3,#0dfh       ;数码管控制码 黄灯亮其他灭
            mov   a,  31h
            mov   r7, a          ;取延时时间存入r7,  即黄灯亮时间
    main2:  lcall del
            djnz  r7,main2       ;判断时间到否  没到则循环
            mov   r3,#7fh        ;数码管控制码  红灯亮其他灭
            mov   a,33h            ;取红灯时间
            mov   2ah,a            ;存入 2ah   倒计时显示时间
            mov   a,33h
            mov   r7,a            ;取延时时间存入r7,即红灯亮时间
     main3: lcall del             ;调用一秒延时 并显示倒计时时间
            djnz  r7,main3        ;判断时间是否到没到循环
            ajmp  main0            ;跳转到main循环执行程序
    error:  sjmp error
    del:    dec  2ah                 ;倒计时时间减1
            mov  dptr , # table    ;1秒延时加到计时显示 子程序  取表头地址存入dptr
            mov  a,2ah             ; 取倒计时显示时间到a中
            mov  b,#0ah             ;数字10存入b中
            div  ab                  ;a除以b 十位数存入a中 个位数存入b中
            movc a,@a+dptr           ;代码装换
            mov  r1,a                ;代码存入r1
            mov  a,b                 ;个位数存入a中
            add  a,r1                ;代码与个位相加 得显示码     存入a
            mov  r2,a                ;显示码存入r2
    disp:   mov  a,r2                ;显示码存入r2
            mov  p1,a                ;送出显示码 显示
            mov  a,r3
            mov  p0,a                ;输出信号灯控制码控制灯亮
    t2:     mov r6,#10               ;延时程序 0.999秒   12mHZ时为0.99秒
    d1:     mov r5,#200              ;6mHz时为1.98秒   可改r6=#5
    d2:     mov r4,#248
            djnz r4,$
            djnz r5,d2
            djnz r6,d1
            ret                     ;子程序返回
    table:  db 00h,10h,20h,30h,40h,
               db 50h,60h,70h,80h,90h


    sent:  jnb   ri,send   ;不是接收,转向发送
           lcall sin       ;接收,调用接收子程序
           reti             ;中断返回
    send:  clr ti           ;清发送中断标志
           dec r0           ;r0减1变为1
           reti             ;中断返回
    sout:  push psw
           push acc         ;保存 psw acc装状态
           mov a,r3         ;取黄灯加红灯时间放入a中
           mov c,p
           mov tb8,c        ;取奇偶效验为存入tb8
           mov sbuf,a       ;发送数据
           pop a
           pop psw           ;恢复 psw acc状态
           ret               ;子程序返回
    sin:   push psw
           push a           ;保存 psw acc状态
           clr  ri            ;清接收中断标志
           mov  a,sbuf         ;读入缓存区内容
           mov  c,p            ;取奇偶效验位
           jnc  s1             ;p=c=0转移到s1
           jnb  rb8,error      ;若两次效验位不一样,则出错
           ljmp s2             ;正确则转s2
    s1:    jb   rb8,error      ;若双方效验位不一样,则出错
    s2:    mov  r4,a           ;接收到的红灯时间存入r4
           dec  r0             ; r0减1
           pop  a
           pop  psw            ;恢复 psw acc状态
           ret                 ;子程序返回

    del1 : nop                 ; 15毫秒延时子程序 12m赫兹时
                               ;30毫秒延时子程序 6m赫兹时
    del2 : mov   r6,  #50
    del3 : mov   r7,  #150
    del4 : djnz  r7,  del4
    del5 : djnz  r6,  del3

           ret

    展开全文
  • 51单片机之点亮#一个灯#流水灯#交通灯 接下来的学习将主要转为使用keil编程,并使用proteus进行仿真,推荐有条件的同学可以购买一个板子进行实物的练习    发光二极管常用来指示系统工作状态,制作节日彩灯、广告...

    51单片机之点亮#一个灯#流水灯#交通灯

    接下来的学习将主要转为使用keil编程,并使用proteus进行仿真,推荐有条件的同学可以购买一个板子进行实物的练习
       发光二极管常用来指示系统工作状态,制作节日彩灯、广告牌匾等。大部分发光二极管工作电流1到5mA之间,其内阻为20到100Ω。电流越大,亮度也越高。为保证发光二极管正常工作,同时减少功耗,限流电阻选择十分重要,若供电电压为+5V,则限流电阻可选1~3kΩ。
       前面文章讲到,P0口作通用I/O用,由于漏极开路,需外接上拉电阻。而P1~P3口内部有30kΩ左右上拉电阻。
       发光二极管两个管脚分为阴极和阳极,哪个管脚接单片机便是个选择,两种接法是否相同?下图为两种接法,其中(a)为拉电流,(b)为灌电流:
    1
      当P0口某位为高电平时,可提供400µA的拉电流;当P0口某位为低电平(0.45V)时,可提供3.2mA的灌电流,而P1~P3口内有30kΩ左右上拉电阻,如高电平输出,则从P1、P2和P3口输出的拉电流Id仅几百µA,驱动能力较弱,亮度较差,见(a)。
      如端口引脚为低电平,能使灌电流Id从单片机外部流入内部,则将大大增加流过的灌电流值,见(b)。AT89S51任一端口要想获得较大的驱动能力,要用低电平输出。如一定要高电平驱动,可在单片机与发光二极管间加驱动电路,如74LS04、74LS244等。

    单灯练习
    【例1】 利用AT89C51单片机点亮灯led,灯led接单片机P1.0引脚上,编写程序使led点亮。

    #include<reg51.h>
    sbit led=P1^0;
    void main()
    {
         led=0;
    }
    
    #include <reg51.h>
    void main()
    {
         P1=0xfe;   //11111110
         while(1);	//使程序停留在这条指令上
    }
    
    

    仿真1
    流水灯练习
      一组灯并且在控制系统的控制下按照设定的顺序和时间来发亮和熄灭。来形成一定的视觉效果,常安装于店面和招牌上。要想实现流水灯,必须要进行延时操作,编写延时程序或延时子函数程序,由本人之前的文章C51语言,for循环可以实现一段时间的空操作,我们就用for循环来编写一段延时程序。

    void delay(void)          //延时1ms    晶振12mhz
    {
        unsigned char a,b;
        for(b=199;b>0;b--)
            for(a=1;a>0;a--);
    }
    
    void delay()         //延时1s   晶振11.0592mhz
    {
      unsigned char a,b;
      for(a=1000;a>0;a--)
        for(b=110;b>0;b--)
    }
    
    #define uint unsigned int        //宏定义uint 为unsigned int
    void delayms(uint xms)           //可变的延时时长的子程序,单位1ms
    {  
          uint i,j;
          for(i=xms;i>0;i--)
             for(j=110;j>0;j--);
    }
    

      由此可以看出,使用for循环编写延时程序时,需要不同的变量值来调试出一段延时时间,延时时间并不精准。较为精准的定时器延时将在后文讲到。

    【例2】 制作流水灯,8个发光二极管LED0~LED7经限流电阻分别接至P1口的P1.0~P1.7引脚上,阳极共同接高电平。编写程序来控制发光二极管由上至下的反复循环流水点亮,每次点亮一个发光二极管,时间间隔1S。

    #include <reg51.h>
    #define uint unsigned int  //宏定义
    void delayms(uint xms);    //函数声明
    void main()
    {
       while(1)//循环点亮
    	{
    	    P1=0xfe; delayms(1000); //11111110
    		P1=0xfd; delayms(1000); //11111101
    		P1=0xfb; delayms(1000); //11111011
    		P1=0xf7; delayms(1000); //11110111
    		P1=0xef; delayms(1000); //11101111
    		P1=0xdf; delayms(1000); //11011111
    		P1=0xbf; delayms(1000); //10111111
    		P1=0x7f; delayms(1000); //01111111
    	}
    }
    void delayms(uint xms)
    {
        uint i,j;
        for(i=xms;i>0;i--)
          for(j=110;j>0;j--);
    }
    
    #include <reg51.h>
    #define uint unsigned int
    sbit led0=P1^0;
    sbit led1=P1^1;
    sbit led2=P1^2;
    sbit led3=P1^3;
    sbit led4=P1^4;
    sbit led5=P1^5;
    sbit led6=P1^6;
    sbit led7=P1^7;
    void delayms(uint xms);
    void main()
    {
    	while (1)
         {
            	led0=0;led7=1;delayms(1000);
            	led1=0;led0=1;delayms(1000);
    			led2=0;led1=1;delayms(1000);
    			led3=0;led2=1;delayms(1000);
    			led4=0;led3=1;delayms(1000);
    			led5=0;led4=1;delayms(1000);
    			led6=0;led5=1;delayms(1000);
    			led7=0;led6=1;delayms(1000);
         }
    }
    void delayms(uint xms)
    {  
          uint i,j;
          for(i=xms;i>0;i--)
                 for(j=110;j>0;j--);
    }
    
    #include <reg51.h>
    #define uint unsigned int
    #define uchar unsigned char
    void delayms(uint xms);    //函数声明
    unsigned char table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};  //建立数组
    void main()
    {  
      uint k ;//定义局部变量k
      while(1)
      {	  
         for(k=0;k<8;k++)    //循环读数组中的数
         {
              P1=table[k];
              delayms(1000);
          }
      }	
    }
    void delayms(uint xms)
    { 
       uint i,j;
       for(i=xms;i>0;i--)
           for(j=110;j>0;j--);
    }
    
    #include <reg51.h>
    #include <intrins.h>      //包含移位函数_crol_(  )的头文件
    #define uint unsigned int
    #define uchar unsigned char		  	
    void delayms(uint xms);    //函数声明
    void  main(  )	                           //主程序
    {	
       P1=0xfe;			//向P1口送出点亮数据
       while(1)
       {  	
    	  P1=_crol_(P1,1) ; //函数_crol_(P1,1)把P1中的数据循环左移1位	
          delayms(1000);
       }
    }
    void delayms(uint xms)	 	//延时函数
    {	
    	  uint i,j;
          for(i=xms;i>0;i--)
            for(j=110;j>0;j--);
    }
    
    #include <reg51.h>
    #define uint unsigned int
    #define uchar unsigned char
    void delayms(uint xms);    //函数声明
    void  main(  )	 //主函数
     {   	
        uchar i,temp;
        while (1) 
        {	
          	temp=0x01;		//左移初值赋给temp,从低位到高位点亮
    	    for(i=0; i<8; i++)
    	   	{	
                P1=~temp;	// temp中的数据取反后送P1口
    	       	delayms(1000;	// 延时
    	      	temp=temp<<1; 	// temp 中数据左移一位
    	 	}
    	 	/*
    	 	temp=0x80; 		//赋右移初值给temp,从高位到低位点亮
    	    for(i=0; i<8; i++) 
    	    {	
                P1=~temp;	//temp中的数据取反后送P1口 
    	      	delayms(1000);		// 延时
    	       	temp=temp>>1; 	// temp 中数据右移一位
    	    }
    	    */
     	}
    }
    
    void delayms(uint xms)	 	//延时函数
    {	
    	  uint i,j;
          for(i=xms;i>0;i--)
             for(j=110;j>0;j--);
    }
    

    仿真2
    交通灯练习
    【例3】东西方向绿灯先亮27S后黄灯亮3S,期间南北方向红灯同时亮30S;然后南北方向绿灯先亮27S后黄灯亮3S,期间东西方向红灯同时亮30S;然后东西方向,如此反复。

    #include <reg52.h>
    #define uint unsigned int
    void delays(uint x);
    
    void main()
    {
    	while(1) //东西方向从上到下依次为黄绿红,南北方向从左到右依次为黄绿红
    	{
    		P1=0xb7;delays(27000);//南北红27,东西绿27;
    		P1=0xd7;delays(3000); //南北红3,东西黄3;
    		P1=0x7b;delays(27000);//南北绿27,东西红27;
    		P1=0x7d;delays(3000); //南北黄3,东西红3;
    	}
    }
    
    void delays(uint x)
    {
    	uint i,j;
    	for(i=x;i>0;i--)
    	  for(j=120;j>0;j--);
    }
    

    仿真3

    展开全文
  • 前言 这次作为嵌入式系统与应用的中期考试,老师要求写一个红绿灯的程序(包括车辆&行人),要求在单片机上可持续合理化运行 简化如下:十字路口中,南北方向与东西方向均只考虑直行,行人红绿灯仅考虑东侧的南北向...
  • 引用cy_pp 的 非常详细的51单片机引脚介绍 T89C2051是精简版的51单片机,精简掉了P0口和P2口,只有20引脚,但其内部集成了一个很实用的模拟比较器,特别适合开发精简的51应用系统,毕竟很多时候我们开发简单的产品...
  • 目录 (一) 课题简介................................. 2(二) 设计方案................................. 2(三) 具体设计................................. 41. 电路原理.................................
  • 单片机原理及应用 班级 14计2班 实验名称 P1口转弯实验 教导教师 王明安 姓名 张钦颖 学号 1414080901218 组号 17 日期 2016/10/...
  • SIM868使用笔记

    2019-04-30 14:37:10
    NiRen-SIM868-V1.0 是泥人科技推出的一款高性能,高集成度的工业级GSM/GPRS/GPS/蓝牙模块。NiRen-SIM868-V1.0板载 SIM868 模块,该模块是在实现完整的四频段 GSM / GPRS技术的基础上,集成了 GPS 和蓝牙技术。可以低...
  • 在初学51单片机的时候,总是伴随很多有关于晶振的问题,其实晶振就是如同人的心脏,是血液的脉搏,把单片机的晶振问题搞明白了,51单片机的其他问题迎刃而解…… 有关51单片机有关晶振的问题一并总结出来,希望对学...
  • 51 单片机设计跑马的程序用(c 语言)编写 P1 口接 8 个发光二极管共阳,烧入下面程序 #include unsigned char i; unsigned char temp; unsigned char a,b; void delay(void) { unsigned char m,n,s; for(m=20;m>0...
  • 本节书摘来自异步社区《51单片机应用开发从入门到精通》一书中的第2章,第2.1节,作者 张华杰,更多章节内容可以访问云栖社区“异步社区”公众号查看。 第 2 章 51单片机基础实例 ... 交通灯控制器实...
  • 51单片机 - - 简介

    2018-07-21 17:11:14
    产品公司: Intel(英特尔)的:80C31、80C51、87C51,80C32、80C52、87C52等; *ATMEL(艾德梅尔)的:89C51、89C52、89C2051,89S51(RC),89S52(RC)等;...STC(国产宏晶)单片机:89c51、89c52、89c51...
  • 甘学长工作室-单片机protues仿真(毕业设计,课程设计,实训,毕业设计承接) 甘学长工作室-单片机protues仿真(毕业设计,课程设计,实训,毕业设计承接) 甘学长工作室-单片机protues仿真(毕业设计,课程设计,实...
  • 关键词:单片机;LED点阵;数字时钟 1 1.电路设计的目的、任务、指标指标及工艺要求 2 1.1 课程设计的目的 2 1.2 课程设计的任务 2 1.3 课程设计的指标 3 1.4课程设计的工艺要求 3 2设计方案分析: 3 3.各部分器件...
  • 在初学51单片机的时候,总是伴随很多有关与晶振的问题,其实晶振就是如同人的心脏,是血液的是脉搏,把单片机的晶振问题搞明白了,51单片机的其他问题迎刃而解…… 有关51单片机有关晶振的问题一并总结出来,希望对...
  • 51单片机晶振的21个问题 (来自http://news.eeworld.com.cn/mcu/2014/1023/article_16713.html)
1 2 3 4 5
收藏数 84
精华内容 33