⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 触摸式人行灯控制器.c

📁 触摸式人行灯控制器源程序, 这个程序已经在路口正常使用
💻 C
📖 第 1 页 / 共 3 页
字号:
#include<AT89X52.H>
#define uchar unsigned char
#define uint  unsigned int

uchar  mn[4];
uchar  dd[26];
uchar  cnt=130,e=0x00;
uint   a,b,c,d,sx=0,i;
uint   t1=0,bz=1,bz1=1,bz3=0,bz4=0,bz5=0;
uchar  run_fs,cm_1,cm_2,cm_max;
uchar  yellow,blue_s,red_all,yellow_s;
uchar  rx,fj;
uchar  second=0,hour=0;

uchar   sd1,sds1,sdg1;
uchar   sd2,sds2,sdg2;
uchar   sd3,sds3,sdg3;
uchar   sd4,sds4,sdg4;
uchar   sd5,sds5,sdg5;

uchar code DB[]={0X3f,0X06,0X5b,0X4f,0X66,0X6d,0X7d,0X07,0X7f,0X6f,0X76,0X40,0X71,0X6D};
uchar code DB1[]={0X00,0X40,0X20,0X10,0X08,0X04,0X02,0X01};
uchar   cc1302[]={0x14,0x17,0x12,0x12,0x12,0x07,0x12};
uchar   read1302[]={0x13,0x13,0x13,0x13,0x13,0x03,0x13};
//-----------------
sbit  ACC0=ACC^0;
sbit   ACC7=ACC ^7;
sbit   t_clk=P1^5;
sbit   t_io=P1^6;
sbit   t_rst=P1^7;
//-----------------
void  sm();                           //扫描
void  cs();                           //确定初始
void  yx();                           //触摸
void  yx1();                          //两相位
void  fs();                           //发送
void delay(uint time);                //延时
//--------------------------
      r_bit();                        //读一个字节
void  w_bit(uchar write);             //写一个字节   
void  w1302(uchar ucaddr,uchar ucda); //写地址/写数据
      r1302(uchar  ucaddr);           //写地址/读数据
