通過L298控制兩個直流電機帶動裝置進行上下左右移動,條件是自動按鍵按下,裝置按照設計的路徑運動,當設置X2-X1小于50時,裝置先下移,在右移到X2最后上移到Y1。通過proteus仿真時,自動按鍵按下后釋放,裝置只進行下移,需要不停的按下和釋放自動按鍵才能完整的按照路徑運動,去掉獨立按鍵部分可以正常工作。下面是用到的程序。希望大佬可以幫我看看問題,單片機學的不太好。
sbit key_at = P1^6;//自動
sbit IN1 = P2^3;
sbit IN2 = P2^4;//電機a輸入控制
sbit IN3 = P2^5;
sbit IN4 = P2^6;//電機a輸入控制
sbit fa = P3^0;//左移時為1,右移時為0
sbit fb = P3^1;//下移時為1,上移時為0
int X,Y;//工作平臺坐標
int X1 ; //電機a左限位
int X2 ; //電機a右限位
int Y1 ; //電機b上限位
int Y2; //電機b下限位
void initial()
{
EA = 1;//打開總中斷
EX0 = 1;//打開外部中斷0
EX1 = 1;
IT0 = 1;//設置外部中斷0下降沿觸發
IT1 = 1;
}
void delay(uint z)
{
uint i,j;
for(i = z;i > 0;i--)
for(j = 114;j > 0;j--);
}
void moto_auto()
{
int n;
int i;
X1=85;
Y1=170;
X2=110;
Y2=100;
X=X1+numa;
Y=Y1+numb;
n=(X2-X1)/100;
if(key_at==0)
{
delay(10);
if(key_at==0)
{
while(!key_at);
if((X2-X1-100*n)<=50)
{
if(Y>=Y1&&(X<(X1+100*n+10))&&(X>(X1+100*n-10)))
{
IN1=0;
IN2=0;
IN3=0;
IN4=1;//下移
}
if(Y<=Y2&&(X<(X1+100*n+10))&&(X>(X1+100*n-10)))
{
IN1=1;
IN2=0;
IN3=0;
IN4=0;//右移
}
if(Y<=Y2&&X>X2)
{
IN1=0;
IN2=0;
IN3=1;
IN4=0;//上移
}
if(Y>=Y1&&X>X2)
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;//停止
}
}
}
}
}
void main()
{
initial();
while(1)
{
moto_auto();
}
}
void Int0() interrupt 0
{
if(fa==1)
numa--;//左移減計數
else
numa++;//右移加計數
}
void Int1() interrupt 2
{
if(fb==1)
numb--;//下移減計數
else
numb++;//上移加計數
}
|