关于四路循迹的程序 我小车也是一侧的轮转
时间:10-02
整理:3721RD
点击:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char zkb1=0 ;
//**左边电机的占空比**//
unsigned char zkb2=0 ;
//**右边电机的占空比**//
unsigned char t=0;
//**定时器中断计数器**//
sbit LSEN1=P2^0;
sbit LSEN2=P2^1;
sbit MSEN1=P2^2;
sbit RSEN1=P2^3;
sbit RSEN2=P2^4;
//**传感器***/
sbit IN1=P1^0;
sbit IN2=P1^1;
sbit IN3=P1^2;
sbit IN4=P1^3;
sbit ENA=P1^4;
sbit ENB=P1^5;
//**********初始化定时器中断***********//
void init()
{
TMOD=0x01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
EA=1;
ET0=1;
TR0=1;
}
//***********中断函数+脉宽调制***********//
void timer0() interrupt 1
{
if(t<zkb1)
ENA=1;
else
ENA=0;
if(t<zkb2)
ENB=1;
else
ENB=0;
t++;
if(t>=50)
{t=0;} }
//******************直行******************//
void qianjin()
{
zkb1=30;
zkb2=30;
}
//***************小左转函数***************//
void turn_left1()
{ zkb1=10;
zkb2=25;
}
//***************大左转函数***************//
void turn_left2()
{ zkb1=5;
zkb2=25;
}
//***************中左转函数***************//
void turn_left3()
{ zkb1=10;
zkb2=20;
}
//***************小右转函数***************//
void turn_right1()
{ zkb1=25;
zkb2=10;
}
//***************大右转函数***************//
void turn_right2()
{ zkb1=25;
zkb2=5;
}
//***************中右转函数***************//
void turn_right3()
{ zkb1=20;
zkb2=10;
}
//***************循迹函数*****************//
void xunji()
{
uchar flag;
if((RSEN1==1)&&(RSEN2==1)&&(MSEN1==0)&&(LSEN1==1)&&(LSEN2==1))
{ flag=0; }
//*******直行*******//
else
if((RSEN2==0)&&(RSEN1==1)&&(LSEN1==1)&&(LSEN2==1)&&(MSEN1==1))
{ flag=1;} //***左偏1,小右转***//
else
if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==1)&&(LSEN2==0)&&(MSEN1==1))
{ flag=2; } //***右偏1,小左转***//
else
if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==1)&&(MSEN1==1))
{ flag=3; } //***右偏2,大左转***//
else
if((RSEN2==1)&&(RSEN1==0)&&(LSEN1==1)&&(LSEN2==1)&&(MSEN1==1))
{ flag=4;} //***左偏2,大右转***//
else
if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==0)&&(MSEN1==1))
{ flag=5; } //***右偏3,中左转***//
else
if((RSEN1==0)&&(RSEN2==0)&&(LSEN1==1)&&(LSEN2==1)&&(MSEN1==1))
{ flag=6; } //***左偏3,中右转***//
switch (flag)
{ case 0:
qianjin();
break;
case 1:
turn_right1();
break;
case 2:
turn_left1();
break;
case 3:
turn_left2();
break;
case 4:
turn_right2();
break;
case 5:
turn_left3();
break;
case 6:
turn_right3();
break;
default: break; }
}
//****************主程序****************//
void main()
{ init();
zkb1=30;
zkb2=30;
while(1)
{ IN1=1; //******给电机加电启动******//
IN2=0;
IN3=1;
IN4=0;
ENA=1;
ENB=1;
while(1)
{
xunji(); //*********寻迹**********//
}
}
}
首先 它的中断服务子程序 没有重装初值, 也就是说 中断子程序只能执行一次,所以说这个中断子程序是错误的!
但是 我网上搜索资料的时候 还看到有人做的课程设计 竟然也是这个程序 依旧是子程序没有重装初值, 我现在有些动摇了
哪位大神前来 解释解释呢
#define uchar unsigned char
#define uint unsigned int
unsigned char zkb1=0 ;
//**左边电机的占空比**//
unsigned char zkb2=0 ;
//**右边电机的占空比**//
unsigned char t=0;
//**定时器中断计数器**//
sbit LSEN1=P2^0;
sbit LSEN2=P2^1;
sbit MSEN1=P2^2;
sbit RSEN1=P2^3;
sbit RSEN2=P2^4;
//**传感器***/
sbit IN1=P1^0;
sbit IN2=P1^1;
sbit IN3=P1^2;
sbit IN4=P1^3;
sbit ENA=P1^4;
sbit ENB=P1^5;
//**********初始化定时器中断***********//
void init()
{
TMOD=0x01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
EA=1;
ET0=1;
TR0=1;
}
//***********中断函数+脉宽调制***********//
void timer0() interrupt 1
{
if(t<zkb1)
ENA=1;
else
ENA=0;
if(t<zkb2)
ENB=1;
else
ENB=0;
t++;
if(t>=50)
{t=0;} }
//******************直行******************//
void qianjin()
{
zkb1=30;
zkb2=30;
}
//***************小左转函数***************//
void turn_left1()
{ zkb1=10;
zkb2=25;
}
//***************大左转函数***************//
void turn_left2()
{ zkb1=5;
zkb2=25;
}
//***************中左转函数***************//
void turn_left3()
{ zkb1=10;
zkb2=20;
}
//***************小右转函数***************//
void turn_right1()
{ zkb1=25;
zkb2=10;
}
//***************大右转函数***************//
void turn_right2()
{ zkb1=25;
zkb2=5;
}
//***************中右转函数***************//
void turn_right3()
{ zkb1=20;
zkb2=10;
}
//***************循迹函数*****************//
void xunji()
{
uchar flag;
if((RSEN1==1)&&(RSEN2==1)&&(MSEN1==0)&&(LSEN1==1)&&(LSEN2==1))
{ flag=0; }
//*******直行*******//
else
if((RSEN2==0)&&(RSEN1==1)&&(LSEN1==1)&&(LSEN2==1)&&(MSEN1==1))
{ flag=1;} //***左偏1,小右转***//
else
if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==1)&&(LSEN2==0)&&(MSEN1==1))
{ flag=2; } //***右偏1,小左转***//
else
if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==1)&&(MSEN1==1))
{ flag=3; } //***右偏2,大左转***//
else
if((RSEN2==1)&&(RSEN1==0)&&(LSEN1==1)&&(LSEN2==1)&&(MSEN1==1))
{ flag=4;} //***左偏2,大右转***//
else
if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==0)&&(MSEN1==1))
{ flag=5; } //***右偏3,中左转***//
else
if((RSEN1==0)&&(RSEN2==0)&&(LSEN1==1)&&(LSEN2==1)&&(MSEN1==1))
{ flag=6; } //***左偏3,中右转***//
switch (flag)
{ case 0:
qianjin();
break;
case 1:
turn_right1();
break;
case 2:
turn_left1();
break;
case 3:
turn_left2();
break;
case 4:
turn_right2();
break;
case 5:
turn_left3();
break;
case 6:
turn_right3();
break;
default: break; }
}
//****************主程序****************//
void main()
{ init();
zkb1=30;
zkb2=30;
while(1)
{ IN1=1; //******给电机加电启动******//
IN2=0;
IN3=1;
IN4=0;
ENA=1;
ENB=1;
while(1)
{
xunji(); //*********寻迹**********//
}
}
}
首先 它的中断服务子程序 没有重装初值, 也就是说 中断子程序只能执行一次,所以说这个中断子程序是错误的!
但是 我网上搜索资料的时候 还看到有人做的课程设计 竟然也是这个程序 依旧是子程序没有重装初值, 我现在有些动摇了
哪位大神前来 解释解释呢
顶一个,,,,,,,,,,,,,,,,,,,,,,,,,,