void  set1302(uchar *pclock);         //初始1302
void  get1302();                      //读1302时,分,秒
void  bitw1302r(uchar  *pwreg);       //写寄存器
void  bitr1302r(uchar  *prreg);       //读寄存器
//######################################################################
void main(void)
    { 
      TMOD=0x21;
      TH0=0Xf4;
      TL0=0x48;
      IE=0x83;
      IP=0X02;
      TR0=1;
      
      TH1=0Xfa;
      TL1=0xfa;
      TR1=1;
      SCON=0X50;

	  P1_0=0;
	  P1_1=0;
      
//------------------------
      bitr1302r(dd);
      if(dd[0]!=0x66)
      { 
        dd[0]=0x66;
        dd[1]=run_fs=1;         //运行方式
        dd[2]=cm_1=22;          //一次触摸人行的绿灯时间
        dd[3]=cm_2=33;          //非机的最小通行时间
        dd[4]=cm_max=60;        //人行的最大通行时间
        dd[5]=yellow=3;         //黄灯时间
        dd[6]=blue_s=4;         //绿闪时间
        dd[7]=red_all=5;        //全红时间
        dd[8]=yellow_s=6;       //黄灯频率
        dd[9]=rx=20;            //两相位人行时间
        dd[10]=fj=30;           //两相位非机时间

        dd[11]=sd1=1;
        dd[12]=sd2=1;
        dd[13]=sd3=1;
        dd[14]=sd4=1;
        dd[15]=sd5=1;
        dd[16]=sds1=0x30;
        dd[17]=sds2=0x35;
        dd[18]=sds3=0x40;
        dd[19]=sds4=0x45;
        dd[20]=sds5=0x50;
        dd[21]=sdg1=0x06;
        dd[22]=sdg2=0x07;
        dd[23]=sdg3=0x08;
        dd[24]=sdg4=0x09;
        dd[25]=sdg5=0x10;

        bitw1302r(dd);
        set1302(cc1302);
      }
      else if(dd[0]==0x66)
      {
        run_fs=dd[1];        //运行方式
        cm_1=dd[2];          //一次触摸人行的绿灯时间
        cm_2=dd[3];          //非机的最小通行时间
        cm_max=dd[4];        //人行的最大通行时间
        yellow=dd[5];        //黄灯时间
        blue_s=dd[6];        //绿闪时间
        red_all=dd[7];       //全红时间
        yellow_s=dd[8];      //黄灯频率
        rx=dd[9];            //两相位人行时间
        fj=dd[10];           //两相位非机时间

        sd1=dd[11];
        sd2=dd[12];
        sd3=dd[13];
        sd4=dd[14];
        sd5=dd[15];
        sds1=dd[16];
        sds2=dd[17];
        sds3=dd[18];
        sds4=dd[19];
        sds5=dd[20];
        sdg1=dd[21];
        sdg2=dd[22];
        sdg3=dd[23];
        sdg4=dd[24];
        sdg5=dd[25];
      }
//--------------------
      
      get1302();
    
      a=DB[read1302[2]/0x10];
      b=DB[read1302[2]%0x10];
      c=DB[read1302[1]/0x10];
      d=DB[read1302[1]%0x10];
//------------------------

  while(1)
  {
    switch(run_fs)
     {
	   case  1:P2=P2&0x07|0x88;
              delay(60);
				  if(bz3==88)
				   {
					 yx();
					 bz3=0;

				   }
					else if(bz3!=88)
					{if(t1==0)
                      {  if(bz4==0x00)
                         {  get1302();
                            a=DB[read1302[2]/0x10];
                            b=DB[read1302[2]%0x10];
                            c=DB[read1302[1]/0x10];
                            d=DB[read1302[1]%0x10];
                      //-------------      
                        if(((read1302[2]*0x60+read1302[1])>=(sdg1*0x60+sds1))&&((read1302[2]*0x60+read1302[1])<(sdg2*0x60+sds2)))
                           run_fs=sd1;
                      else if(((read1302[2]*0x60+read1302[1])>=(sdg2*0x60+sds2))&&((read1302[2]*0x60+read1302[1])<(sdg3*0x60+sds3)))
                           run_fs=sd2;
                      else if(((read1302[2]*0x60+read1302[1])>=(sdg3*0x60+sds3))&&((read1302[2]*0x60+read1302[1])<(sdg4*0x60+sds4)))
                           run_fs=sd3;
                      else if(((read1302[2]*0x60+read1302[1])>=(sdg4*0x60+sds4))&&((read1302[2]*0x60+read1302[1])<(sdg5*0x60+sds5)))
                           run_fs=sd4;
                      else run_fs=sd5;
                         }
						        
								 else if(bz4==0x88)
								 {  bz4=0x00;
                            w1302(0x8e,0x00);
                            w1302(0x80,0x57);
                            w1302(0x82,second);
                            w1302(0x84,hour);
                            w1302(0x8e,0x80);
								 }
								 else if(bz4==0x99)
								 {
								  bz4=0x00;
								  //dd[0]=0x88;
                          dd[1]=run_fs;        //运行方式
                          dd[2]=cm_1;          //一次触摸人行的绿灯时间
                          dd[3]=cm_2;          //非机的最小通行时间
                          dd[4]=cm_max;        //人行的最大通行时间
                          dd[5]=yellow;        //黄灯时间
                          dd[6]=blue_s;        //绿闪时间
                          dd[7]=red_all;       //全红时间
                          dd[8]=yellow_s;      //黄灯频率
                          dd[9]=rx;            //两相位人行时间
                          dd[10]=fj;           //两相位非机时间
                          dd[11]=sd1;
                          dd[12]=sd2;
                          dd[13]=sd3;
                          dd[14]=sd4;
                          dd[15]=sd5;
                          dd[16]=sds1;
                          dd[17]=sds2;
                          dd[18]=sds3;
                          dd[19]=sds4;
                          dd[20]=sds5;
                          dd[21]=sdg1;
                          dd[22]=sdg2;
                          dd[23]=sdg3;
                          dd[24]=sdg4;
                          dd[25]=sdg5;
                          bitw1302r(dd);
								 }
							}
					 }

              break;
	   case  2:P2=P2&0x07|0x10;
		         delay(40+yellow_s*2);
               P2=P2&0x07;
               delay(40+yellow_s*2);
					if(bz3==88)
				   {
					 yx();
					 bz3=0;

				   }
					else if(bz3!=88)
					{if(t1==0)
                      {  if(bz4==0x00)
                         {  get1302();
                            a=DB[read1302[2]/0x10];
                            b=DB[read1302[2]%0x10];
                            c=DB[read1302[1]/0x10];
                            d=DB[read1302[1]%0x10];
						//-----------
                           if(((read1302[2]*0x60+read1302[1])>=(sdg1*0x60+sds1))&&((read1302[2]*0x60+read1302[1])<(sdg2*0x60+sds2)))
                           run_fs=sd1;
                      else if(((read1302[2]*0x60+read1302[1])>=(sdg2*0x60+sds2))&&((read1302[2]*0x60+read1302[1])<(sdg3*0x60+sds3)))
                           run_fs=sd2;
                      else if(((read1302[2]*0x60+read1302[1])>=(sdg3*0x60+sds3))&&((read1302[2]*0x60+read1302[1])<(sdg4*0x60+sds4)))
                           run_fs=sd3;
                      else if(((read1302[2]*0x60+read1302[1])>=(sdg4*0x60+sds4))&&((read1302[2]*0x60+read1302[1])<(sdg5*0x60+sds5)))
                           run_fs=sd4;
                      else run_fs=sd5;


								 }
								 else if(bz4==0x88)
								 {  bz4=0x00;
                            w1302(0x8e,0x00);
                            w1302(0x80,0x57);
                            w1302(0x82,second);
                            w1302(0x84,hour);
                            w1302(0x8e,0x80);
								 }
								 else if(bz4==0x99)
								 {
								   bz4=0x00;
								  //dd[0]=0x88;
                          dd[1]=run_fs;        //运行方式
                          dd[2]=cm_1;          //一次触摸人行的绿灯时间
                          dd[3]=cm_2;          //非机的最小通行时间
                          dd[4]=cm_max;        //人行的最大通行时间
                          dd[5]=yellow;        //黄灯时间
                          dd[6]=blue_s;        //绿闪时间
                          dd[7]=red_all;       //全红时间
                          dd[8]=yellow_s;      //黄灯频率
                          dd[9]=rx;            //两相位人行时间
                          dd[10]=fj;           //两相位非机时间
                          dd[11]=sd1;
                          dd[12]=sd2;
                          dd[13]=sd3;
                          dd[14]=sd4;
                          dd[15]=sd5;
                          dd[16]=sds1;
                          dd[17]=sds2;
                          dd[18]=sds3;
                          dd[19]=sds4;
                          dd[20]=sds5;
                          dd[21]=sdg1;
                          dd[22]=sdg2;
                          dd[23]=sdg3;
                          dd[24]=sdg4;
                          dd[25]=sdg5;
                          bitw1302r(dd);
								 }
                    }
					 }
               break;

		case  3:  yx1();
               
               break;
		case  4: P2=P2&0x07;
		         delay(40);
					if(bz3==88)
				   {
					 yx();
					 bz3=0;

				   }
					else if(bz3!=88)
					{if(t1==0)
                      {  if(bz4==0x00)
                         {  get1302();
                            a=DB[read1302[2]/0x10];
                            b=DB[read1302[2]%0x10];
                            c=DB[read1302[1]/0x10];
                            d=DB[read1302[1]%0x10];
						//-----------
                           if(((read1302[2]*0x60+read1302[1])>=(sdg1*0x60+sds1))&&((read1302[2]*0x60+read1302[1])<(sdg2*0x60+sds2)))
                           run_fs=sd1;
                      else if(((read1302[2]*0x60+read1302[1])>=(sdg2*0x60+sds2))&&((read1302[2]*0x60+read1302[1])<(sdg3*0x60+sds3)))
                           run_fs=sd2;
                      else if(((read1302[2]*0x60+read1302[1])>=(sdg3*0x60+sds3))&&((read1302[2]*0x60+read1302[1])<(sdg4*0x60+sds4)))
                           run_fs=sd3;
                      else if(((read1302[2]*0x60+read1302[1])>=(sdg4*0x60+sds4))&&((read1302[2]*0x60+read1302[1])<(sdg5*0x60+sds5)))
                           run_fs=sd4;
                      else run_fs=sd5;


								 }
								 else if(bz4==0x88)
								 {  bz4=0x00;
                            w1302(0x8e,0x00);
                            w1302(0x80,0x57);
                            w1302(0x82,second);
                            w1302(0x84,hour);
                            w1302(0x8e,0x80);
								 }
								 else if(bz4==0x99)
								 {
								   bz4=0x00;
								  //dd[0]=0x88;
                          dd[1]=run_fs;        //运行方式
                          dd[2]=cm_1;          //一次触摸人行的绿灯时间
                          dd[3]=cm_2;          //非机的最小通行时间
                          dd[4]=cm_max;        //人行的最大通行时间
                          dd[5]=yellow;        //黄灯时间
                          dd[6]=blue_s;        //绿闪时间
                          dd[7]=red_all;       //全红时间
                          dd[8]=yellow_s;      //黄灯频率
                          dd[9]=rx;            //两相位人行时间
                          dd[10]=fj;           //两相位非机时间
                          dd[11]=sd1;
                          dd[12]=sd2;
                          dd[13]=sd3;
                          dd[14]=sd4;
                          dd[15]=sd5;
                          dd[16]=sds1;
                          dd[17]=sds2;
                          dd[18]=sds3;
                          dd[19]=sds4;
                          dd[20]=sds5;
                          dd[21]=sdg1;
                          dd[22]=sdg2;
                          dd[23]=sdg3;
                          dd[24]=sdg4;
                          dd[25]=sdg5;
                          bitw1302r(dd);
								 }
                    }
					 }
               break;

	  }
   }   
}
//------------
void yx()
{ uchar x1,by;
  
  for(x1=blue_s,by=blue_s+yellow;x1>0;x1--,by--)       //绿闪
          { 
            mn[0]=0xfa;
            mn[1]=0x13;
            mn[2]=x1;
            mn[3]=by;
            fs();

			   if(t1==0)
			   { a=DB[x1/10];
			     b=DB[x1%10];
              c=DB[by/10];
				  d=DB[by%10];
            }
			   P2=P2&0x07|0x88;
		      delay(60);
            P2=P2&0x07|0x80;
		      delay(60);
          }

//------------                                 //非机黄,人行红
    for(x1=yellow;x1>0;x1--,by--)
          { 
            mn[0]=0xfa;
            mn[1]=0x23;
            mn[2]=x1;
            mn[3]=by;
            fs();
			 if(t1==0)
			   {a=DB[x1/10];
				 b=DB[x1%10];
             c=DB[by/10];
				 d=DB[by%10];
            }
			   P2=P2&0x07|0x90;
		      delay(120);
            
          }
//------------                                 //非机红,人行绿                                 
        for(x1=cm_1,by=cm_1+red_all;x1>0;x1--,by--)
          { mn[0]=0xfa;
            mn[1]=0x31;
            mn[2]=by;
            mn[3]=x1;
            fs();
			   if(t1==0)
			   {
				 a=DB[by/10];
				 b=DB[by%10];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -