这两天调试超声波测距模块出现了各种稀奇古怪的问题,这里我就展现给大家
最新的问题,希望能得到大家的解答。
先贴出来电路吧。
我想将采集到的数据显示到串口中,在接收到上位机的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("-----\n"); 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; } }
|