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

📄 motor.c

📁 云台协议,用单片机控制电机转动
💻 C
字号:
#pragma code small

#include <reg52.h>
//#include <absacc.h>
//#include <math.h>
//--------------------------------------------------------------------------------------------
typedef unsigned char int8;
typedef unsigned int  int16;
//---------------------------------------------------------------------------------------------
#define  SPEEDZY         215   //#define  SPEEDZY         0xDA     //  左右  速度
#define  SPEEDSX         211   //#define  SPEEDSX         0xDA     //  上下  速度

#define  SXDa            4     //  上下  大步转矩
#define  SXXo            2     //  上下  小步转矩
#define  ZYDa            3     //  左右   大步转矩
#define  ZYXo            2     //  左右  小步转矩
//-----------------------------全集  IO  定义----------------------------------------------
sbit UD_IN11      =    P3^0 ;    // P30
sbit UD_IN21      =    P3^1 ;    // P31
sbit UD_IN12      =    P3^5 ;    // P35
sbit LR_IN11      =    P3^2 ;    // P32
sbit LR_IN12      =    P3^4 ;    // P34
sbit LR_IN21      =    P3^7 ;    // P37
sbit CAM1         =    P1^3 ;    // P13
sbit CAM2         =    P3^3 ;    // P33   命令使能
sbit CAM3         =    P1^2 ;    // P12    (  长步  /  短步  )
sbit CAM4         =    P1^1 ;    // P11    上下左右组合
sbit CAM5         =    P1^0 ;    // P10   上下左右组合
sbit SL           =    P1^7 ;    // P17   左  行程开关
sbit SR           =    P1^6 ;    // P16   右  行程开关
sbit SU           =    P1^5 ;    // P15   上  行程开关
sbit SD           =    P1^4 ;    // P14   下  行程开关
//--------------------------全局  位  变量----------------------------------------------------
bit    		    B20H_0 ,        //   右
				    B20H_1 ,        //   左
				    B20H_3 ,        //   下                                               //B20H_4 ,        //
				    B20H_5 ,        //   上
					 B20H_2 ;        //   新 命令 标志											
//--------------------------全局  系统 变量--------------------------------------------------
int8	         uchar_0AH ,     // 上下左右的速度			
					uchar_0DH ,     //  左右长步计数		
					uchar_0CH ,     //  系统变量 , 上下长步计数					
					uchar_0BH ,     // 定义
					uchar_08H ,     // 定义
					uchar_09H ;     // 定义			
int8 			   Temp_Data ;     //
//--------------------------应用层变量------------------------------------------------------
//====================================================================================
extern void DELAY_Duan();           // 外部 延时 函数   , 汇编写的 
//================================================================================ 
//------------------------------------------------------------------------------------------------
//================================================================================
// Temp_Data  = 255;    速度
// FangXiang   :  马达  / 方向	   
// SuDu      ,   :  速度
// BuChang      :  步长
// SheDingBC  :  计划步数	
void  A_B_RUN(int8 FangXiang,int8 BuChang ,int8 SheDingBC )    // 返回   实际步数			                    
{
   while( SheDingBC-- )                      //
   {
       //------------------------------------------------------------------------------------------------------   
       while( 
	          (B20H_5 == 1) ||        // 有 任何 一个为高就等
 	          (B20H_3 == 1) ||        //
			    (B20H_1 == 1) ||        // 
			    (B20H_0 == 1)           //
			   );  
	   //-----------------------------------------------------------------------------------------------------
	   uchar_0AH  = Temp_Data;  //Temp_Data ;       //224;             // 速度    
	   switch (FangXiang)        //
	   {
		    case 0:
			     B20H_5 = 1;               //  上      
				  uchar_0CH = BuChang;      //  步长
				  break;   
			//---------------------------------------------------------------	 
		    case 1:
			     B20H_3 = 1;	           // 下	 
				  uchar_0CH = BuChang;      //  步长
				  break;             
			//--------------------------------------------------------------	 
		    case 2:
			     B20H_1 = 1;               // 右		   
				  uchar_0DH  = BuChang;     // 步长
				  break;
			//--------------------------------------------------------------	 
		    case 3:
			     B20H_0 = 1;               // 左 
				  uchar_0DH  = BuChang;     // 步长
				  break;	      	  
			//--------------------------------------------------------------	 
		    //default: break; //	       
	   }
	   //------------------------------------------------------------------------------------
	   //DELAY_Duan(); 
	    switch(FangXiang)
	    {
			   //case 0:  
			   //case 1:  
			   //      if(( SU == 0 )||( SD == 0 )) return;   //  如果碰到相应的开关   			                 
		    	//	     break;

			   case 2: 
			   case 3:  
			         if(( SL == 0 )||( SR == 0 ))//  如果碰到相应的开关 
					          return;  
 				     break;	 
			   //default: return 0 ; break; 
	    } 
   }                                 // 走完 计划步数 还没 碰到 开关  
}
//=================================================================================================

