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

📄 liheqi.c

📁 该程序为电子离合器的程序,可以实现有无按纽信号或者刹车信号等判断
💻 C
字号:
//离合器
//date 2006/03/25
#include <REG51F.H>

sfr CKCON=0x8f;

sbit QIAN=P0^0;
sbit HOU =P0^1;

sbit SHACHE=P0^2;
sbit KEY   =P0^3;

sbit LEDLI=P0^4;
sbit LEDHE=P0^5;

sbit LIN1=P1^6;
sbit HIN1=P1^3;

sbit LIN2=P1^7;
sbit HIN2=P1^4;

sbit DAOCHE=P2^0;

unsigned char jishu,number,zankongbi,s_time,aa_time,bb_time,cc_time,kuai,man,ji_time,qidong,fan_zhuan,tiaochu;
unsigned int Zhuan1,Che1;
unsigned int Zhuan,Che;
unsigned int cha,checha;
unsigned int jiajia;
int zankong;

void Int0() interrupt 0	using 0						//转速计数
	{ 
	  EA=0;
	  Zhuan1++;
      EA=1;
	}

void Int1() interrupt 2	using 2						//车速计数
	{ 
	  EA=0;
	  Che1++;
	  EA=1;
	}

void T0_int() interrupt 1 using 1
{
 EA=0;
 TR0=0;
 TH0=0xFE; TL0=0x6F;  //400us
 TR0=1;

  jiajia++;
 if(jiajia>=1000)
  jiajia=1000;

 zankong=7-(jiajia*(7-zankongbi)/1000);

  number++;
 if(number<=zankong)
 {
   HIN1=1;
   HIN2=0;
 }
 else
 {
   HIN1=0;
   HIN2=1;
  if(number>=10)
  number=0;
  }

 EA=1;  
}

void T1_int() interrupt 3 using 3
{
 EA=0;
 TR1=0;
 TH1=0x3C; TL1=0xB0; //50ms
 TR1=1;
 
  if(qidong==1)
  {
    s_time++;
    if(s_time>=(aa_time+bb_time))
     s_time=0;
   }
    jishu++;
    if(jishu>=10)
	{
        Zhuan=Zhuan1;
        Che=Che1;
        Zhuan1=0;
        Che1=0;
        jishu=0;
	 }
  
  EA=1;  
}

//--------------------------------------------------------------------------------
// The delay C function  needs about 0.5 ms time 
// time(us) =(i-1)* (165*6 + 2 +10)条指令  * 6 (时钟模式)/6M(晶振)
//  i=1 time =0.003ms;  i=2 time=1ms  i=3 time=2ms   i=4 time=3ms.......
//--------------------------------------------------------------------------------
void delay(unsigned int i)
{
    unsigned char j;
    while(--i)
    {
        j=165;
        while(--j);
    }
}

void Fenli()
{       
          TR0=0;
          LIN1=0;
		  HIN1=1;
		  LIN2=0;
		  HIN2=0;
          delay(101);
       if(HOU)
       {
          LIN1=1;
		  HIN1=1;
		  LIN2=0;
		  HIN2=0;
       }
        delay(51);
          LIN1=0;
		  HIN1=1;
		  LIN2=0;
		  HIN2=1;
        delay(51);
        while(HOU)
	    {
		  LIN1=1;
		  HIN1=1;
		  LIN2=0;
		  HIN2=0;
		}
		  LIN1=0;
		  HIN1=0;
		  LIN2=0;
		  HIN2=0;
          
          LEDLI=1;
          LEDHE=0;

		  delay(301);
          tiaochu=0;
}

