找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11628|回復(fù): 12
打印 上一主題 下一主題
收起左側(cè)

關(guān)于超聲波模塊測量水位

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:99130 發(fā)表于 2017-3-28 14:17 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
問題:超聲波測量一個水塔的水位,假如水塔1.5米高,水位有1米,那么我把超聲波模塊固定在水塔的口子上(因為模塊不防水,沒辦法放進水里),測出來的就只是0.5米已經(jīng)用了的水位,而不是還有多少,這個問題怎么解決?我這有源程序和原理圖大神幫忙修改一下程序使其測的水位是還有多少水而不是用了多少。
謝謝

  1. /***********************************************************************************************************/
  2. //hc-sr04 超聲波測距模塊 DEMO 程序
  3. //晶振:11。0592
  4. //接線:模塊TRIG接 P0.2 ECH0 接P0.1
  5. //數(shù)碼管:共陽數(shù)碼管P1接數(shù)據(jù)口,P2.5 P2.4 P2.3接選通數(shù)碼管
  6. /***********************************************************************************************************/
  7. #include <AT89x51.H> //器件配置文件
  8. #include <intrins.h>
  9. #define RX P0_1
  10. #define TX P0_2
  11. unsigned int time=0;
  12. unsigned int timer=0;
  13. unsigned char posit=0;
  14. unsigned long S=0;
  15. bit flag =0;
  16. unsigned char const discode[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xff/*-*/};
  17. unsigned char const positon[3]={ 0xdf,0xef,0xf7};
  18. unsigned char disbuff[4] ={ 0,0,0,0,};
  19. /********************************************************/
  20. void Display(void) //掃描數(shù)碼管
  21. {
  22. P2=0xfe;//消隱
  23. //delay(5);
  24. if(posit==0)
  25. {P1=(discode[disbuff[posit]])&0x7f;}
  26. else
  27. {P1=discode[disbuff[posit]];}
  28. P2=positon[posit];
  29. if(++posit>=3)
  30. posit=0;
  31. }
  32. /********************************************************/
  33. void Conut(void)
  34. {
  35. P2=0xfe;
  36. time=TH0*256+TL0;
  37. TH0=0;
  38. TL0=0;
  39. P2=0xfe;//消隱
  40. S=(time*1.7)/100; //算出來是CM
  41. if((S>=700)||flag==1) //超出測量范圍顯示“-”
  42. {
  43. P2=0xfe;//消隱
  44. flag=0;
  45. //delay(5);
  46. disbuff[0]=10; //“-”
  47. disbuff[1]=10; //“-”
  48. disbuff[2]=10; //“-”
  49. }
  50. else
  51. {
  52. P2=0xfe;//消隱
  53. //delay(5);
  54. disbuff[0]=S%1000/100;
  55. disbuff[1]=S%1000%100/10;
  56. disbuff[2]=S%1000%10 %10;
  57. P2=0xfe;
  58. }
  59. }
  60. /********************************************************/
  61. void zd0() interrupt 1 //T0中斷用來計數(shù)器溢出,超過測距范圍
  62. {
  63. flag=1; //中斷溢出標志
  64. }
  65. /********************************************************/
  66. void zd3() interrupt 3 //T1中斷用來掃描數(shù)碼管和計800MS啟動模塊
  67. {
  68. P2=0xfe;
  69. TH1=0xf8;
  70. TL1=0x30;
  71. Display();
  72. timer++;
  73. if(timer>=400)
  74. {
  75. P2=0xfe;
  76. timer=0;
  77. TX=1; //800MS 啟動一次模塊
  78. _nop_();
  79. _nop_();
  80. _nop_();
  81. _nop_();
  82. _nop_();
  83. _nop_();
  84. _nop_();
  85. _nop_();
  86. _nop_();
  87. _nop_();
  88. _nop_();
  89. _nop_();
  90. _nop_();
  91. _nop_();
  92. _nop_();
  93. _nop_();
  94. _nop_();
  95. _nop_();
  96. _nop_();
  97. _nop_();
  98. _nop_();
  99. TX=0;
  100. }
  101. }
  102. /*********************************************************/
  103. <DIV class=blockcode>
  104. <BLOCKQUOTE>void main( void )

  105. {
  106. P2=0xfe;//消隱
  107. //delay(5);
  108. TMOD=0x11; //設(shè)T0為方式1,GATE=1;
  109. TH0=0;
  110. TL0=0;
  111. TH1=0xf8; //2MS定時
  112. TL1=0x30;
  113. P2=0xfe;
  114. ET0=1; //允許T0中斷
  115. ET1=1; //允許T1中斷
  116. TR1=1; //開啟定時器
  117. EA=1; //開啟總中斷

  118. while(1)
  119. {
  120. while(!RX); //當(dāng)RX為零時等待
  121. TR0=1; //開啟計數(shù)
  122. P2=0xfe;
  123. //delay(5);
  124. while(RX); //當(dāng)RX為1計數(shù)并等待
  125. TR0=0; //關(guān)閉計數(shù)
  126. Conut(); //計算
  127. }

  128. }
