这两天调试超声波测距模块出现了各种稀奇古怪的问题,这里我就展现给大家
最新的问题,希望能得到大家的解答。
先贴出来电路吧。
我想将采集到的数据显示到串口中,在接收到上位机的0xaa命令后,回送数据。
现在的结果是,如果距离在2m以下,数据能够实时地更新并且能够会送回上位机。
但是等到距离超过这个范围,也就意味着收不到回波,就进入了死状态,上位机
不能再接收数据了。除非复位或者重启。
代码如下:
#include <stc12c5a16s2.H>
#include <stdio.h>
#include "delay.h"
#define uint unsigned int
#define uchar unsigned char
sbit Trig=P1^2;
sbit Echo=P3^2;
sbit led=P1^0;
bit RxDataFlag=0;
bit TimeoutFlag=0;
uchar txt[5];
uchar cnt;
unsigned long distance;
void UartInit()
{
TMOD=0x21;
SCON=0x50;
TH0=0;
TL0=0;
TH1=0xfd;
TL1=0xfd;
TR1=1;
ET0=1;
ES=1;
EX0=1;
IT0=1;
PS=1;
EA=1;
}
void SendWave()
{
Trig=0;
delay_us(5);
Trig=1;
delay_us(20);
while(!Echo);
TR0=1;
while(Echo);
TR0=0;
}
void CountDistance()
{
if((distance>=4500)||TimeoutFlag==1) //超出测量范围显示“-”
{
TimeoutFlag=0;
printf("-----
");
return;
}
txt[0]=distance/1000+'0';
txt[1]=distance%1000/100+'0';
txt[2]=distance%100/10+'0';
txt[3]=distance%10+'0';
txt[4]=' ';
}
void SendData(uchar *p)
{
uchar i;
TI=0;
for(i=0;i<5;i++)
{
SBUF=*(p+i);
while(TI==0);
TI=0;
}
}
void main()
{
UartInit();
while(1)
{
send:
SendWave();
CountDistance();
if(RxDataFlag==1)
{
if(TimeoutFlag==1)
{
TimeoutFlag=0;
goto send;
}
else
{
ES=0;
SendData(txt);
ES=1;
}
RxDataFlag=0;
}
}
}
void Ex0Ser() interrupt 0
{
uint time;
time = TH0<<8 | TL0;
distance = (time * 1.76)/10;//mm
TH0=0;
TL0=0;
}
void Timer0Ser() interrupt 1
{
cnt++;
if(cnt==20)
{
cnt=0;
TimeoutFlag=1;
}
}
void UartSer() interrupt 4
{
uchar RxData;
RI=0;
RxData=SBUF;
P1=RxData;
if(RxData==0xaa)
{
RxDataFlag=1;
}
}
此帖出自
小平头技术问答
一周热门 更多>