#include <reg52.h>
/*电机驱动信号引脚定义*/
sbit IN1=P2^7;
sbit IN2=P2^6;
//sbit ENA=P2^5;
sbit IN3=P2^4;
sbit IN4=P2^3;
//sbit ENB=P2^2;
/*光电对管输入信号引脚定义*/
sbit left1=P0^0;
sbit left2=P0^1;
sbit right1=P0^2;
sbit right2=P0^3;
/*电机PWM信号输出引脚定义*/
sbit left_moto_pwm=P2^5;
sbit right_moto_pwm=P2^2;
/*附加引脚定义*/
sbit z=P1^1;//声控非接触式启动
sbit f=P1^2;//蜂鸣器
sbit b=P0^4;//红外避障识别
/*电机运动简便定义*/
#define left_moto_go {IN1=1,IN2=0;}
#define left_moto_back {IN1=0,IN2=1;}
#define right_moto_go {IN3=0,IN4=1;}
#define right_moto_back {IN3=1,IN4=0;}
/*相关变量定义*/
unsigned char pwm_val_left=0;//valid
unsigned char push_val_left=0;
unsigned char pwm_val_right=0;
unsigned char push_val_right=0;
/*延时函数*/
void delay(unsigned int k)
{
unsigned int x,y;
for(x=0;x<k;x++);
for(y=0;y<110;y++);
}
/*电机控制函数*/
void run(void)
{
push_val_left=20;
push_val_right=20;
left_moto_go;
right_moto_go;
}//直行
void stop(void)
{
push_val_left=0;
push_val_right=0;
left_moto_go;
right_moto_go;
}//停止
void leftturn1(void)
{
push_val_left=10;
push_val_right=15;
left_moto_back;
right_moto_go;
}//小左转
void rightturn1(void)
{ push_val_left=15;
push_val_right=10;
left_moto_go;
right_moto_back;
}//小右转
void leftturn2(void)
{
push_val_left=10;
push_val_right=20;
left_moto_back;
right_moto_go;
}//大左转
void rightturn2(void)
{
push_val_left=20;
push_val_right=10;
left_moto_go;
right_moto_back;
}//大右转
/*电机PWM生成函数*/
void pwm_out_left_moto(void)
{
if(pwm_val_left<=push_val_left)
left_moto_pwm=1;
else
left_moto_pwm=0;
if(pwm_val_left>=20)
pwm_val_left=0;
}
void pwm_out_right_moto(void)
{
if(pwm_val_right<=push_val_right)
right_moto_pwm=1;
else
right_moto_pwm=0;
if(pwm_val_right>=20)
pwm_val_right=0;
}
/*定时器中断服务函数*/
void timer0()interrupt 1 using 2
{
TH0=(65536-92)/256;
TL0=(65536-92)%256;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}
/*蜂鸣器函数*/
void fmq(void)
{
f=1;
delay(20);
f=0;
}
/*运动控制函数*/
void xunji()
{
if(left2==1&&left1==1&&right1==1&&right2==1)
{
run();
delay(1);
}//直行
if(left2==0&&left1==1&&right1==1&&right2==1)
{
leftturn1();
delay(1);
}//小左转
if(left2==1&&left1==0&&right1==1&&right2==1)
{
leftturn2();
delay(1);
}//大左转
if(left2==0&&left1==0&&right1==1&&right2==1)
{
leftturn2();
delay(185);
run();
delay(100);
}//左转直行
if(left2==1&&left1==1&&right1==0&&right2==1)
{
rightturn1();
delay(1);
}//小右转
if(left2==1&&left1==1&&right1==1&&right2==0)
{
rightturn2();
delay(1);
}//大右转
if(left2==1&&left1==1&&right1==0&&right2==0)
{
rightturn2();
delay(185);
run();
delay(100);
}//右转直行
if(left2==0&&left1==0&&right1==0&&right2==0)
{
stop();
fmq();
} //停止
if(b==1)
{
fmq();
}//避障
}
void main()
{
/*定时器初始化*/
TMOD=0x01;
TH0=(65536-92)/256;
TL0=(65536-92)%256;
EA=1;
ET0=1;
TR0=1;
if(z==0)
{
/*循环检测状态*/
while(1)
{xunji();}
}
}
寻迹小车
最新推荐文章于 2024-04-26 11:48:54 发布