交通灯控制器program

#include<reg52.h>
#include<absacc.h>
#define PA  XBYTE[0XD1FF]
#define PB  XBYTE[0XD2FF]
#define PC  XBYTE[0XD5FF]
#define CON XBYTE[0XD7FF]
#define uchar unsigned char
#define uint unsigned int


uchar count1,count2,count3,f1;

uchar smg[]={0xdf,0xef};
uchar smg1[]={0xf7,0xfb};
uchar table1[]={0x28,0x20,0xb8,0x24,0x2c,0x39,0x2a,0x62,0xbb,0xa0};
uchar table2[]={0xbb,0xa0};


void delay()
{
   uint m=100;
   while(m--);
}

void delay1(uchar n)
{
   while(n--);
}

//此函数扫描是否有进入特殊状态10s的键按下
uchar saomiao()
{
   uchar key;
   PC=0X10;
   delay1(10);
   key=PC;
   if(key!=0x10)
      return 1;
   else
      return 0;
}

//特殊状态时的10s显示函数
void special()
{
   signed char x=0;
   uchar count4=0;
   while(1)
   {
    P1=0X00;
    PB=0XFF;
    PA=smg[0];
    if(count1==20)
    {
      count1=0;
   count4++;
   if(count4==10)
    break;
   if(x==9)
     x=(-1);
   PB=table1[++x];
  
     }
     else
      PB=table1[x];
 
  PB=0XFF;
  PA=smg[1];
     PB=0xa0;
   }
}

main()
{
  uchar  f,flag;
  signed char i,j;
  f=0;
  i=0;
  j=0;
  count1=0;
  count2=0;
  count3=0;
  flag=1;
  CON=0X81;
  TMOD=0X01;
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256; 
  EA=1;
  ET0=1;
  TR0=1;
  while(1)
  {
     f1=saomiao();
  if(f1)
   {
    special();
    f=0;
       i=0;
       j=0;
       count1=0;
       count2=0;
       count3=0;
       flag=1;
      }
  //以下else的大括号中是交通灯正常运行时代码
  else
  {
  //东西方向通行
   if(flag)     //flag为1时东西方向通行20s
   {
     if(count2<=14)
       P1=0X66;
     else
     {
        if(count1%2==0)
       {
      f=~f;
      if(f)
        P1=0XFF;
      else
        P1=0X66;
     
    }

     }

     PB=0XFF;
     PA=smg[0];
     if(count1==20)
     {
       count1=0;
    count2++;
    if(count2==20)
    {
      count2=0;
      flag=0;     //20s后改变flag的值,以使进入南北方向通行的20s
    }
    count3++;
   
    if(i==9)
      i=(-1);
    PB=table1[++i];
   
         }
      else
       PB=table1[i];
  
   PB=0XFF;
   PA=smg[1];
   if(count3==10)
   {
     count3=0;
     if(j==1)
       j=(-1);
     PB=table2[++j];
   }
   else
     PB=table2[j];
 
  
   }
 
  //南北方向通行
   else
   {
     if(count2<=14)
       P1=0X99;
     else
     {
       if(count1%2==0)
   {
     f=~f;
     if(f)
       P1=0XFF;
     else
       P1=0X99;
    
    }
    
     }

     PB=0XFF;
     PA=smg1[0];
     if(count1==20)
     {
       count1=0;
    count2++;
    if(count2==20)
    {
      count2=0;
      flag=1;           //20s后改变flag的值,以使进入东西方向通行的20s                          
    }
    count3++;
  
    if(i==9)
      i=(-1);
    PB=table1[++i];
   
         }
      else
       PB=table1[i];
  
   PB=0XFF;
   PA=smg1[1];
   if(count3==10)
   {
     count3=0;
     if(j==1)
       j=(-1);
     PB=table2[++j];
   }
   else
     PB=table2[j];
 
   }
   }
  }
 
}

void timer0() interrupt 1
{
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
  count1++;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值