#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)
2019-4-25 18:08 上傳
點擊文件名下載附件
智能小車 下載積分: 黑幣 -5
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;
}
|