找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 832|回复: 0
打印 上一主题 下一主题
收起左侧

交通灯

[复制链接]
跳转到指定楼层
楼主
ID:439620 发表于 2018-12-4 21:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
void display(void);
void delay(unsigned int m);
void InitTimer0(void);       

sbit s1 = P1^0;        //启动按键
sbit s2 = P1^1;        //应急车
sbit s3 = P1^2;        //夜间模式
sbit s4 = P1^3;        //主干道通车时间加1,最大只能加到90秒
sbit s5 = P1^4;        //主干道通车时间减1,最大只能减到3秒
sbit s6 = P1^5;        //次干道通车时间加1,最大只能加到90秒
sbit s7 = P1^6;        //次干道通车时间减1,最大只能加到3秒

sbit r1 = P3^7;        //次绿
sbit h1 = P3^6;        //次黄
sbit g1 = P3^5;        //次红

sbit r2 = P3^4;        //主绿
sbit h2 = P3^3;        //主黄
sbit g2 = P3^2;        //主红

unsigned char code SMG[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF};        //送段码0-9和"-"

unsigned char disp[]={0,6,7,5};
unsigned char disp1[]={10,10,10,10};
unsigned char disp2[]={10,10,10,10};
unsigned char dispw[]={0x01,0x02,0x10,0x20};//位选

unsigned char Num=0,num1=1,a=1;//定时器计数

char g=57,gg=60,c=57,d=27;
          
/*************显示程序**************/
void display(void)                  
{
          unsigned char i;
          for(i=0;i<4;i++)
         {
                P0=SMG[disp[i]];
                P2=dispw[i];
                delay(100);         P0=0xff;P2=0x00;
         }
}

void display1(void)                  
{
          unsigned char i;
          for(i=0;i<4;i++)
         {
                P0=SMG[disp1[i]];
                P2=dispw[i];
                delay(100);        P0=0xff;P2=0x00;
         }
}
  void display2(void)                  
{
          unsigned char i;
          for(i=0;i<4;i++)
         {
                P0=SMG[disp2[i]];
                P2=dispw[i];
                delay(100);           P0=0xff;P2=0x00;
                disp2[0]=d%10;
                disp2[1]=d/10;
                disp2[2]=c%10;
                disp2[3]=c/10;
         }
}

/*************延时程序**************/                                                                                         
void delay(unsigned int m)                 
{
          while(--m);
}

/************定时器初始化****************/

void InitTimer0(void)
{
    TMOD = 0x11;
    TH0 = 0x3C;
    TL0 = 0x0B0;
        TH1 = 0x3C;
    TL1 = 0x0B0;
    EA = 1;
    ET0 = 1;
        ET1 = 1;
    TR0 = 0;
        TR1 = 0;
       
}

/*************定时器0*****************/

void Timer0Interrupt(void) interrupt 1        using 1           // 定时器0中断
{
    TH0 = 0x3C;
    TL0 = 0x0B0;
        Num++;       
        if(Num==10)
                h1=1;  
        if(Num==10)
                h2=1;
        if(Num==20)
        {        Num=0;
                g--;gg--;
                if(g>0)           //主绿 次红
                {
                        r1=1;
                        h1=1;
                        g1=0;
                        r2=0;
                        h2=1;
                        g2=1;
                        disp[2]=g%10;
                        disp[3]=g/10;
                        disp[0]=gg%10;
                        disp[1]=gg/10;                       
                }
                else if(g>-3 && g<=0)  //主黄 次红
                {       
                        r1=1;
                        h1=0;
                        g1=1;
                        r2=0;
                        h2=1;
                        g2=1;
                        disp[2]=(g+3)%10;
                        disp[3]=(g+3)/10;
                        disp[0]=(gg)%10;
                        disp[1]=(gg)/10;
                }
                else if(gg>-d && gg<=0)         //主红 次绿
                {
                        r1=0;
                        h1=1;
                        g1=1;
                        r2=1;
                        h2=1;
                        g2=0;
                    disp[2]=(g+d+6)%10;
                        disp[3]=(g+d+6)/10;       
                        disp[0]=(gg+d)%10;
                        disp[1]=(gg+d)/10;
                       
                                       
                }
                else if(gg>=-(d+3) && g<=-d) //主红 次黄
                {
                        r1=0;
                        h1=1;
                        g1=1;
                        r2=1;
                        h2=0;
                        g2=1;
                        disp[2]=(g+d+6)%10;
                        disp[3]=(g+d+6)/10;
                        disp[0]=(gg+d+3)%10;
                        disp[1]=(gg+d+3)/10;                       
                        if(gg<=-(d+3))
                        {        g=c;gg=c+3;        }                               
                }
        }
}

