找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 3681|回復(fù): 4
收起左側(cè)

RCW-0001型超聲波傳感器編程問題,紅色部分while(echo)那無法工作

[復(fù)制鏈接]
ID:318095 發(fā)表于 2018-6-3 10:56 | 顯示全部樓層 |閱讀模式
RCW-0001型號的超聲波傳感器  寫的程序如下圖 主要問題是紅色部分while(echo)那無法工作 只要去掉就可以有數(shù)據(jù)傳回上位機(jī)
trigg是控制端 持續(xù)10毫秒可以產(chǎn)生測距波, echo為接收端根據(jù)其為高電平時間測距
  1. #include<reg52.h>
  2. #include<math.h>
  3. #define uchar unsigned char

  4. sbit trig=P0^5;
  5. sbit echo=P0^4;
  6. sbit d=P0^6;

  7. float a,b1,c1;
  8.        int b,c,i,j,k;        
  9.             char x[9];

  10. void main()
  11. {         

  12.             TMOD = 0x20;
  13.         SCON = 0x50;
  14.         TH1 = 0xFD;
  15.        TL1 = TH1;
  16.        PCON = 0x00;
  17.        EA = 1;
  18.        ES = 1;
  19.        TR1 = 1;
  20.            trig=0;
  21.            echo=1;
  22.            while(1)
  23.            {  
  24.                        
  25.                    TH0=0X00;TL0=0X00;
  26.                trig=1;
  27.                    k++;k++;k++;        k++; k++; k++;k++;k++;k++;
  28.                    trig=0;
  29.                    while(!echo);
  30.                    TR0=1;
  31.                   [color=#ff0000] while(echo);//無法運(yùn)行 ,去掉可以運(yùn)行[/color]
  32.                   
  33.                    a=TH0*256+TL0;
  34.                    a=a*12*17;           
  35.                    TR0=0;
  36.                    a=(a/11059.2)+0.7;        //修正誤差
  37.                     

  38.                    c1=modf(a,&b1);
  39.                    b=(int)(b1);
  40.                    c=(int)(1000*c1);
  41.                   
  42.                    x[0]=0x30+b/100;
  43.                    x[1]=0x30+b/10-10*(b/100);
  44.                    x[2]=0x30+b-10*(b/10);
  45.                    x[3]=0x2e;
  46.                    x[4]=0x30+c/100;
  47.                    x[6]=0x30+c/10-10*(c/100);
  48.                    x[7]=0x30+c-10*(c/10);
  49.                    x[8]='\0';
  50.                    for(i=0;i<9;i++)
  51.                       {   if((x[i]==0x30)&&(i<2))
  52.                               {    if(!(x[0]==0x30))
  53.                                                     {          SBUF=x[i];
  54.                                               while(!TI);
  55.                                               TI=0;
  56.                                                              }
  57.                                                    else
  58.                                                     {    SBUF=0x20;
  59.                                              while(!TI);
  60.                                              TI=0;
  61.                                                                 }
  62.                                           }
  63.                                    else {  SBUF=x[i];
  64.                                    while(!TI);
  65.                                     TI=0;
  66.                                                 }
  67.                             }
  68.                    for(i=0;i<110;i++)
  69.                        for(j=0;j<114;j++);
  70.                
  71.                 }
  72. }
復(fù)制代碼


回復(fù)

使用道具 舉報

ID:318095 發(fā)表于 2018-6-3 10:57 | 顯示全部樓層
這是改的程序分成模塊
#include<reg52.h>
#include<math.h>
#define uchar unsigned char

sbit trig=P0^5;
sbit echo=P0^4;
sbit d=P0^6;

float a,b1,c1;
       int b,c,i,j,k;       
            char x[9];
float ceju()
{                  
          SBUF=0X31; while(!TI);TI=0;
         
             
           TH0=0X00;TL0=0X00;
               trig=1;
                   k++;k++;k++;        k++; k++; k++;k++;k++;k++;k++;k++;k++;k++;k++;k++;
                   trig=0;  SBUF=0X32;while(!TI);TI=0;
                   while(!echo);
                   TR0=1;  SBUF=0X33; while(!TI);TI=0;
                    
                   //while(echo);
                        SBUF=0X34;  while(!TI);TI=0;
                   a=TH0*256+TL0;
                   a=a*12*17;          
                    TR0=0;
                   a=(a/11059.2)+0.7;        //修正誤差
                    SBUF=0X36;while(!TI);TI=0;
           return a;
}
void delay(b)
{
   
  for(i=1;i<b;i++)
    for(j=1;j<500;j++) ;
}
void songxian(float a)
{                    
           c1=modf(a,&b1);
                   b=(int)(b1);
                   c=(int)(1000*c1);
                  
                   x[0]=0x30+b/100;         
                   x[1]=0x30+b/10-10*(b/100);         
                   x[2]=0x30+b-10*(b/10);           
                   x[3]=0x2e;         
                   x[4]=0x30+c/100;         
                   x[6]=0x30+c/10-10*(c/100);
                   x[7]=0x30+c-10*(c/10);  
                   x[8]='\0';                
                   for(i=0;i<9;i++)
                      {   if((x[i]==0x30)&&(i<2))
                              {    if(!(x[0]==0x30))
                                                    {          SBUF=x[i];
                                              while(!TI);
                                              TI=0;
                                                             }
                                                   else
                                                    {    SBUF=0x20;
                                             while(!TI);
                                             TI=0;
                                                                }
                                          }
                                   else {  SBUF=x[i];
                                   while(!TI);
                                    TI=0;
                                                }
                            }
                   for(i=0;i<110;i++)
                       for(j=0;j<114;j++);
}
void main()
{         

            TMOD = 0x20;
        SCON = 0x50;
        TH1 = 0xFD;
       TL1 = TH1;
       PCON = 0x00;
       EA = 1;
       ES = 1;
       TR1 = 1;
           trig=0;
           echo=1;
           while(1)
           {  
                       SBUF=0X30; while(!TI);TI=0;
                       a=ceju();
                        d=0;
                        songxian(a);
                                    delay(5000);
                   /*TH0=0X00;TL0=0X00;
               trig=1;
                   k++;k++;k++;        k++; k++; k++;k++;k++;k++;
                   trig=0;
                   while(!echo);
                   TR0=1;
                   while(echo);
                  
                   a=TH0*256+TL0;
                   a=a*12*17;          
                   TR0=0;
                   a=(a/11059.2)+0.7;        //修正誤差
                    

                   c1=modf(a,&b1);
                   b=(int)(b1);
                   c=(int)(1000*c1);
                  
                   x[0]=0x30+b/100;
                   x[1]=0x30+b/10-10*(b/100);
                   x[2]=0x30+b-10*(b/10);
                   x[3]=0x2e;
                   x[4]=0x30+c/100;
                   x[6]=0x30+c/10-10*(c/100);
                   x[7]=0x30+c-10*(c/10);
                   x[8]='\0';
                   for(i=0;i<9;i++)
                      {   if((x[i]==0x30)&&(i<2))
                              {    if(!(x[0]==0x30))
                                                    {          SBUF=x[i];
                                              while(!TI);
                                              TI=0;
                                                             }
                                                   else
                                                    {    SBUF=0x20;
                                             while(!TI);
                                             TI=0;
                                                                }
                                          }
                                   else {  SBUF=x[i];
                                   while(!TI);
                                    TI=0;
                                                }
                            }
                   for(i=0;i<110;i++)
                       for(j=0;j<114;j++); */
               
                }
}
回復(fù)

使用道具 舉報

ID:277550 發(fā)表于 2018-6-3 12:04 | 顯示全部樓層
在超聲波前面2、30cm地方,放置反射物,再試試吧

超聲波的原理就是先發(fā)射一段超聲波,然后等待返波。。。。。走掉就不等待返回,測量根本不對了。






評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:343909 發(fā)表于 2018-6-3 12:06 | 顯示全部樓層
圖片1.png
回復(fù)

使用道具 舉報

ID:318095 發(fā)表于 2018-6-4 10:45 | 顯示全部樓層
devcang 發(fā)表于 2018-6-3 12:04
在超聲波前面2、30cm地方,放置反射物,再試試吧

超聲波的原理就是先發(fā)射一段超聲波,然后等待返波。。 ...

程序是對的  還了板之后可以用了  謝謝 回復(fù)
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表