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

📄 飞机程序.c

📁 玩具飞机的控制程序 控制方式为红外线 多个ID 互不干拢
💻 C
字号:
//---------------------------------------------------------
//funtion :tx IR cortrol PLANE
//body    :sn8p2501
//date    :2009 02 05
//in/output:
//-------------------------------------
//  P22  UP_SOUND 
//  P23  DOWN_SOUND
//  P24  STOP_SOUND 
//  P21   ID1
//  P20   ID2
//  P11   ID3
//  P13   POWNER
//  P25   LED
//  P54   TX  
//  R0_M    FP10M
//  R0      FP10
//  RX1_M   FP00M
//  RX1     FP00
//  TEST_M  FP12M
//  TEST_R   FP12
#include<sn8p2501B.h>
#define  R0_M    FP24M
#define  R0      FP24
#define  RX1_M   FP23M
#define  RX1     FP23
#define  RX3_M   FP20M
#define  RX3     FP20
#define  RX2_M   FP13M
#define  RX2     FP13
#define  RX4_M   FP00M//FP54//FP00M//微调
#define  RX4     FP00//FP54//FP00
#define  TEST_M  FP12M
#define  TEST_R     FP12
#define  LED        FP21 
#define  ID1        FP54//FP00//FP54
#define  ID2        FP10
#define  GUN_SOUND  FP25
#define  TX         FP22
//#define  KEY1       FP13
#define  POWER      FP11 
/*
//-------------------------------------//
#define   MKBF      
#define   MKBB
//-------------------------------------//
#define   FKBF
#define   FKBM            
#define   FKBB
//-------------------------------------//
#define   FKBF
#define   FKBM            
#define   FKBB    
//--------------------------------------//
*/
bit       F41K; 
bit       MOVFL;
bit       LOWFL1;
bit       HIGHFL;
bit       LOWFL;
bit       BEGINFL;
bit       FIREFL; 
bit       TIMEFL;
bit       TIMEFL1;
bit       BEGINFL1;
unsigned char SOUND_TIME;
unsigned char SOUND_CT;
unsigned char COUNT333;
unsigned char COUNT_ID; 
unsigned char TX_COUNT;
unsigned char  COUNT1;
unsigned char R0_DATA;
unsigned char R1_DATA;
unsigned char R11_DATA;
unsigned char R2_DATA;
unsigned char R3_DATA;
unsigned char R4_DATA;
unsigned char ID;
unsigned char COUNT_LED;
unsigned char COUNT_2_16;
unsigned char R3_M;
unsigned char R2_M;
//===================//
//unsigned char BEGIN_REG;

unsigned char i;
unsigned char j;
unsigned char TEMP;
unsigned char TEMP1;
union 
{
 unsigned long AC;
 unsigned char TEMPA;
 unsigned char TEMPB;
}QWE;

union 
{
 unsigned long AB;
 unsigned char TEMPC;
 unsigned char TEMPD;
}QWE2;

#define   AIREG  QWE.AC
#define   TEMP4  QWE.TEMPA 
#define   TEMP3  QWE.TEMPB
#define   QUREG  QWE2.AB
#define   TEMP2  QWE2.TEMPC 
#define   TEMP5  QWE2.TEMPD 
       
unsigned char OPREG;

//==================//

//---------------初使化-----------------
void init(void)

{  
    P0UR=0X0;
	P0M=0;
	P1M=0X0;//P为输入
    P1UR=0X1;
    P5M=0X0;//TX
    P5UR=0Xff;
	P2M=0Xff;
	P2UR=0X0;
	FGIE=1;  //开总中断
	T0M=0x30; //5*64=320US
	//T0C=0;
    FT0IEN=1;
	FT0ENB=1; 
	LOWFL=0;
	BEGINFL=1;
	BEGINFL1=1;
	MOVFL=0;
    SOUND_CT=0;
    FIREFL=0;
	TX_COUNT=255;	 
}

