标题: 模拟现实生活中十字路口的单片机交通灯仿真 [打印本页]

作者: 151615111    时间: 2018-10-10 08:31
标题: 模拟现实生活中十字路口的单片机交通灯仿真
模拟现实生活中十字路口的交通灯
源代码:
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
        uchar temp,aa,nn;
        sbit rn=P2^0;                                
        sbit nb=P2^1;
        sbit gn=P2^2;
        sbit rw=P2^3;
        sbit dx=P2^4;
        sbit gw=P2^5;
        sbit shi=P3^6;
        sbit ge=P3^7;                            /*对要使用的单片机各个口进行定义*/
        bit flag=0;

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

        void delay(uint z);
        void disp(uint n);
        void nb_flash(void);
        void dx_flash(void);
        void  xint0();
        void timer0();
        void  LED_ON();
        void  xint1();
        void  LED_OFF();
        void nanbei();
        void dongxi();                 /*将所使用的子函数定义*/

        void main()
        {
                uint num;
                num=0;
                aa=0;
                TMOD=0x01;
                TH0=(65536-50000)/256;
                TL0=(65536-50000)%256;
                EA=1;
                ET0=1;
                TR0=1;
                EX0=1;
                IT0=0;
                EX1=1;
                IT1=1;                       /*中断初始化*/
                while(1)
                {
                        nanbei();        
                        nb_flash();
                        dongxi();
                        dx_flash();                /*主函数中显示部分*/
        }
        }

        void delay(uint z)                    /*延时子函数*/
        {
                uint x,y;
                for(x=z;x>0;x--)
                        for(y=110;y>0;y--);
        }

        void timer0() interrupt 1             /*定时器初始化*/
        {
                TH0=(65536-50000)/256;
                TL0=(65536-50000)%256;
                aa++;
                if(aa==18)
                {
                        aa=0;
                        flag=1;
                }        
        }
        void disp(uint n)                    /*显示子函数*/
        {
          while(!flag)
          {
                  ge=0;
                  P0=table[n%10];
                  delay(50);
                  shi=1;ge=1;
                  shi=0;
                  P0=table[n/10];
                  delay(50);
                  shi=1;ge=1;
           }
          if(flag==1)
             flag=0;
        }
        void nanbei()                    /*南北方向的红绿灯和数码管显示子函数*/
        {                uint num;
                        num=60;
                        disp(num);
                        while(num<=60&&num>0)
                        {         num--;
                             P2=0xde;
                                    disp(num);                        
                        }
        }
        void dongxi()                     /*东西方向的红绿灯和数码管显示子函数*/
        {                uint num;                        
                         num=60;
                        while(num<=60&&num>0)
                        {        P2=0xf3;         
                                disp(num);
                                num--;
                        }
        }
        void nb_flash(void)              /*南北方向的黄灯和数码管显示子函数*/
        {
                uint a;
                for(a=3;a>0;a--)
                {        P2=0xdd;
                         nb=1;
                         delay(100);
                        nb=0;
                        disp(a);
                }
        }
        void dx_flash(void)                /*东西方向的黄灯和数码管显示子函数*/
        {
                uint a;
                for(a=3;a>0;a--)
                {         P2=0xeb;
                         dx=1;
                         delay(100);
                         dx=0;
                         disp(a);
                }
        }
        void  xint0()  interrupt 2                     /*中断定义*/
{        
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;        
         LED_ON();        
}
void  LED_ON()                       /*开关控制灯的子函数*/   
{                        uint b;
                        rn=0;
                        rw=0;

篇幅限制,完整代码请参考附件
proteus电路图:

交通.png (59.05 KB, 下载次数: 34)

交通.png

交通灯.zip

48.06 KB, 下载次数: 45, 下载积分: 黑币 -5


作者: 花剑舞    时间: 2019-9-16 15:25
我想问问这个数码管是共阴极的接法吗?
作者: 花剑舞    时间: 2019-9-16 15:32
这个数码管是共阴极的接法吗?
作者: 花剑舞    时间: 2019-9-17 18:52
你好,这个电路没画完整额




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1