本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
#include<AT89x51.H>
#define Left_1_led P0_3 //P3_4接四路寻迹模块接口第一路输出信号即中控板上面标记为OUT1
#define Left_2_led P0_2 //P3_5接四路寻迹模块接口第二路输出信号即中控板上面标记为OUT2
#define Right_1_led P0_1 //P3_6接四路寻迹模块接口第三路输出信号即中控板上面标记为OUT3
#define Right_2_led P0_0 //P3_7接四路寻迹模块接口第四路输出信号即中控板上面标记为OUT4
#define Left_moto_go {P2_6=1,P2_7=0,P2_4=1,P2_5=0;} //左边两个电机向前走
#define Left_moto_back {P2_6=0,P2_7=1,P2_4=0,P2_5=1;} //左边两个电机向后转
#define Left_moto_Stop {P2_6=0,P2_7=0,P2_4=0,P2_5=0;} //左边两个电机停转
#define Right_moto_go {P2_2=1,P2_3=0,P2_0=1,P2_1=0;} //右边两个电机向前走
#define Right_moto_back {P2_2=0,P2_3=1,P2_0=0,P2_1=1;} //右边两个电机向前走
#define Right_moto_Stop {P2_2=0,P2_3=0,P2_0=0,P2_1=0;} //右边两个电机停转
sbit H=P1^2;
int pp=0;
char num=3;
/************************************************************************/
//延时函数
void delay(unsigned int k)
{
unsigned int x,y;
for(x=0;x<k;x++)
for(y=0;y<2000;y++);
}
/************************************************************************/
//前速前进
void run(void)
{
Left_moto_go ; //左电机往前走
Right_moto_go ; //右电机往前走
}
void stop()
{
Left_moto_Stop ;
Right_moto_Stop ;
}
//前速后退
void back(void)
{
Left_moto_back ; //左电机往前走
Right_moto_back ; //右电机往前走
}
//左转
void left(void)
{
Left_moto_back ; //左电机往后走
Right_moto_go ; //右电机往前走
}
//右转
void right(void)
{
Left_moto_go ; //左电机往前走
Right_moto_back ; //右电机往后走
}
/*********************************************************************/
/*--主函数--*/
void main(void)
{
TMOD=0x01; //模式设置,00000001,可见采用的是定时器0,工作与模式1(M1=0,M0=1)。
TR0=1; //打开定时器
TH0=0Xff; //定时器设置,每隔100微秒发起一次中断。
TL0=0Xa4;
ET0=1; //开定时器0中断
EA=1; //开总中断
while(1)
{
//四路寻迹传感器有信号(白线)为0 没有信号(黑线)为1
if((num!=0)&&(num!=10)) //对于占空比为0和100%这两种极端情况,最好分离出,单独考虑
{
if(pp<=num)
run();
else
stop();
}
else if(num==0) //当占空比为0
stop();
else
run();
if(pp==10) //当占空比为100%
pp=0;
switch(P0&0x0f)
{
case 0x00: // 全部没有压线,直转
run();
delay(6);
break;
case 0x03: // 大右压线,左转
stop();
left();
while(P0=0X04)
{break;}
case 0x01: // 中右压线,左转
stop();
left();
while(P0=0X04)
{break;}
case 0x02: // 小右压线,左转
stop();
left();
while(P0=0X04)
{break;}
case 0x04: // 小左压线,右转
stop();
right();
while(P0=0X02) //转向延时
{ break;}
case 0x08: // 中左压线,右转
stop();
right();
while(P0=0X02) //转向延时
{ break;}
case 0x0c: // 大左压线,右转
stop();
right();
while(P0=0X02) //转向延时
{ break;}
default :
stop();
break;}
} }
void time0() interrupt 1
{ TH0=0Xff;
TL0=0Xa4;
/*无限循环*/
pp++;
}
|