#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( C
评论0