void KaiJiJiaoDui(void)
{
   Temp_Data = 233;    //  180  
   A_B_RUN(2,100,3);    //  左右走到边上
   A_B_RUN(3,100,3);    // 回头 走 一 圈
   A_B_RUN(2,40,3);    // 走半 圈
   //--------------------------------------------------------------------------------------------------------------
   Temp_Data = 236;    //  180 
   A_B_RUN(0,100,3);    // 上下走到边上
   Temp_Data = 231;    //  180 
   A_B_RUN(1,100,3);    // 回头 走 一 圈
   Temp_Data = 231;    //  180 
   A_B_RUN(0,30,2);    // 走半 圈   
}

//==================================================================================================
void LiuCemhKongZhiRun(void)
{       
		//=======================================================================================
        if( CAM2 == 1 )        //   如果  CAM2  引脚为 1 继续   命令有效位
		 {                     //  如果使能为高
		   DELAY_Duan();       //  delayms( 10 );             延时(  滤波  )
		   if( CAM2 == 1 )     //                                 如果 CAM2 引脚 为 1 继续   时间正确
			 {                 //                                继续为高
				 B20H_2 = 0;   //                                 清 中断 标志
				 
				 B20H_5 = 0;   //                                 上
				 B20H_3 = 0;   //                                 下
				 B20H_1 = 0;   //                                 右
				 B20H_0 = 0;   //                                 左
				 
				 LR_IN12= 0;   //                                  使能上下马达
				 UD_IN12= 0;   //                                  使能左右马达
			 }
		 } 
		 //============================================================================================
		if(( B20H_2 == 1 ) && ( CAM2 == 0 ))         //  如果 
		{
   		     DELAY_Duan();                          // delayms( 10 ); 延时
              B20H_2 = 0 ;                           //                            ;          
             //---------------------------------------------------------------------------------------------------
			 if(( CAM4 == 0) && ( CAM5 == 0 ) && ( SD == 1 ))   //上
           {                
				 uchar_0AH = SPEEDSX;    //  
				 B20H_3    = 0 ;         //  
				 B20H_1    = 0 ;         //  
				 B20H_0    = 0 ;         //  
				 if( CAM3 == 1 )         //  如果长步
				    uchar_0CH = SXDa;    // 原来为 0CH ,转12周
				 else 
				    uchar_0CH = SXXo;    // 原来为 3H ,转3周
				 B20H_5 = 1 ;            // 
     		  }                       
             //---------------------------------------------------------------------------------------------------	
            if(( CAM4 == 0 ) && ( CAM5 == 1 ) && ( SU == 1 )) // 下
			  {
				  uchar_0AH = SPEEDSX  ;       //
	              B20H_5   = 0  ;              //
	              B20H_1   = 0  ;              //
				     B20H_0   = 0  ;              // 
	              if( CAM3 == 1 )              //   如果引脚 CAM3 为 1 继续
				     uchar_0CH = SXDa ;        //   原来为 0CH ,转12周	
				  else 
	                 uchar_0CH = SXXo ;        //   原来为 3H ,转3周
					
	              B20H_3   =  1 ;              // 
              }			            
             //---------------------------------------------------------------------------------------------------
		    if(( CAM4 == 1 ) && ( CAM5 == 0 ) && ( SR == 1 ))  // 左
			  {
	              uchar_0AH = SPEEDZY ;        // 
				     B20H_5   = 0;                // 
	              B20H_3   = 0;                // 
	              B20H_0   = 0;                // 
	              if( CAM3 == 1 )              // 如果引脚 CAM3 为 1 继续
	  			       uchar_0DH = ZYDa;       // 原来为 12H ,转18周  
			      else                         //
	                   uchar_0DH = ZYXo ;      // 原来为 04H ,转4周					   
	              B20H_1   =   1;              // 
              }           
             //---------------------------------------------------------------------------------------------------
            if(( CAM4 == 1 ) && ( CAM5 == 1 )  && ( SL == 1 )) // 右
             {	  
	               uchar_0AH = SPEEDZY ;       // 
	               B20H_5 = 0 ;                // 
	               B20H_3 = 0 ; 			   // 
	               B20H_1 = 0 ;                // 
	               if( CAM3 == 1 )             // 如果引脚 CAM3 为 1 继续
				         uchar_0DH = ZYDa ;       // 原来为 12H ,转18周
				   else  
	                  uchar_0DH = ZYXo ;       // 原来为 04H ,转4周					  
	              B20H_0   = 1;                //       
			    }        			          
             //---------------------------------------------------------------------------------------------------
		}	                                   //  
//====================================================================================================						   
}



//==========================================================================================================================================
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------
//==========================================================================================================================================

⌨️ 快捷键说明

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