資源簡介
自己寫的簡易版本的基于51單片機的超聲波避障小車的工程文件,包含輸出的.hex文件。如有寫的不好的地方還請多多包涵。

代碼片段和文件信息
/*Author:?獨木春
?date: ?2018/7/20
?*/
#include
#include
#define?uchar?unsigned?char
#define?uint?unsigned?int
#define?barrierDis?15//距離障礙物的距離?
uint?sum;
float?L;
sbit?LED?=?P0^0;
sbit?Trig?=?P1^1; ???//超聲波模塊的TRIG
sbit?Echo?=?P1^2; ???//超聲波模塊的ECHO
sbit?motorDriver_1?=P2^1;??//控制第一個電機,從單片機出來后接L298n模塊的IN1
sbit?motorDriver_2?=P2^2;??//控制第一個電機,從單片機出來后接L298n模塊的IN2
sbit?motorDriver_3?=P2^3;??//控制第二個電機,從單片機出來后接L298n模塊的IN3
sbit?motorDriver_4?=P2^4;??//控制第二個電機,從單片機出來后接L298n模塊的IN4
sbit?servorControl?=P1^0;??//舵機的控制引腳
uchar?flag=0;
uchar?control=5;
uchar?servorTime=0;
uchar?lFlag=0;//左方向是否有障礙的標志
uchar?rFlag=0;//右方向是否有障礙的標志
void?delay(uchar?time){ ?//延遲函數
uchar?i;
for(;time>0;time--){
for(i=0;i<255;i++);
}
}
void?stop(){ ?//小車停止
motorDriver_1=0;
motorDriver_2=0;
motorDriver_3=0;
motorDriver_4=0;
}
void?turnLeft(){ //小車向左轉
motorDriver_1=1;
motorDriver_2=0;
motorDriver_3=0;
motorDriver_4=0;
} ?//小車向右轉
void?turnRight(){
motorDriver_1=0;
motorDriver_2=0;
motorDriver_3=1;
motorDriver_4=0;
}
void?turnUp(){ ??//小車向前走
motorDriver_1=1;
motorDriver_2=0;
motorDriver_3=1;
motorDriver_4=0;
}
void?turnDown(){ ??//小車向后走
motorDriver_1=0;
motorDriver_2=1;
motorDriver_3=0;
motorDriver_4=1;
}
void?openHc(){
???Trig=1;
???_nop_();
???_nop_();
???_nop_();
???_nop_();
???_nop_();
???_nop_();
???_nop_();
???_nop_();
???_nop_();
???_nop_();
???_nop_();
???_nop_();
???_nop_();
???Trig=0;
}
uchar?getDistance(){??//利用超聲波模塊判斷有無障礙物
TH0=0;
TL0=0;
openHc();
while(!Echo);
TR0=1;
while(Echo);
TR0=0;
sum=TH0*256+TL0;
L=(sum*1.78)/100;
if(L LED=0;
return?0;
}
else{
LED=1;
flag=0;
return?1;
}
}
void?main(){
LED=1;
EA=1;
ET0=1;
ET1=1;
TMOD=0x11;
TH1=0xff;
????TL1=0x9c;
servorTime=0;
while(1){
?stop(); ?
?control=15;//控制舵機使超聲波模塊正對前方
?servorTime=0;
?TR1=1;
?delay(200);
?TR1=0;
?turnUp();
?LED=0;
?delay(200);
?LED=1;
?while(getDistance()==1);?//向前行駛,直到前方有障礙物
?do{
????stop();
control=22; ???//使舵機向左擺動
servorTime=0;
TR1=1;
? delay(200);
TR1=0;
rFlag=getDistance();
? control=5; ?//使舵機向右擺動
servorTime=0;
TR1=1;
? delay(200);
TR1=0;
lFlag=getDistance();
turnDown();
delay(220);
delay(220);
delay(220);
}while(lFlag==0&&rFlag==0);
?if(rFlag==1&&lFlag==0) //左側沒有障礙物
? turnLeft();
?else?if(rFlag==0&&lFlag==1)//右側沒有障礙物
? turnRight();
?else?if(rFlag==1&&lFlag==1)//兩側都沒有障礙物,默認向左走
? turnLeft();
?delay(220);
?delay(220);
?delay(200);
}
}
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;
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2018-07-20?16:40??LIST\
?????文件????????8228??2018-07-20?16:39??LIST\main.lst
?????文件???????14345??2018-07-20?16:39??LIST\project.m51
?????文件???????14130??2018-07-20?16:39??LIST\STARTUP.lst
?????目錄???????????0??2018-07-20?16:40??OUT\
?????文件????????9846??2018-07-20?16:39??OUT\main.obj
?????文件???????10247??2018-07-20?16:39??OUT\project
?????文件????????3721??2018-07-20?16:39??OUT\project.hex
?????文件??????????89??2018-07-20?16:39??OUT\project.lnp
?????文件????????3028??2018-07-19?22:13??OUT\project.plg
?????文件?????????816??2018-07-20?16:39??OUT\STARTUP.obj
?????文件????????9276??2018-07-20?16:39??project.plg
?????文件???????73110??2018-07-20?16:39??project.uvopt
?????文件???????13412??2018-07-20?16:39??project.uvproj
?????文件???????73098??2018-07-19?18:19??project_uvopt.bak
?????文件???????????0??2018-07-20?09:43??project_uvproj.bak
?????目錄???????????0??2018-07-20?16:40??SRC\
?????文件????????3234??2018-07-20?16:39??SRC\main.c
?????文件????????6376??2009-05-07?14:37??STARTUP.A51
?????文件??????????74??2018-07-20?16:42??說明.txt
- 上一篇:WebService接口測試工具
- 下一篇:vqqsdl.dll
評論
共有 條評論