超声波避障小车简易程序
我是新手,这是我这几天所做到超声波避障智能小车,目前功能还不强大,但是可以做为初学者参考的例子,感兴趣的可以看一下#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit RX=P3^2;//超声波发射端口
sbit TX=P1^0;//超声波接收端口(外部中断0)
sbit d1=P0^4;//定义电机端口
sbit d2=P0^5;
sbit d3=P0^6;
sbit d4=P0^7;
uint x,y,z,distance_data;
uchar outcomeL,flag,outcomeH;
void delay() //延时子函数用于产生波形
{
for(x=0;x<10;x++);
}
void delay1(uint z)//延时子函数用于转向延时
{
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main() //主函数
{
TMOD=0x10;//确定1时器工作方式
EA=1; //开总中断
ET1=1; //开定时器1中断
EX0=0; //开外部0中断
IT0=0; //外部中断低电平触发
TX=0; //超声波发射端初始为低电平
flag=0; //计算距离标志位
d1=0; //小车开始向前直走
d2=1;
d3=0;
d4=1;
while(1)//进入中断循环
{
EA=0;//关闭定时器
TX=1;//产生波形
delay();
TX=0;
while(RX==0);//当接收端为低电平时产生中断
flag=0;
EX0=1;
TH1=0;
TL1=0;//定时器1赋值
TR1=1;
EA=1;//开总中断
while(TH1<30);//延时计算距离
EX0=0;//关闭外部中断
TR1=0; //关闭定时器
if(flag==1)
{
distance_data=outcomeH; //测量结果的高8位
distance_data<<=8; //放入16位的高8位
distance_data=distance_data|outcomeL; //与低8位合并成为16位结果数据
distance_data*=12; //因为定时器默认为12分频
distance_data/=58; //微秒的单位除以58等于毫米
if(distance_data<=50) //障碍物距离小于5cm
{
d1=1; //转弯
d2=0;
d3=0;
d4=1;
delay1(1300);//刚好转90度
flag=0;
d1=0; //小车直走
d2=1;
d3=0;
d4=1;
}
}
}
}
void INTO_() interrupt 0 // 外部中断是0号
{
outcomeH =TH1; //取出定时器的值
outcomeL =TL1; //取出定时器的值
flag=1; //至成功测量的标志
EX0=0; //关闭外部中断
}
void timer1() interrupt 3// 定时器1中断是3号
{
TH1=0; //赋初值
TL1=0;
} 新手同样,路过瞧一瞧 最近正在收集小车的资料呢,还不知道该从哪里着手 超声波避障还是红外避障好? sbit TX=P1^0;//超声波接收端口(外部中断0)
--------------------------------------------
没搞错吧? mark 新手飘过,学习学习 新手感谢新手 新手来报道谢谢新手分享 楼主好样的!{:handshake:} P3^2才是外部中断0吧 写错了吧T是发射、、、 新手同样,路过瞧一瞧 超声波什么型号呀 我正好在做这个参考参考 感谢 新手{:smile:} 新手,谢谢 好吧,学习,以后用的上! 我也是新手来学习学习 超声波传感器用于智能小车避障很不错 谢谢楼主分享! 多谢楼主分享,慢慢来 学习学习 果断学习啊~~~ {:victory:}{:victory:}{:victory:}{:victory:}{:victory:} 谢谢LZ呵呵呵 支持同行 新手学习来了!{:handshake:} 有这方面资料学习 分享了
nice!!!!!!!! 怎么没有距离计算的子程序???
页:
[1]