作者markchen ()
看板ASM
标题Re: [问题] 超音波程式问题
时间Wed Aug 20 17:43:47 2008
※ 引述《aa706045 (小呆榕)》之铭言:
我想 你可能是遇到超音波物理特性上的问题了,
当你的程式 发送超音波出去之间 事实上你 并不能马上就作收音波的的动作
因为当超音波发射出去之後 它的发射端还会有余波出现,你如果马上就作收超音波
的动作 它会收到那个刚发射出余波 而有所误判,
你说你怎麽都会出现红灯---5cm以内 它肯定是把那个余波给收到了
有时候运气好的话 它又收到那个发射出去返回的超音波 那个时候它不会是
红灯的 但是我想通常都一定是红灯的情况超多
而超音波收到之後 也会有余波哦,这代表 你这一次接收完 到下一次
发射也要有时间上的间隔
==================
while(1)
{
发送超音波
<需要delay一定的时间> ---请自已要抓准哦,我测了很久
那时候也没有数示示波器
收取超音波
<需要delay一定的时间>
}
==================
你去看一些超音波测距的介绍看看 是不是有所谓的盲区 这个名词
ex:盲区30cm 这个就是那个delay 及你程式上延属上所必须的时间
在盲区之内测得的数据都是30cm 也就是说 最近距离要从30cm开始计算
这个实验n年前有作过 记得最好的距离是5m 最近距离是21cm(盲区)
误差正负5cm 还算不错,不过 我并没有加上温度补偿的功能 简单
的在LCD上显示数据+RS232修正警示距离(ex:接近100cm时 哔哔警示)
更有趣的时 那时候就作完这个玩具还把它弄一份报告 放到104履历
还得到不少面试机会
: 超音波测距,正常需求,如果距离为0~5cm,则亮红灯。5~50cm,亮黄灯。50~150cm,则亮绿灯。
: 而现在程式出现的问题是,距离算的不够精准,而且距离近的时候,红灯亮起,而稍微拉远时,
: 黄灯亮起一下之後,及转成红灯。无法确切得知距离远近,程式上面不知道是哪里出错,还请各
: 位前辈不吝指教,谢谢。
: 以下为我们的程式:
: #include <REG51F.H>
: sbit P10=P1^0;
: sbit P11=P1^1;
: sbit P12=P1^2;
: sbit P36=P3^6;
: sbit P37=P3^7;
: void AddTime(void);
: void CountDistance(void);
: void delay_250US(void);
: void delay_10US(void);
: void delay_500MS(unsigned int count1);
: unsigned int Time=250,Distance=0,Count=0;
: main()
: {
: MAIN_L:
: P10=1; //红灯
: P11=1; //黄灯
: P12=1; //绿灯
: P37=1; //SINGLE_IN=H
: P36=0;
: delay_250US();
: P36=1;
: while(1)
: {
: while(P37==1)
: {
: MAIN_H:
: TMOD=0x11;
: AddTime();
: Time++;
: }
: while(P37==0)
: {
: delay_10US();
: if(P37==1)
: {
: goto MAIN_H;
: }
: else
: {
: Distance=Time/58;
: goto MAIN_N;
: }
: MAIN_N:
: while(Distance>=0&&Distance<1&&Count<10)
: {
: P10=0;
: delay_500MS(10);
: P11=1;
: P12=1;
: Count++;
: }
: while(Distance>=5&&Distance<30&&Count<10)
: {
: P10=1;
: P11=0;
: delay_500MS(10);
: P12=1;
: Count++;
: }
: while(Distance>=30&&Distance<300&&Count<10)
: {
: P10=1;
: P11=1;
: P12=0;
: delay_500MS(10);
: Count++;
: }
: Count=0;
: Time=0;
: goto MAIN_L;
: }
: }
: }
: void delay_250US(void)
: {
: TL1=65536-250;
: TH1=(65536-250)>>8;
: TR1=1;
: while(TF1==0);
: TR1=0;
: TF1=0;
: }
: void AddTime(void)
: {
: TL0=65536-1;
: TH0=(65536-1)>>8;
: TR0=1;
: while(TF0==0);
: TR0=0;
: TF0=0;
: }
: void delay_10US(void)
: {
: TL0=65536-10;
: TH0=(65536-10)>>8;
: TR0=1;
: while(TF0==0);
: TR0=0;
: TF0=0;
: }
: void delay_500MS(unsigned int count1)
: {
: TL0=65536-50000;
: TH0=(65536-50000)>>8;
: TR0=1;
: while(TF0==0);
: TR0=0;
: TF0=0;
: count1--;
: }
: 不知道 算不算作业文捏
: 因为不知道错误在哪边
: 希望高手~帮帮忙~说大概哪边有错误~
: 好让我继续改进
: 多谢~
--
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.161.168.246
1F:推 aa706045:谢谢大大的回覆~ 08/26 23:16