|
我是新手,这是我这几天所做到超声波避障智能小车,目前功能还不强大,但是可以做为初学者参考的例子,感兴趣的可以看一下
#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;
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|