Re: [問題] 超音波程式問題

看板ASM (組合語言)作者時間16年前 (2008/08/20 17:43), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串4/4 (看更多)
※ 引述《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

08/26 23:16, , 1F
謝謝大大的回覆~
08/26 23:16, 1F
文章代碼(AID): #18g-TLgL (ASM)
討論串 (同標題文章)
文章代碼(AID): #18g-TLgL (ASM)