Re: [問題] 超音波程式問題
※ 引述《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
討論串 (同標題文章)
ASM 近期熱門文章
PTT數位生活區 即時熱門文章