void Timer0Interrupt1(void) interrupt 3        using 2           //定时器1 中断
  {       
                    TH1 = 0x3C;
            TL1 = 0x0B0;
                num1++;       
                if(num1==10)
                {h1=1;         h2=1;}
                if(num1==20)
                { num1=0;h1=0; h2=0; }
  }          

/*************键扫描程序**************/
unsigned char keyscan()
{
unsigned char tmp;                         //列号,行号
P1=0xff;               //发全行0扫描码
if((P1&0xff)!=0xff)     //若有键按下
  {
   delay(1000);          // 延时去抖   
   if((P1&0xff)!=0xff)          //有键按下
       {
                tmp=(P1&0xff);
            do{}while((P1&0xff)!=0xff);
                tmp=~tmp;
                if (tmp==128)
                return (0);                  
        return (tmp);                         //还回键值
          }                        
  }                                                                                                                       
   return (0);                                //无键按下,还回0
}

/*************主函数***************/
void main()
{          
     unsigned char v;
                 while(1)
                {
                        v=keyscan();
                        if(v==1)
                                break;
                    P2=0x01;
                         P0=0x0c;
                }
         InitTimer0();//定时器初始化
                    
         if(v==1)
           {        
         
                 while(1)
                   {
                       
                      switch (v)
                   {  

                             case 1: P3=0xff; g1=0;r2=0;  TR0=1;TR1=0;
                                         if (a==0)
                                         {g=c;gg=c+3;a=1;}
                                          while (v==1||v==0)
                                          {
                                                display();
                                                v=keyscan();                                                          
                                        }          
                                break;
                           case 2:  
                                            P3=0xff; TR0=0;TR1=0;
                                        while (v==2||v==0)
                                          {       
                                                r1=0;r2=0;
                                            v=keyscan();display1();                                                                 
                                        }
                                           break;
                           case 4:  
                                            P3=0xff; TR0=0; TR1=1;        h1=0;h2=0;
                                        while (v==4||v==0)
                                          {                                                       
                                            v=keyscan();display1();                                                                 
                                        }
                                           break;
                                case 8: TR1=0;
                                   while (v==8||v==0)
                                    {
                                          TR0=0;a=0;       
                                          while (v==8)
                                          {
                                            c++;
                                                if (c>90)
                                                c=90;v=keyscan();display2();       
                                          }
                                          v=keyscan();display2();
                                        }break;
                                case 16: TR1=0;
                                   while (v==16||v==0)
                                    {
                                          TR0=0;a=0;       
                                          while (v==16)
                                          {
                                            c--;
                                                if (c<3)
                                                c=3;v=keyscan();display2();       
                                          }
                                          v=keyscan();display2();
                                        }break;       
                                case 32:  TR1=0;
                                   while (v==32||v==0)
                                    {
                                          TR0=0;a=0;       
                                          while (v==32)
                                          {
                                            d++;
                                                if (d>90)
                                                d=90;v=keyscan();display2();       
                                          }
                                          v=keyscan();display2();
                                        }break;
                                case 64:  TR1=0;
                                   while (v==64||v==0)
                                    {
                                          TR0=0;a=0;       
                                          while (v==64)
                                          {
                                            d--;
                                                if (d<3)
                                                d=3;v=keyscan();display2();       
                                          }
                                          v=keyscan();display2();
                                        }break;                               
                          
                   }
                  
                   }
         }
}

交通灯.rar

85.42 KB, 下载次数: 7, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表