HC-SR04超声波+小舵机小车避障的51单片机程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include

#include

#define uint unsigned int

#define uchar unsigned char

sbit trig=P3^3;//触发控制信号输入

sbit echo=P3^2;//回响信号输出

sbit pwm=P3^4;//输出PWM信号

sbit P2_0=P1^0;

sbit P2_1=P1^1;

sbit P2_2=P1^2;

sbit P2_3=P1^3;

uchar count,jd;

uint time=0,timer=0;

bit flag =0;

unsigned long s=0,zs=0,ys=0;

/********************************************************/ void delay(uint x)

{uint i,j;

for(i=x;i>0;i--)

for(j=110;j>0;j--);

}

/********************************************************/ void tingzhi()//停止

{ P2_0=0; P2_2=0;

P2_1=0; P2_3=0;

}

void qianjin()//前进

{ P2_0=0; P2_2=0;

P2_1=1; P2_3=1;

}

void houtui()//后退

{ P2_0=1;P2_2=1;

P2_1=0;P2_3=0;delay(100);

tingzhi();

}

void zuozhuan()//左转

{ P2_0=1;P2_2=0;

P2_1=1;P2_3=1;delay(100);

tingzhi();

}

void youzhuan()//右转

{ P2_0=0;P2_2=1;

P2_1=1;P2_3=1;delay(100);

tingzhi();

}

/********************************************************/

void ceju(void)

{ while(!echo);//当echo为零时等待

TR0=1;//开启计数

while(echo);//当echo为1计数并等待

TR0=0;//关闭计数

time=TH0*256+TL0;

TH0=0;

TL0=0;

s=(time*1.7)/100; //算出来是CM

}

/********************************************************/

void qingling()

{ timer=0;

TH1=65036/256;

TL1=65036%256;

count=0;

}

/********************************************************/

void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围

{ flag=1;} //中断溢出标志

/********************************************************/

void zd1() interrupt 3

{ TH1=65036/256;

TL1=65036%256;

if(count

else pwm=0;

count++;

count=count%40;

timer++;

if(timer>=800)

{timer=0;

trig=1;

_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

trig=0;

}

}

/*********************************************************/

void main( void )

{

jd=3; count=0;

TMOD=0x11;//设T0,T1为方式1,GATE=0;

TH0=0;

TL0=0;

TH1=65036/256;//计数器1定时0.5ms

TL1=65036%256;

IE=0x8a;//总中断开,允许计数器0,1中断开

while(1)

{ TR1=1;

ceju();

if(s<=10)

{ tingzhi(); //停止

jd=1;count=0;

delay(20);TR1=0; qingling();

TR1=1;ceju();ys=s;

jd=5;count=0;

delay(20);TR1=0;qingling();

TR1=1;ceju();zs=s;

jd=3;count=0;

delay(20);TR1=0;qingling();

if((zs>=ys)&&(zs>10)) {zuozhuan();}//左转

else if((ys>=zs)&&(ys>10)) {youzhuan();}//右转

else {houtui();}//后退

}

else if((s>10)||(flag==1))

{qianjin();}//前进

}

}

相关文档
最新文档