基于51单片机的四路红外循迹,超声波定点测距的代码
时间: 2023-11-27 18:54:40 浏览: 131
基于51单片机的超声波测距程序设计
这是一个基于51单片机的四路红外循迹和超声波定点测距的代码,代码中使用了红外传感器和超声波模块来控制小车的运动,小车可以判断自己所在的位置并避免障碍物。
```
#include<reg52.h>
#include<intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define IR P1
//定义红外传感器的引脚
sbit left1=IR^0;
sbit left2=IR^1;
sbit right1=IR^2;
sbit right2=IR^3;
//定义超声波引脚
sbit trig=P2^0;
sbit echo=P2^1;
//定义电机引脚
sbit ena=P2^2;
sbit enb=P2^3;
sbit in1=P2^4;
sbit in2=P2^5;
sbit in3=P2^6;
sbit in4=P2^7;
void delay(uint t)
{
while(t--);
}
void init()
{
TMOD=0x01; //定时器0工作在模式1,16位计数器
TH0=0xfc; //计数初值
TL0=0x18;
ET0=1; //开定时器0中断
EA=1; //开全局中断
}
void main()
{
uchar time;
uchar flag;
init();
while(1)
{
//四路循迹
if(left1==0&&left2==0&&right1==0&&right2==0)
{
in1=0;in2=0;in3=0;in4=0;
}
else if(left1==0&&left2==0&&right1==0&&right2==1)
{
in1=0;in2=0;in3=1;in4=0;
}
else if(left1==0&&left2==0&&right1==1&&right2==0)
{
in1=0;in2=0;in3=0;in4=1;
}
else if(left1==0&&left2==0&&right1==1&&right2==1)
{
in1=0;in2=1;in3=0;in4=0;
}
else if(left1==0&&left2==1&&right1==0&&right2==0)
{
in1=1;in2=0;in3=0;in4=0;
}
else if(left1==0&&left2==1&&right1==0&&right2==1)
{
in1=0;in2=1;in3=0;in4=0;
}
else if(left1==0&&left2==1&&right1==1&&right2==0)
{
in1=0;in2=0;in3=0;in4=1;
}
else if(left1==0&&left2==1&&right1==1&&right2==1)
{
in1=0;in2=1;in3=0;in4=0;
}
else if(left1==1&&left2==0&&right1==0&&right2==0)
{
in1=1;in2=0;in3=0;in4=0;
}
else if(left1==1&&left2==0&&right1==0&&right2==1)
{
in1=1;in2=0;in3=0;in4=0;
}
else if(left1==1&&left2==0&&right1==1&&right2==0)
{
in1=0;in2=0;in3=1;in4=0;
}
else if(left1==1&&left2==0&&right1==1&&right2==1)
{
in1=1;in2=0;in3=0;in4=0;
}
else if(left1==1&&left2==1&&right1==0&&right2==0)
{
in1=1;in2=0;in3=0;in4=0;
}
else if(left1==1&&left2==1&&right1==0&&right2==1)
{
in1=1;in2=0;in3=0;in4=0;
}
else if(left1==1&&left2==1&&right1==1&&right2==0)
{
in1=0;in2=0;in3=0;in4=1;
}
else if(left1==1&&left2==1&&right1==1&&right2==1)
{
in1=1;in2=0;in3=0;in4=0;
}
//超声波测距
trig=1;
delay(10);
trig=0;
while(!echo);
TR0=1; //启动定时器0
while(echo);
TR0=0; //关闭定时器0
time=(TH0<<8)+TL0;
if(time<1000) //超声波测距小于1s
{
flag=1;
ena=1;enb=1;
in3=1;in4=0;in1=0;in2=0; //前进
}
else if(flag) //超声波测距大于1s且之前有障碍物
{
ena=1;enb=1;
in3=0;in4=1;in1=0;in2=0; //后退
delay(500);
ena=1;enb=1;
in3=0;in4=0;in1=0;in2=0; //停止
delay(500);
ena=1;enb=1;
in3=0;in4=0;in1=1;in2=0; //右转
delay(500);
ena=1;enb=1;
in3=1;in4=0;in1=0;in2=0; //前进
delay(1000);
flag=0;
}
}
}
//定时器0中断函数,用于计算超声波测距时间
void timer0() interrupt 1
{
TH0=0xfc;
TL0=0x18;
}
```
阅读全文