单片机
返回首页

AT89S52交通灯程序

2016-10-20 来源:eefocus

课程设计题目:交通灯   

课程设计任务:利用单片机的定时器定时,令十字路口的红绿灯交替点亮和熄灭,并且用LED数码管显示时间。

要求:(1)能够调节定时时间:(2)能够实现全红灯的禁止通行状态和全绿灯的任意通行状态。

#include'reg51.h'
#define uchar unsigned char
   sbit key4= P3^3;
   sbit key1= P3^0;
   sbit key2= P3^1;
   sbit key3= P3^2;
  uchar  flag=1;  
uchar display_code[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
uchar time[]={0,0,0,0};
uchar time1[]={30,30};
void delay(int n)  //延时
 {
  while(n--);
 }
void display()      //显示
{
  uchar i,k;
  k=0x80;
  for(i=0;i<4;i++)
     {
      P2=0;
      P0=display_code[time[i]/10];
      P2=k;
      k=k>>1;
      delay(50);

      P2=0;
      P0=display_code[time[i]%10];
      P2=k;
      k=k>>1;
      delay(50);
     }
   P2=0;
}

void display1()    //time1[0]  显示
{
  uchar i,k;
  k=0x80;
  for(i=0;i<4;i++)
     {
      P2=0;
      P0=display_code[time1[0]/10];
      P2=k;
      k=k>>1;
     //delay(50);

      P2=0;
      P0=display_code[time1[0]%10];
      P2=k;
      k=k>>1;
     //delay(50);
     }
   P2=0;
}
void display2()   ///time1[1]  显示
{
  uchar i,k;
  k=0x80;
  for(i=0;i<4;i++)
     {
      P2=0;
      P0=display_code[time1[1]/10];
      P2=k;
      k=k>>1;
     // delay(50);

      P2=0;
      P0=display_code[time1[1]%10];
      P2=k;
      k=k>>1;
     // delay(50);
     }
   P2=0;
}
////////////////////////////////////////////////////////////////////////////////
void calc()   // 计算
 {
  uchar j;
  
  for(time[3]=time1[0];time[3]>0;time[3]--)
   {
    if(time[3]>3)
     {
       P1=0xF1;
     }
    if(time[3]<4)
     {
       P1=0x5F;
     }
   for(j=0;j<250;j++)
     {
      //display();
         key3=1;
         if(key3==0)
         {
           delay(100);
         
          
            while(key3==0)
             { 
              display1();
                key1=1;
              if(key1==0)
                { 
                delay(100);
              
              
                if(key1==0)
                  {
                  time1[0]++;
                  if(time1[0]>99)
                     time1[0]=0;
                  while(key1==0);
                  }
                 }
               
           
///////////////////////
                    
               key2=1;
             if(key2==0)
             { 
              delay(100);
           
             if(key2==0)
              {
                if(time1[0]==0)time1[0]=99;
                else 
                time1[0]--;
                 while(key2==0);
                }
               }
             }    // while
           }///// 1 i
        
       display();
     }
   }
///////////////////
  if(time[3]==0)
   {
    for(time[2]=time1[1];time[2]>0;time[2]--)
     {
      if(time[2]>3)
       {
        P1=0x7F;
       }
      if(time[2]<4)
       {
         P1=0x5F;
       }
  
    for(j=0;j<250;j++)  //for
     {
     //display();
         key3=1;
         if(key3==0)
         {
           delay(100);
         
          
            while(key3==0)
             { 
              display2();
                key1=1;
              if(key1==0)
                { 
                delay(100);
              
              
                if(key1==0)
                  {
                  time1[1]++;
                  if(time1[1]>99)
                     time1[1]=0;
                  while(key1==0);
                  }
                 }
               
           
///////////////////////
                    
               key2=1;
             if(key2==0)
             { 
              delay(100);
           
             if(key2==0)
              {
                if(time1[1]==0)time1[1]=99;
                else 
                time1[1]--;
                 while(key2==0);
                }
               }
             }    
           }
        
      display();
      }
     }
    }
}
void light()

 P2=0x00;//数码管全亮
 P1=0xF1;//全红灯
}
 
void light1()

 P2=0x00;//数码管全亮
 P1=0x5F;//全绿灯
}   
 
  
 

void main()    
  {
  IT0=1; //外部中断0
  ET0=1;
  EX0=1;
  TR0=1;
  EA=1;
 //flag=1;
   while(1)
    {
     switch(flag)
    {
     case 1: calc();break;
     case 2: light();break;
     case 3: light1();break;
    }
    }
  }
void int0() interrupt 0
{
 delay(10);
 if(key4==0)
  { 
    delay(10);
       if(key4==0)
        {
         flag++;
         if(flag>3)flag=1;  
         }
  } 
}

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • PIC单片机控制的遥控防盗报警器电路

  • 用数字电路CD4069制作的万能遥控轻触开关

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 开关电源的基本组成及工作原理

  • 如何构建一个触摸传感器电路

  • 基于ICL296的大电流开关稳压器电源电路

    相关电子头条文章