復(fù)制代碼




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:171096 發(fā)表于 2017-3-29 04:34 | 只看該作者
解決的怎么樣了,手繪原理圖很漂亮.
回復(fù)

使用道具 舉報

板凳
ID:105425 發(fā)表于 2017-3-29 08:18 | 只看該作者
我的思路是,安裝時,先讓超聲波模塊測量并記錄空水池的深度,作為初始常量--因為該水池深度是不變。
然后,實際運作時,利用超聲波測量到的安裝點到水面距離,記錄測試變量。
最后,簡單計算下即可得到可讀的水位信息:水池深度(初始變量)-水面距離(實測變量)

評分

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

查看全部評分

回復(fù)

使用道具 舉報

地板
ID:151348 發(fā)表于 2017-3-29 09:16 | 只看該作者
用水塔高度減去超聲波半程吧,S=150-(time*1.7)/100; //算出來是CM,150是水塔高度,單位cm

評分

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

查看全部評分

回復(fù)

使用道具 舉報

5#
ID:104472 發(fā)表于 2017-3-29 09:16 | 只看該作者
既然用超聲波頭測試距離,那么要知道水位,就要進行簡單的距離計算和判斷,修改這一句
S=(time*1.7)/100; //算出來是CM
對S進行重新計算    S=1.5-((time*17)/100)
試試,然后修改

評分

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

查看全部評分

回復(fù)

使用道具 舉報

6#
ID:22751 發(fā)表于 2017-3-29 11:01 | 只看該作者
設(shè)置水塔深為初始值,減去超聲波測得的距離不就是剩余的水位高度了么?

評分

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

查看全部評分

回復(fù)

使用道具 舉報

7#
ID:187473 發(fā)表于 2017-5-30 10:47 | 只看該作者
實地測試了嗎,超聲波遇到水面反射的多嗎,能測準嗎
回復(fù)

使用道具 舉報

8#
ID:159139 發(fā)表于 2017-5-30 16:15 來自觸屏版 | 只看該作者
先測一個空池深度,然后用池深減去你的測量值,最后顯示剩下的數(shù)就是水深。
回復(fù)

使用道具 舉報

9#
ID:70302 發(fā)表于 2017-5-30 19:20 | 只看該作者
超聲波測水位嚴重不準,測水上漂浮物還可以。
回復(fù)

使用道具 舉報

10#
ID:318695 發(fā)表于 2018-4-28 23:29 | 只看該作者
可以用一個連通器,測得就準了
回復(fù)

使用道具 舉報

11#
ID:305386 發(fā)表于 2018-7-17 10:46 | 只看該作者
其實可以用共陰極的數(shù)碼管來顯示,而且電路圖幾乎跟你一樣,不用到鎖存器。
求黑幣,求黑幣,求黑幣。。。
#include<reg51.h>
#include<intrins.h>
#define uint  unsigned int   
#define uchar unsigned char
sbit c=P2^0;                  //
sbit b=P2^1;
sbit a=P2^2;
sbit d=P2^3;
sbit trig=P2^4;
sbit echo=P2^5;
uint time=0;
uint timer=0;
uchar posit=0;
unsigned long s=0;
bit  flag =0;
unsigned char code WE0[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//uchar temp[3];    //測距接收緩沖區(qū)        
void delay(uint z)
{
    uchar x,y;
    for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}

void display() //顯示函數(shù)
{

a=1,b=0,c=0,d=0;
P0=WE0[s/100];
delay(25);
P0=0x00;

a=0,b=1,c=0,d=0;
P0=WE0[s%100/10];
delay(25);
P0=0x00;

a=0;b=0;c=1;d=0;
P0=WE0[s%100%10];
delay(25);
P0=0x00;
}

void time0() interrupt 1
{
   flag=1;
}
void StartModule()         //啟動模塊
{
   trig=1;                  //啟動一次模塊
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   //delay(20000);
   trig=0 ;
}
void count()
{
   time=TH0*256+TL0;
   TH0=0;
   TL0=0;
   s=(time*1.7)/100;     //算出來是CM
   display();
}
void main()
{     
    TMOD=0x01;                       //設(shè)T0、T1為方式1,GATE=1;
    TH0=0;
    TL0=0;         
    ET0=1;                          //允許T0中斷
        EA=1;
//        uint z;                                                          //開啟總中斷
           while(1)
    {
                StartModule();
                while(!echo);                     //當(dāng)UL_RX為零時等待
                TR0 = 1;                           //開啟計數(shù)
                while(echo);                      //當(dāng)UL_RX為1計數(shù)并等待
                TR0 = 0;
                count();
    }
}
回復(fù)

使用道具 舉報

12#
ID:450090 發(fā)表于 2018-12-19 18:06 | 只看該作者
做一個相減就行
回復(fù)

使用道具 舉報

13#
ID:450546 發(fā)表于 2018-12-20 10:56 | 只看該作者
已知水塔深度的話 做減法 水塔深度未知的話 這種方式水塔有水的情況下測量不到水塔深度的
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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