寻迹小车



#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();}
 }
  }
  • 5
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值