我们程序让小车离障碍物小于30cm时就向左转,现在的情况是:
小于30cm--左转(表示正常);
30cm~100cm--直走(表示正常);
>100cm--左转(不正常啊,应该是直走才对的。);
请大家帮帮忙,超声波程序在这里:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit trig=P1^0;//超声波发射端口
sbit Echo=P3^2;//超声波接收端口(外部中断0)
uint x,y,z,distance_data;
uchar outcomeL,flag,outcomeH;
void delay() //延时子函数用于产生波形
{
for(x=0;x<20;x++);
}
void main() //主函数
{
TMOD=0x10; //确定1时器工作方式
EA=1; //开总中断
ET1=1; //开定时器1中断
EX0=1; //开外部0中断
IT0=0; //外部中断低电平触发
trig=0; //超声波发射端初始为低电平
flag=0; //计算距离标志位
while(1)//进入中断循环
{
TR1=0;//关闭定时器
trig=1;//产生波形
delay();
trig=0;
while(Echo==0);//等待接收端变为高电?
flag=0;//清零成功标志
EX0=1;
TH1=0;
TL1=0;//定时器1赋值
TR1=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<=300) //障碍物距离小于30cm
{
s1=20; //左转
s2=1;
}
else
{
s1=20; //直走
s2=20;
}
}
}
}
void INTO_() interrupt 0 // 外部中断是0号
{
outcomeH =TH1; //取出定时器的值
outcomeL =TL1; //取出定时器的值
flag=1; //至成功测量的标志
EX0=0; //关闭外部中断
}
void timer1() interrupt 3 // 定时器1中断是3号
{
TH1=0; //赋初值
TL1=0;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>