HC-SR04超声波+小舵机小车避障的51单片机程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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();}//前进 } }