#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define barrierDis 0.2 //距离障碍物的距离2dm
sbit IN1 =P3^0; //控制第一个电机,从单片机出来后接L298n模块的IN1
sbit IN2 =P3^1; //控制第一个电机,从单片机出来后接L298n模块的IN2
sbit IN3 =P3^2; //控制第二个电机,从单片机出来后接L298n模块的IN3
sbit IN4 =P3^3; //控制第二个电机,从单片机出来后接L298n模块的IN4
sbit Trig = P1^5; //产生脉冲引脚
sbit Echo = P1^4; //回波引脚
sbit servorControl =P1^6; //舵机的控制引脚
uchar flag=0; //有障碍物
uint jieshoutime; //接收返回障碍信号的时间
float juli; //小车与障碍物距离
uchar control=5;
uchar servorTime=0; //伺服时间
小车 (1).rar
(36.83 KB, 下载次数: 34)
uchar leftFlag=0;//左方向是否有障碍的标志
uchar rightFlag=0;//右方向是否有障碍的标志
void delay_ms(uint ms)//延时函数
{
uchar time;
while(ms--)
for(time=0;time<100;time++);
}
void chufa() //12us脉冲
{
Trig=1;
_nop_(); // _nop_()=1us
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Trig=0;
}
void stop()
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
}
void forward()
{
IN1=0;
IN2=1;
IN3=0;
IN4=1;
}
void anticlockwise() //←
{
IN1=0;
IN2=1;
IN3=1;
IN4=0;
}
void backoff ()
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
}
void clockwise() //→
{
IN1=1;
IN2=0;
IN3=0;
IN4=1;
}
uchar getDistance() //利用超声波模块判断有无障碍物
{
TH0=0;
TL0=0;
chufa();
while(!Echo); //接收信号取时
TR0=1;
while(Echo);
TR0=0;
jieshoutime=TH0*256+TL0; //接收信号转换为10进制
juli=(jieshoutime*0.000001*344)/2; //风速设为344m/s
if(juli<barrierDis&&flag==0) //无障碍
{
return 0;
}
else
{
flag=0; //有障碍
return 1;
}
}
/****************************
void bizhang() //无舵机避障函数
{
if(getDistance()==0)
{
stop();
delay_ms(500);
anticlockwise();
delay_ms(700);
forward();
delay_ms(500);
}
else;
}
****************************/
void main()
{
EA=1;
ET0=1;
ET1=1;
TMOD=0x11;
TH1=0xff;
TL1=0x9c;
servorTime=0;
while(1)
{
stop();
delay_ms(200);
control=10;//控制舵机使超声波模块正对前方
servorTime=0;
TR1=1;
delay_ms(100);
TR1=0;
forward();
while(getDistance()==1); //向前行驶,直到前方有障碍物
do
{
stop();
control=15; //使舵机向左摆动
servorTime=0;
TR1=1;
delay_ms(100);
TR1=0;
leftFlag=getDistance();
control=5; //使舵机向右摆动
servorTime=0;
TR1=1;
delay_ms(100);
TR1=0;
rightFlag=getDistance();
control=20;
servorTime=0;
TR1=1;
delay_ms(100);
TR1=0;
backoff ();
delay_ms(200);
}
while(leftFlag==0&&rightFlag==0);
if(rightFlag==0&&leftFlag==1) //左侧没有障碍物
anticlockwise();
else if(rightFlag==1&&leftFlag==0)//右侧没有障碍物
clockwise();
else if(rightFlag==1&&leftFlag==1)//两侧都没有障碍物,默认向左走
anticlockwise();
delay_ms(1000);
}
}
void T1_int(void) interrupt 3 //产生舵机所需要的脉冲
{
TH1=0xff;
TL1=0x9c;
servorTime++;
if(servorTime<=control)
servorControl=1;
else
servorControl=0;
if(servorTime>=200)
servorTime=0;
}
void T0_int(void) interrupt 1 //超声波超出测量范围
{
flag=1;
}
|