//---------中断--计数器加一--------------
__interrupt ints (void)
{  if(FTC0IRQ)  //t0中断?
    { 
	   FTC0IRQ=0;  
	   COUNT1++;
	   if(F41K) 
	    TX^=1;
	    //TX=F41K;		  
     }
    if(FT0IRQ)//16.384MS;//2.048
	{
	    FT0IRQ=0;
		T0C=0;
		COUNT_2_16++;
		COUNT_ID++;
	  
//-------------------------
       if(COUNT_2_16==8)
	    {
		COUNT_2_16=0;
		if(TX_COUNT)
		  TX_COUNT--;
		SOUND_TIME++;
		if(FIREFL)
		SOUND_CT++;
		if(SOUND_CT==30)
         GUN_SOUND=0;
		if(SOUND_TIME==7)
		  {
		   SOUND_TIME=0;
	  	 if(SOUND_CT>31u)
           {
		    GUN_SOUND^=1;   
			SOUND_CT=32;
			}     
		   }
		  
      COUNT_ID++;
	  COUNT333++;
	  //if(BEGIN_REG&&BEGINFL)
	  //  BEGIN_REG--;
	  //else
	  //{if(MOVFL==0)
	  //    LED=1;
      // }
	 if(COUNT333>6U)
	 {
	   COUNT333=0;
	    COUNT_LED++;
         if(MOVFL)
		 {
		    if(LOWFL)
		    LED=TIMEFL;
		   else
		     {
			   if(BEGINFL)
                 LED^=1;
				 else
		         LED=0;
               }
			}
           else
		   {
             LED=TIMEFL1;             
			}
	    if(COUNT_LED>3U)
		 {
		   COUNT_LED=0;
		   TIMEFL^=1;   
            TIMEFL1=TIMEFL; 	
		   }
	      else
           if(TIMEFL1==0&&COUNT_LED==1) 
		       TIMEFL1=1;         

       if(POWER)
	  {
	    
		 HIGHFL=0;	
		if(LOWFL1)
		 LOWFL=1;
		 LOWFL1=1;
		 
		}
	   else
	   {
	     LOWFL1=0;
	    if(HIGHFL)
		  LOWFL=0;
		  HIGHFL=1;
          
		 }

       }
      }
	 }
}

void NO_TX(unsigned char time9)
 {
    COUNT1=0; 
     F41K=0;
	 TX=0;
while(COUNT1<time9);
   }

void YES_TX(unsigned char time10)
 {
    COUNT1=0; 
     F41K=1;
	 TX=1;
while(COUNT1<time10);
     F41K=0;
	 TX=0;
   }

//================发送0======================
void  TX_0(void)
{    //COUNT1=0; 
     //F41K=0;
	 //TX=0;
//while(COUNT1<24U);
    NO_TX(24);
     //COUNT1=0;
     //F41K=1;
     //TX=1;
//while(COUNT1<24U);
	 //F41K=0;
	 //TX=0;
	 YES_TX(24);	
}
//============================================

 //================发送1=======================
void  TX_1(void)
{    //COUNT1=0; 
     //F41K=0;
     //TX=0;
//while(COUNT1<47U);
     NO_TX(47);
    //COUNT1=0;
    //F41K=1;
    //TX=1;
//while(COUNT1<24U);
//     F41K=0;
//	 TX=0;
     YES_TX(24);
	 TEMP1++;	
}
//--------------------------------------

 
  void TX_BEGIN(void)
 {
     //COUNT1=0; 
     //F41K=1;
	 //TX=1;
//while(COUNT1<31U);
     YES_TX(31);
     //COUNT1=0;
    // F41K=0;
     //TX=0;
//while(COUNT1<92U);//123
     NO_TX(92);
      //COUNT1=0; 
     // F41K=1;
	 // TX=1;
//while(COUNT1<31U);
     // COUNT1=0;
     // F41K=0;
     // TX=0;
	  YES_TX(31);
  }
  
 
//-------------------------------------------//
void TX_DATA(void)
{
     j=0x80; 
      for(i=0;i<8U;i++)
   { if(TEMP&j)
     TX_1();
     else
     TX_0();
     j=j>>1;
    }
 }
//----------发送数据-------------------------//
 void  DATA_TX(void) 
 {
    
    TEMP1=0;

   if(ID1||ID2)
   {
      FIREFL=0;
	if(ID1&&ID2)
      ID=3;
    else
      if(ID1)
      ID=1;
      else
      ID=2;
   }
   
//=========================//  
  	TC0M=0x64;  //6 4分频1US,5 8分频2US,自动重装
	TC0R=243;
	TC0C=243;     //1us*13=13us//38KHZ
	FTC0IEN=1;
	FTC0ENB=1;
    TX_BEGIN();
    //TEMP=TX_DATA;
	if(BEGINFL)

     {
       R1_DATA=0;
	   R11_DATA=0;
	   R3_DATA=0;
	   FIREFL=0;
	  }
//-----------------------------------//
	  TEMP=ID;
      TEMP<<=6;
	  TEMP+=R1_DATA;
	  TX_DATA();

     
	  TEMP=R11_DATA;
      TEMP<<=3;//2
	  if(FIREFL)
	  TEMP+=0X4;//2
	  if(R3_DATA>7U)
      TEMP+=0X2;//1
	  R3_DATA=R3_DATA&0x7;
	  if(R3_DATA>3U)
       TEMP+=0X1;
	  TX_DATA();
//----------------------
	  TEMP=R3_DATA;
	  TEMP<<=6; 
	  j=0x80; 
      for(i=0;i<2U;i++)
   { if(TEMP&j)
     TX_1();
     else
     TX_0();
     j=j>>1;
    }

	if(TEMP1&0X1)
      TX_1();
     else
      TX_0();
	   
      
    	FTC0IEN=0;
	    FTC0ENB=0;
        COUNT_ID=0;
		F41K=0;
	    TX=0;	
 }
 //=============================================