void jiehe()
{  
   unsigned char xx;
   if((s_time==0)&&(fan_zhuan==1))
   {
    ji_time++;
	fan_zhuan=0;
   }
   if(s_time==1)
    fan_zhuan=1;

   if((ji_time<=kuai)||(ji_time>(kuai+man)))
    xx=aa_time;
   else
    xx=cc_time;

    if(s_time<xx)
    {
      TR0=1;
      LIN1=0;  LIN2=1; 
    }
    else
    {    
      TR0=0;
      LIN1=0;
	  HIN1=1;
	  LIN2=0;
	  HIN2=1;
    }
   
}
main()
{     
      AUXR=0x01;
      P0=0x0F;
      P2=0xFF;
	  CKCON=0x01; //时钟控制  为6时钟
  
      TMOD=0x01;//定时器模式1
      TH0=0xFE;   TL0=0x6F;  
      ET0=1;  //定时器中断允许
      TR0=0; 
	  
      TMOD=0x11;//定时器1用于16位定时器
   	  TH1=0x3C; TL1=0xB0; //50ms 
      ET1=1;
      TR1=1;  

	  IT0=1;                                 
	  IT1=1;
      EX0=1;									//外部中断0使能
	  EX1=1;									//外部中断1使能

      jishu=0;
      number=0;

	  Zhuan1=0;
	  Che1=0;
      Zhuan=0;
	  Che=0;

      jiajia=0;
      zankongbi=0;

      aa_time=0;
      bb_time=0;
      s_time=0;

	  qidong=0;

      tiaochu=0;

       EA=1;
 
        delay(601);

	  	  while(1)
		  {
             
	         if((KEY)||(SHACHE))
             { 
                    delay(21);//去抖 20ms
                 if((KEY)||((SHACHE)&&(Che<14)))
                 {
				    if(((HOU)&&(!QIAN))||(Che<4)||(DAOCHE))
                    {                     
                       Fenli();//有按纽信号或者刹车信号 分离
                    }
                                     
                  }
				
		     }
             else
             { 			    
                 delay(21);//去抖 20ms
              if((!KEY)&&(!SHACHE))
              { 

			  	if(QIAN)//无前位信号
				{   delay(6);
                  if(QIAN)//无前位信号
				  { 
			         qidong=1;
				     jiajia=0; 
                     s_time=0;
                     ji_time=0;
                     fan_zhuan=1;

                     if((Che<4)||(DAOCHE))   
		             {
                       while(QIAN)
	                   { 
                         if((KEY)||(SHACHE))
                          break;

						 if(DAOCHE)
						 {
                            aa_time=3;  bb_time=8; kuai=3; cc_time=1; man=9; zankongbi=7;
                            if(tiaochu==0)
                              jiehe();  
                         }
						 else
						 {
  						    cha=Zhuan/5;
						    if(cha>7) cha=7; 

						    switch(cha)
	                        {   
						      case 0:	aa_time=3;  bb_time=8; kuai=2; cc_time=1; man=9; zankongbi=7;    break;
							  case 1:	aa_time=3;  bb_time=8; kuai=2; cc_time=1; man=9; zankongbi=7;    break;
							  case 2:	aa_time=3;  bb_time=8; kuai=2; cc_time=1; man=9; zankongbi=7;    break;
							  case 3:	aa_time=4;  bb_time=8; kuai=3; cc_time=2; man=9; zankongbi=7;    break;
							  case 4:	aa_time=5;  bb_time=8; kuai=3; cc_time=3; man=9; zankongbi=7;    break;
							  case 5:	aa_time=6;  bb_time=8; kuai=3; cc_time=5; man=9; zankongbi=7;    break;
		                      case 6:	aa_time=7;  bb_time=8; kuai=3; cc_time=6; man=9; zankongbi=7;    break;
							  case 7:	aa_time=8;  bb_time=8; kuai=3; cc_time=7; man=9; zankongbi=7;    break;
	                        }//结束分支程序 
                            jiehe(); 
						  }
                        

                         if((DAOCHE)&&(ji_time>kuai))
                         {
                          tiaochu=1;
						  break;
                         }
                        }//while
                     }//che<4
		             else//che>=4
                     {
                       while(QIAN)
	                   {
   					       checha=Che/7;
						   if(checha>6) checha=6;

						    switch(checha)
	                        {
                              case 0:	aa_time=3;  bb_time=8; kuai=2; cc_time=1; man=4; zankongbi=7;    break;
							  case 1:	aa_time=3;  bb_time=8; kuai=2; cc_time=1; man=4; zankongbi=6;    break;
							  case 2:	aa_time=4;  bb_time=8; kuai=2; cc_time=1; man=4; zankongbi=5;    break;
							  case 3:	aa_time=5;  bb_time=8; kuai=3; cc_time=2; man=4; zankongbi=4;    break;
							  case 4:	aa_time=6;  bb_time=6; kuai=3; cc_time=3; man=4; zankongbi=5;    break;
							  case 5:	aa_time=7;  bb_time=6; kuai=3; cc_time=4; man=4; zankongbi=4;    break;
		                      case 6:	aa_time=8;  bb_time=4; kuai=3; cc_time=5; man=4; zankongbi=3;    break;
							}//结束分支程序
                           
							jiehe(); 

                        }//while
                      }//che>=4

                      TR0=0;
		              LIN1=0;
		              HIN1=0;
		              LIN2=0;
		              HIN2=0;
                      delay(201);
		              LIN1=0;
		              HIN1=1;
		              LIN2=0;
		              HIN2=1;
                       
	  				}//结束无前位信号程序
			        else 
					{//有前位信号
					   TR0=0;
                       delay(3);
					   LIN1=0;
			           HIN1=1;
					   LIN2=0;
			           HIN2=1;
                       LEDLI=0;
                       LEDHE=1;
					   jiajia=0;
					   qidong=0;
					}
				}
               }	
			 }//结束无按纽程序
	       
		  }//主while

}

⌨️ 快捷键说明

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