//-----------------------------------------------
void R2_R4_DEC(void)
{
            TEMP=0;
 	    if(TEMP3&0X1)
		   TEMP=1;    
        TEMP3>>=1;
		TEMP+=TEMP3;
        R1_DATA+=TEMP;
	   if(R11_DATA>TEMP3)
          R11_DATA-=TEMP3;
        else
         R11_DATA=2;

	     if(R1_DATA>63u)
          { 
		   i=R1_DATA-63;
		   R1_DATA=63;		 
           R11_DATA-=i;
		   } 
		   
        
		 
 }
 //============================================
 unsigned char DSP_DATA(void)
{
   
      QUREG=0;
    for(i=0;i<8u;i++)
	{
	  if(OPREG&0X80)
	    QUREG+=TEMP;
		if(i!=7)
	    QUREG<<=1;
		OPREG<<=1;
	  }
     AIREG=0;
  for(i=0;i<16U;i++)
 {
   AIREG<<=1;
   QUREG<<=1;
   if(FC)
    AIREG+=1;
   OPREG<<=1;   
   TEMP=AIREG-TEMP1;//
   if(FC)
   {
      AIREG=TEMP;
      OPREG+=1;
    }
  
  
  }

   TEMP=TEMP1-AIREG;
   TEMP1>>=1;
   if(TEMP<TEMP1)
   OPREG++;
 return OPREG;
 
 }
 //-------------------------------------------//
 void discharge(void)
 {
  do
    {
      R0_M=0;
	  RX1_M=0;
	  RX2_M=0;
	  RX3_M=0;
	  RX4_M=0;
	  TEST_M=1;
      TEST_R=0;
	  R0=0;
	  RX1=0;
	  RX2=0;
	  RX3=0;
	  RX4=0;

                      // 都为0
      for(i=0;i<80u;i++)
          ;                //延时等待放电完成
      TEST_M=0;           //作为输入口
    }
  while(TEST_R)
  ;          //等待放电完成 
 
 } 
 //---------------------------------------//
 unsigned char TEST(void)
 {
 	    FGIE=0;  
 for(j=0;TEST_R==0&&j!=255;j++)  //计数
           {
		    i++;
		    i++;
			i++;
		    i++;
			i++;
		    i++;
			i++;
		  	i++;
			i++;
			}
		FGIE=1;  
  return  j;
  }	 	 
 //---------------------------------------//
 void TEST_RX(void)
{ 
//---------测量RO----------`1--------
   discharge();
   R0_M=1;//R0
   R0=1;  //FGIE=0;
   R0_DATA=TEST();  //FGIE=1;   	                                      
 //===================RX1===============================//  
  discharge();
   RX1_M=1;//RX
   RX1=1;   //	FGIE=0;
   R1_DATA=TEST();   	//FGIE=1;  
//--------------------RX2-----------------------------//

   discharge();
   RX2_M=1;//RX
   RX2=1;   	//FGIE=0;
   R2_DATA=TEST();  	//FGIE=1;  
//--------------------------------------------------//
   discharge();
   RX3_M=1;//RX
   RX3=1;   
   R3_DATA=TEST();   
//--------------------------------------------------//
  discharge();
   RX4_M=1;//RX
   RX4=1;
   	//FGIE=0;
   R4_DATA=TEST();  
   discharge();
//---------------dsp rx-----------------//
//--------------------------------------//
    if(BEGINFL1)
   {
      
if(R3_DATA>75u&&R3_DATA<115u&&R2_DATA>75u&&R2_DATA<115u)//100	  
	{  SOUND_CT++; 
	  R3_M=R3_DATA;//-6;
	  R2_M=R2_DATA;//-4;
      if(SOUND_CT>4U)
       BEGINFL1=0;
     }
	 } 
//---------------------------------------//
  TEMP=10;  // 前后
  TEMP1=R3_M;
  OPREG=R3_DATA; 
  R3_DATA=DSP_DATA();//前后
  if(R3_DATA<3u)
    R3_DATA=1;
    else
    R3_DATA-=2;
  if(R3_DATA>15u)
    R3_DATA=15;
//========================================//
  //TEMP=81;//81 主//63*63=3900//500/63=8
  //TEMP1=R0_DATA;
  //OPREG=R1_DATA;

  TEMP=186;//81 主//63*63=3900//500/63=8
  TEMP1=R0_DATA;
  OPREG=R1_DATA;
  R1_DATA=DSP_DATA();//主电机
  if(R1_DATA<16u)
   R1_DATA=0;
   else
  R1_DATA-=16;  //130==>120+34=154+32=186
//--------------------------
   if(R1_DATA>14u)
   {
    if(R1_DATA<136u)
    {
	 R1_DATA-=15;
	 R1_DATA>>=2;
	 R1_DATA+=15;
	 }
	else
	{
     R1_DATA-=90;
	 }
   }
 if(R1_DATA>63u)
   {    
     R1_DATA=63;
	}
  if(BEGINFL)
    {
	 if(R1_DATA>6u)//&&R1_DATA<38u)
	    MOVFL=1;
     if(MOVFL&&R1_DATA==0)//<6u)
	    BEGINFL=0;
     }
 //--------------------------------------//
 //---------------10k+1k------------------//
   R11_DATA=0;	
  if(R1_DATA==0)
   {     
     R3_DATA=8;
	}
   else
 {  
   R11_DATA=R1_DATA;
    TX_COUNT=244;
 //--------------------
  TEMP=9;//20==>4k==>//6
  //TEMP=11;         //7
  TEMP1=R2_M;
  OPREG=R2_DATA;
  R2_DATA=DSP_DATA();//左右 
  if(R2_DATA<3u)
   R2_DATA=0;
   else
   R2_DATA-=3;
 if(R2_DATA>12u)
   {    
     R2_DATA=12;
	} 
	                                                                                                         
  TEMP=36;//5.1k//6k==>4.8k==>31==>5.1k==>33
  TEMP1=R0_DATA;//4.8k===>20===>5.1k===>22
  OPREG=R4_DATA; 
  R4_DATA=DSP_DATA();//微调
  if(OPREG<6u)
   OPREG=0;
   else
  OPREG-=5;
 if(OPREG>31u)
   {    
    OPREG=31;
	}
  TEMP2=0;
  TEMP3=0;
   if(OPREG>15U) 	      
	   {
		  OPREG-=16;	    
		 TEMP2=OPREG;
	   }
	else 	            
       {
	   for(i=16,TEMP=0;i>OPREG;i--)      
                  TEMP++;
              TEMP3=TEMP;           
       }
//----------------------
 //OPREG=R2_DATA;
   //if(OPREG>18u)
   //   OPREG=18;
   //  if(OPREG>7U) 	      
///	   {
//	     if(OPREG<11U)
//	      OPREG=0;
//		 else
//		  OPREG-=10;
//		TEMP3+=OPREG;
//	   }
     if(R2_DATA>5U)
	  {
	   TEMP3=TEMP3+R2_DATA-6;
	    
       }

	else 	            
      { 
	  for(i=6,TEMP=0;i>R2_DATA;i--)      
                  TEMP++;
             TEMP2+=TEMP;
			  	  	 	
      }
/*



  */

     if(TEMP3>TEMP2)
	   {
	    TEMP3=TEMP3-TEMP2;
		if(TEMP3>15U)
		TEMP3=15;
        R2_R4_DEC();//R1+		        
	    R11_DATA=R1_DATA-R11_DATA;
        R11_DATA+=0X10;				  
		}
	 else
	   {
         TEMP3=TEMP2-TEMP3;
		 if(TEMP3>15U)
	 	   TEMP3=15;
         R2_R4_DEC();//R1+
		 TEMP1=R1_DATA;
		 R1_DATA=R11_DATA;
		 R11_DATA=TEMP1;
		 R11_DATA=R11_DATA-R1_DATA;
	    }
  }
 
  
  
  } 
 //--------------------------- ----------//

//-----------------主程序----------------//
void main(void)
{  
   init( );
   //DATA_TX( ); 
  while(1)
  { 
     WDTR=0X5A;        //watch dog clr;
    TEST_RX();
   if(ID1==0&&ID2==0&&R1_DATA>10U&&BEGINFL==0&&LOWFL==0)
   {
   
	if(FIREFL==0)
     {
	  GUN_SOUND=1;
	  SOUND_CT=0;
	  }
	 FIREFL=1;
	}
   else
   {
      FIREFL=0;
	if(BEGINFL==0)
	 {	
	    SOUND_CT=0;
		GUN_SOUND=0;
		}
		}
//--------100----130-----160-//
	 if(ID==1)
	   TEMP=34;
	 else
	   {
	    if(ID==2)
	     TEMP=52;
		else	   
	     TEMP=65;
		}
	 if(COUNT_ID>TEMP&&TX_COUNT>0u&&MOVFL&&LOWFL==0) 
	    DATA_TX( ); 
	 
   }
}

⌨️ 快捷键说明

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