wwwxxx国产_337p日本欧洲亚洲大胆张筱雨_免费在线看成人av_日本黄色不卡视频_国产精品成熟老女人_99视频一区_亚洲精品97久久中文字幕_免费精品视频在线_亚洲色图欧美视频_欧美一区二三区

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 19617|回復: 32
收起左側

51單片機超聲波水位控制器設計資料(源碼+PCB+原理圖與實物制作)

  [復制鏈接]
ID:400169 發表于 2018-9-19 19:01 | 顯示全部樓層 |閱讀模式
本設計中液晶顯示有4個字母,分別為
H------容器的最高水位設定值(不能高于實際高度)
L------容器的最低水位設定值
D-----容器實際高度(可以設置)
C-----容器內液體的高度(在實際演示中,障礙物離探頭越近,液晶C顯示越大,因為障礙物好比液面,離探頭近了說明水位高了)

特別提醒:如果容器實際高度D你設置為1米,那么C液體的高度最高能測到98cm,因為探頭的盲區在2cm左右。如果D設為2米,那么最高能測到1.98m.

按鍵功能分別為:設置鍵 增加鍵 減小鍵 復位鍵

三個指示燈的分別功能為:紅色----超過設定的最高水位H  黃色-----低于設定的最低水位L
                        綠色----最高H和最低L中間


本文采用AT89C52單片機系統實現了水塔水位的自動控制,設計出一種低成本、高實用價值的水塔水位控制器。該系統具有水位檢測、水位高度LCD顯示、低水位高水位報警以及自動加水等功能。
本設計過程中主要采用了傳感技術、單片機技術、光報警技術以及弱電控制強電的技術。本設計傳感器使用了超聲波模塊,并且詳細闡述了超聲波測距測的原理,給出了系統構成框圖。此系統具有易控制、工作可靠、測量精度高的優點,可實時監控液位。并采用52單片機系統控制整個電路的信號處理以及采用光電耦合和繼電器來實現弱電控制強電來實現加水系統的自動控制。它能自動完成水位檢測、光報警、上水停水的全部工作循環,保證液面高度始終處于較理想的范圍內,它結構簡單,制造成本低,靈敏度高,節約能源顯著,是用于各種高層液體儲存的理想設備。

示意圖:
QQ截圖20150614105931.png

制作出來的實物圖如下:

實物

實物
0.jpg 0.jpg 0.jpg 0.jpg

Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件):

原理圖

原理圖
0.png 0.png

超聲波水位控制器元件清單
1)    9*15萬用板                                  1
2)    AT89C51單片機                            1
3)    超聲波探頭                                     0
4)    40腳IC座                                    1
5)    4腳排針                                         0
6)    杜邦線4根                                        0
7)    繼電器*2                                        0
8)    LCD1602液晶                               1
9)    103電位器                                     0
10)    16腳IC座                                0
11)    16腳排針                                   1
12)    蜂鳴器                                         0
13)    8550三極管*3                           0
14)    1k電阻*8                                    0
15)    10k電阻                                        0
16)    10uf電容                                      0
17)    30pf電容*2                                 0
18)    12M晶振                                      1
19)    3mmLED(紅、綠各2個,黃1個)       0
20)    輕觸按鍵*4                                 1
21)    自鎖開關                                       1
22)    DC電源插口                                1
23)    USB電源線(電池盒)
24)    直流水泵*2(根據客戶自選)

單片機程序源碼如下:

  1. /***************************************************************
  2.         名稱:基于51單片機的超聲波水位監測報警系統
  3.         單片機型號:AT89C51
  4.         單片機設置:時鐘12T,晶體12MHZ
  5.         作者:學長電子工作室
  6.         注:修改增加水泵控制和排水控制,即雙繼電器
  7. ***************************************************************/

  8. #include <reg51.h>
  9. #include <intrins.h>                // 包含循環移位:_cror_
  10. #include "main.h"     
  11. //----------------------------------------------------------------------

  12. uchar code TabNumASCII[10] =    {'0','1','2','3','4','5','6','7','8','9'};

  13. bool        g_flag = isNo;                //用于標記超時(65.536ms)           
  14. bool        g_flag05s = isNo;        //用于標記0.52秒  
  15. uchar         ucCount = 0;                        //用于計數0.52秒     
  16.    
  17. uint        uiH = 80;                        //設定的最高報警水位 H
  18. uint        uiL = 30;                        //設定的最低報警水位 L
  19. uint        uiD = 100;                         //檢測探頭到水庫底部的距離 D

  20. bool        g_flagSwitch = isNo;                //控制閥門連續開啟間隔延時(保護)標志
  21. bool        g_flagBeepTimer = isNo;        //定時提醒標志
  22.                

  23. //-----------------------------------------------------------------------
  24. // 延時10us
  25. void delay10us(void)                //@12MHz
  26. {
  27.         unsigned char i;

  28.         _nop_();
  29.         i = 2;
  30.         while (--i);
  31. }

  32. // 延時100us
  33. void delay100us(void)                //@12MHz
  34. {
  35.         uchar i;

  36.         _nop_();
  37.         i = 47;
  38.         while (--i);
  39. }

  40. // 延時125us
  41. void delay125us(void)                //@12MHz
  42. {
  43.         unsigned char i;
  44.         i = 60;
  45.         while (--i);
  46. }

  47. // 延時5ms
  48. void delay5ms(void)                //@12.000MHz
  49. {
  50.         unsigned char i, j;

  51.         i = 10;
  52.         j = 183;
  53.         do
  54.         {
  55.                 while (--j);
  56.         } while (--i);
  57. }

  58. // 延時500ms
  59. void delay500ms(void)                //@12MHz
  60. {
  61.         unsigned char i, j, k;

  62.         _nop_();
  63.         i = 4;
  64.         j = 205;
  65.         k = 187;
  66.         do
  67.         {
  68.                 do
  69.                 {
  70.                         while (--k);
  71.                 } while (--j);
  72.         } while (--i);
  73. }

  74. //-----------------------------------------------------------------------
  75. //初始化IO端口                        
  76. void initIO(void)                                       
  77. {
  78.         P0 = 0xff;
  79.         P1 = 0xff;
  80.         P2 = 0xff;
  81.         P3 = 0xff;
  82. }

  83. // 初始化定時器0,定時器時鐘12T模式 模式1,16位 @12.000MHz
  84. void initTimer0(void)               
  85. {
  86.         TMOD &= 0xF0;                //設置定時器模式
  87.         TMOD |= 0x01;                //設置定時器模式
  88.         TL0 = 0;                                //定時器初值清零
  89.         TH0 = 0;                                //定時器初值清零
  90.         //TR0 = 1;                           //開定時器0
  91.     ET0 = 1;                          //開定時器0中斷
  92.     EA = 1;                             //開總中斷            
  93.         
  94. }

  95. // 初始化定時器1,定時器時鐘12T模式 模式1,16位 @12.000MHz
  96. void initTimer1(void)                //50毫秒@12.000MHz
  97. {        
  98.         TMOD &= 0x0F;                //設置定時器模式
  99.         TMOD |= 0x10;                //設置定時器模式
  100.         TL1 = 0xB0;                //設置定時初值
  101.         TH1 = 0x3C;                //設置定時初值        
  102.         TR1 = 1;                //定時器1開始計時
  103.         ET1 = 1;          //開定時器0中斷
  104. }

  105. //-----------------------------------------------------------------------
  106. //定時器0中斷
  107. void zd0(void) interrupt 1                  
  108. {
  109.         
  110.         g_flag = isYes;                                                        //中斷溢出標志,g_flag = isYes超過測距范圍
  111.         if(++ucCount >= 8)
  112.         {
  113.                 ucCount = 0;
  114.                 g_flag05s = isYes;                                        //g_flag05s = isYes定時0.52秒到,用于測量周期延時
  115.         }
  116.         TL0 = 0;                //設置定時初值
  117.         TH0 = 0;                //設置定時初值
  118.         
  119. }


  120. //定時器1中斷 定時50ms
  121. void tm1_isr() interrupt 3 using 1
  122. {
  123.         static uchar count = DATA_switchTime;        //50ms的200倍 = 10S
  124.         static uchar uiCount = 1200;                                //                        = 1分鐘               
  125.         static uint uiCount_BeepTimer = DATA_BeepTimer;

  126.         TL1 = 0xB0;                //設置定時初值
  127.         TH1 = 0x3C;                //設置定時初值

  128.         if (g_flagSwitch == isNo)
  129.         {
  130.                 if (count-- == 0)               //50ms * 200 -> 10s
  131.                 {
  132.                         count = DATA_switchTime;
  133.                         g_flagSwitch = isYes;
  134.                         // TR1 = 0;
  135.                 }
  136.         }        
  137.         
  138.         if(g_flagBeepTimer == isNo)
  139.         {
  140.                 if (uiCount-- == 0)               //= 1分鐘
  141.                 {
  142.                         uiCount = 1200;
  143.                         if(uiCount_BeepTimer-- == 0)
  144.                         {
  145.                                 uiCount_BeepTimer = DATA_BeepTimer;
  146.                                 g_flagBeepTimer = isYes;
  147.                                 // TR1 = 0;
  148.                         }                        
  149.                         
  150.                 }

  151.         }
  152. }

  153. //-----------------------------------------------





  154. //外部中斷1
  155. void exint1() interrupt 2
  156. {
  157.     EX1 = 0;                         //關閉當前中斷
  158.         TR0 = 0;                           //關閉時器0
  159.         
  160. }
  161. //-----------------------------------------------------------------------
  162.   
  163. //讀LCD忙狀態并等待忙狀態結束
  164. void LCD_waitNotBusy(void)
  165. {
  166.         IO_LCD_Data = 0xFF;
  167.         io_LCD_RS = 0;
  168.         io_LCD_RW = 1;
  169.         io_LCD_E = 0;
  170.         _nop_();
  171.         _nop_();
  172.         io_LCD_E = 1;
  173.         while(IO_LCD_Data & 0x80); //檢測如果是忙信號,一直等到不忙
  174. }

  175. //給LCD寫指令
  176. void LCDWriteCommand(uchar command,bool ifReadBusy) //ifReadBusy = 1 時先進行忙檢測
  177. {
  178.         if (ifReadBusy == isReadBusy) LCD_waitNotBusy(); //根據需要檢測忙
  179.         IO_LCD_Data = command;
  180.         io_LCD_RS = 0;
  181.         io_LCD_RW = 0;        
  182.         io_LCD_E = 0;
  183.         _nop_();
  184.         _nop_();
  185.         io_LCD_E = 1;        
  186. }

  187. //給LCD寫數據
  188. void LCDWriteData(uchar dat)
  189. {
  190.         LCD_waitNotBusy(); //等到不忙
  191.         IO_LCD_Data = dat;
  192.         io_LCD_RS = 1;
  193.         io_LCD_RW = 0;
  194.         io_LCD_E = 0;
  195.         _nop_();
  196.         _nop_();
  197.         io_LCD_E = 1;
  198. }




  199. // 初始化LCD1602液晶顯示屏
  200. void initLCD1602(void)
  201. {
  202.         uchar        i;        
  203.         IO_LCD_Data = 0;                                                                // 數據端口清零
  204.         for(i = 0; i < 3; i++)                                                // 設置三次顯示模式
  205.         {
  206.                 LCDWriteCommand(0x38,isNotReadBusy);        // 不檢測忙信號
  207.                 delay5ms();
  208.         }
  209.         
  210.         LCDWriteCommand(0x38,isReadBusy); // 設置顯示模式,檢測忙信號
  211.         LCDWriteCommand(0x08,isReadBusy); // 關閉顯示
  212.         LCDWriteCommand(0x01,isReadBusy); // 顯示清屏
  213.         LCDWriteCommand(0x06,isReadBusy); // 顯示光標移動設置
  214.         LCDWriteCommand(0x0F,isReadBusy); // 顯示開及光標設置
  215. }



  216. //按指定位置顯示一個字符
  217. void putOneCharToLCD1602(uchar line, uchar position, uchar ucData)
  218. {

  219.         line &= DATA_LineMax;
  220.         position &= DATA_PositionMax;
  221.         if (line == DATA_LineTow) position |= 0x40;                         //當要顯示第二行時地址碼+0x40;
  222.         position |= 0x80;                                                                         //設置兩行顯示格式 D7 = 1;
  223.         LCDWriteCommand(position, isReadBusy);                         //發送命令 設置字符地址
  224.         LCDWriteData(ucData);                                                                  //寫入字符的數據        
  225. }

  226. //按指定位置顯示一串字符
  227. void putLineCharsToLCD1602(uchar line, uchar position, uchar count, uchar code *ucData)
  228. {
  229.         uchar i;
  230.         for(i = 0; i < count; i++)                                                        //連續顯示單個字符
  231.         {
  232.                 putOneCharToLCD1602(line, position + i, ucData[i]);        
  233.         }
  234. }


  235. //按指定位置連續顯示三個字符(三位數字)
  236. void        putThreeCharToLCD1602(uchar line, uchar position, uint uiNumber)
  237. {
  238.         uiNumber %= 1000;
  239.         putOneCharToLCD1602(line, position, TabNumASCII[uiNumber / 100]);
  240.         putOneCharToLCD1602(line, ++position, TabNumASCII[uiNumber % 100 / 10]);
  241.         putOneCharToLCD1602(line, ++position, TabNumASCII[uiNumber % 100 % 10]);        
  242.         
  243. }
  244.         


  245. // 按鍵檢測子程序,有鍵按下返回鍵端口數據,無鍵返回0
  246. uchar GetKey(void)
  247. {        
  248.     uchar KeyTemp = (IO_KEY | DATA_KEY_ORL);                //獲取按鍵端口數據        
  249.         
  250.         if( KeyTemp != DATA_KEY_Null )                                // 如果不為空
  251.         {
  252.                 uchar CountTemp = 0;
  253.                 do
  254.                 {
  255.                         delay125us();
  256.                         if(KeyTemp != (IO_KEY | DATA_KEY_ORL)) return 0;        //在延時期間檢測鍵,如果不穩定保持則退出        
  257.                         
  258.                 } while(++CountTemp > Data_Key20msCountMax);                                 // 延時20ms去抖動
  259.                
  260.                 while((IO_KEY | DATA_KEY_ORL) != DATA_KEY_Null);         //等鍵釋放               
  261.                
  262.                 return KeyTemp;        // 有鍵按下返回鍵端口數據
  263.         }
  264.         
  265.         return 0;        // 無有效鍵返回0
  266. }



  267. //加一
  268. uchar  INC_Number(uchar Number, uchar Min, uchar Max)
  269. {
  270.         if(Number >= Max) return Min; else return (++ Number);
  271.                
  272. }

  273. //減一
  274. uchar  DEC_Number(uchar Number, uchar Min, uchar Max)
  275. {
  276.         if(Number <= Min) return Max; else return (-- Number);
  277.                
  278. }

  279. // 檢測到有按鍵后 這里執行按鍵任務                        
  280. void execute_key_task(uchar ucKeyValue)        
  281. {
  282.         uchar state = 0;                                                //定義調整數據的狀態變量
  283.         uchar keyValue = 0;                                        //定義鍵值的臨時變量
  284.         
  285.         if(ucKeyValue != DATA_KEY_Set) return;        //不是設置鍵退出
  286.         
  287.         //是設置鍵繼續-----------------------------------------------------
  288.         
  289.         putLineCharsToLCD1602(lineTow, 8, 8, "C:000cm ");        //清零顯示當前距離CURRENT               
  290.         putThreeCharToLCD1602(lineOne, 8 + 2, uiD);                //光標調整到調整總距離(檢測探頭到水庫底部的距離“D:000cm”)        
  291.         
  292.         while(1)
  293.         {
  294.                 keyValue = GetKey();        
  295.                 if(keyValue == 0) continue;
  296.                
  297.                 switch(keyValue)
  298.                 {
  299.                         case DATA_KEY_Set:
  300.                         {
  301.                                 // 如果按的是設置鍵,順序設置總距離D——高水位H——低水位L——退出
  302.                                 switch(state)
  303.                                 {
  304.                                         case 0:                        // 如果是設置總距離狀態,改變為設置高水位狀態,并顯示高水位,實現移動光標到高水位后面
  305.                                         {
  306.                                                 state = 1;                                                
  307.                                                 putThreeCharToLCD1602(lineOne, 0 + 2, uiH);                                                
  308.                                         }
  309.                                         break;
  310.                                         case 1:
  311.                                         {
  312.                                                 uchar tempMax = uiD - DATA_uiD_Min;
  313.                                                 if(tempMax < 2 + 2) tempMax = 2 + 2;                                                                                       
  314.                                                 if(uiH > tempMax)
  315.                                                 {
  316.                                                         uiH = tempMax;
  317.                                                         putThreeCharToLCD1602(lineOne, 0 + 2, uiH);
  318.                                                 }
  319.                                                 else if(uiH < 2 + 2)
  320.                                                 {
  321.                                                         uiH = 2 + 2;        
  322.                                                         putThreeCharToLCD1602(lineOne, 0 + 2, uiH);
  323.                                                 }                                                        
  324.                                                 state = 2;
  325.                                                 putThreeCharToLCD1602(lineTow, 0 + 2, uiL);
  326.                                         }
  327.                                         break;
  328.                                         case 2:
  329.                                         {
  330.                                                 if(uiL > uiH - 2)
  331.                                                 {
  332.                                                         uiL = uiH - 2;
  333.                                                         putThreeCharToLCD1602(lineTow, 0 + 2, uiL);
  334.                                                 }
  335.                                                 return;        
  336.                                                 
  337.                                         }
  338.                                         break;
  339.                                 }
  340.                                 
  341.                         }
  342.                         break;
  343.                         // 如果按的是增加鍵,改變相應數據并顯示
  344.                         case DATA_KEY_INC:
  345.                         {
  346.                                 switch(state)
  347.                                 {
  348.                                         case 0:
  349.                                         {
  350.                                                 uiD = INC_Number(uiD, DATA_uiD_Min, DATA_uiD_Max);
  351.                                                 putThreeCharToLCD1602(lineOne, 8 + 2, uiD);                                                        
  352.                                         }
  353.                                         break;
  354.                                         case 1:
  355.                                         {
  356.                                                 uchar tempMax = uiD - DATA_uiD_Min;
  357.                                                 if(tempMax < 2 + 2) tempMax = 2 + 2;
  358.                                                 uiH = INC_Number(uiH, 2, tempMax);                                                
  359.                                                 putThreeCharToLCD1602(lineOne, 0 + 2, uiH);        
  360.                                         }
  361.                                         break;
  362.                                         case 2:
  363.                                         {
  364.                                                 uiL = INC_Number(uiL, 0, uiH - 2);        
  365.                                                 putThreeCharToLCD1602(lineTow, 0 + 2, uiL);        
  366.                                         }
  367.                                         break;
  368.                                 }
  369.                                 
  370.                         }
  371.                         break;
  372.                         // 如果按的是減少鍵,改變相應數據并顯示
  373.                         case DATA_KEY_DEC:
  374.                         {
  375.                                 switch(state)
  376.                                 {
  377.                                         case 0:
  378.                                         {
  379.                                                 uiD = DEC_Number(uiD, DATA_uiD_Min, DATA_uiD_Max);                                       
  380.                                                 putThreeCharToLCD1602(lineOne, 8 + 2, uiD);
  381.                                         }
  382.                                         break;
  383.                                         case 1:
  384.                                         {
  385.                                                 uchar tempMax = uiD - DATA_uiD_Min;
  386.                                                 if(tempMax < 2 + 2) tempMax = 2 + 2;
  387.                                                 uiH = DEC_Number(uiH, 2, tempMax);                                                
  388.                                                 putThreeCharToLCD1602(lineOne, 0 + 2, uiH);        

  389.                                         }
  390.                                         break;
  391.                                         case 2:
  392.                                         {
  393.                                                 uiL = DEC_Number(uiL, 0, uiH - 2);        
  394.                                                 putThreeCharToLCD1602(lineTow, 0 + 2, uiL);        

  395.                                         }
  396.                                         break;
  397.                                 }
  398.                                 
  399.                         }
  400.                         break;
  401.                         
  402.                 }
  403.                
  404.         }
  405.         
  406. }



  407. // 蜂鳴器        
  408. void        buzzerCall(void)
  409. {
  410.         uchar        i;
  411.         
  412.                 for(i = 0; i < 90; i++)
  413.                 {
  414.                         io_Buzzer = 0;
  415.                         delay100us();
  416.                         io_Buzzer = 1;
  417.                         delay100us();
  418.                         delay100us();               
  419.                 }
  420.                 delay100us();        
  421.                 delay100us();        
  422. }

  423. //計算水位
  424. bool CalculatedWaterLevel(void)
  425. {
  426.         uchar         i = 8 + 2;                                        //當前水位的數字在LCD屏顯示的起點位置
  427.         uint          uiTime;                                                //聲波傳播時間
  428.         ulong         ulDis;                                                //實時測量到距離        
  429.         
  430.         uiTime = TH0 << 8 | TL0;        
  431.         ulDis = (uiTime * 3.40) / 200;             //計算當前測量的距離,單位cm
  432.         
  433.         TH0 = 0;
  434.         TL0 = 0;        
  435.         
  436.         if((ulDis > uiD) || (g_flag == isYes ))         // ulDis > uiD 超出測量范圍;g_flag == isYes超時;
  437.         {         
  438.                 g_flag = isNo;               
  439.                 TR0 = 0;
  440.                 putLineCharsToLCD1602(lineTow, i, 3, "Err");        // 顯示Err                 
  441.                
  442.                 //閥門動作:               
  443.                 // if(g_flagSwitch == isYes)
  444.                 // {               
  445.                         // io_Control_Inlet = isio_Control_Inlet_OFF;               
  446.                         // io_Control_Outlet = isio_Control_Outlet_ON;
  447.                         // g_flagSwitch = isNo;
  448.                 // }               
  449.                
  450.                 //指示燈:
  451.                 ioLed_Red = ! ioLed_Red;                                                        // 三個燈同時快速閃亮
  452.                 ioLed_Green = ! ioLed_Green;
  453.                 ioLed_Yellow = ! ioLed_Yellow;
  454.                
  455.                 // 蜂鳴器叫:        
  456.                 if(buzzerCallFlag == isCall)
  457.                 {
  458.                         buzzerCall();                                        // 蜂鳴器叫        
  459.                 }
  460.                
  461.                 return isNo;                                                                        // 返回錯誤信息
  462.         }
  463.         else
  464.         {
  465.                 ulDis = uiD - ulDis;                                        // 當前水位C = 總距離 - 當前檢測到的距離
  466.                
  467.                 if(ulDis > uiH)                                                // 如果水位超高
  468.                 {
  469.                         
  470.                         //閥門動作:
  471.                         io_Control_Inlet = isio_Control_Inlet_OFF;
  472.                         io_Control_Outlet = isio_Control_Outlet_ON;        
  473.                         g_flagSwitch = isNo;
  474.                         
  475.                         //指示燈:
  476.                         ioLed_Red = ! ioLed_Red;                        // 紅燈閃
  477.                         ioLed_Green = isLedOFF;               
  478.                         ioLed_Yellow = isLedOFF;                                
  479.                         // 蜂鳴器叫:
  480.                         if(ulDis - uiH > (uiD - uiH) / DATA_alarmCoefficient) //當“當前水位”超出最高水位“ ((“總高度減高水位)除以2的值”)時報警
  481.                         {
  482.                                 buzzerCall();                                        // 蜂鳴器叫
  483.                         }
  484.                         
  485.                 }
  486.                 else if(ulDis < uiL)                                        // 如果水位超低
  487.                 {
  488.                         //閥門動作:        
  489.                         if(g_flagSwitch == isYes)
  490.                         {               
  491.                                 io_Control_Outlet = isio_Control_Outlet_OFF;        
  492.                                 io_Control_Inlet = isio_Control_Inlet_ON;        
  493.                                 g_flagSwitch = isNo;
  494.                         }        
  495.                         
  496.                         //指示燈:
  497.                         ioLed_Red = isLedOFF;
  498.                         ioLed_Green = isLedOFF;
  499.                         ioLed_Yellow = ! ioLed_Yellow;        //黃燈閃
  500.                         // 蜂鳴器叫:                                                
  501.                         if( uiL - ulDis > uiL / DATA_alarmCoefficient)//uiL / 2 當“當前水位”低于“低水位” “低水位除以2的值”時報警
  502.                         {
  503.                                 buzzerCall();                                        // 蜂鳴器叫
  504.                         }
  505.                         
  506.                         
  507.                 }
  508.                 else                                                                // 水位在正常范圍
  509.                 {        
  510.                         ioLed_Red = isLedOFF;
  511.                         ioLed_Green = ! ioLed_Green;
  512.                         ioLed_Yellow = isLedOFF;        
  513.                         
  514.                 }
  515.                 putThreeCharToLCD1602(lineTow, i, ulDis);
  516.                 return isYes;        
  517.                
  518.         }
  519.         return isYes;
  520. }

  521. void main(void)
  522. {
  523.     initIO();            //初始化IO端口   
  524.     delay500ms();         //啟動延時,給器件進入正常工作狀態留夠時間   
  525.     initLCD1602();     //LCD初始化   
  526.     putLineCharsToLCD1602(lineOne, 8, 8, "D:000cm ");    //顯示distance (總)距離(檢測探頭到水庫底部的距離)D
  527.     putThreeCharToLCD1602(lineOne, 8 + 2, uiD);        //顯示三位數值
  528.     putLineCharsToLCD1602(lineOne, 0, 8, "H:000cm ");    //顯示設定的最高報警水位H
  529.     putThreeCharToLCD1602(lineOne, 0 + 2, uiH);        //顯示三位數值
  530.     putLineCharsToLCD1602(lineTow, 0, 8, "L:000cm ");    //顯示設定的最低報警水位L
  531.     putThreeCharToLCD1602(lineTow, 0 + 2, uiL);        //顯示三位數值
  532.     putLineCharsToLCD1602(lineTow, 8, 8, "C:000cm ");    //顯示當前CURRENT水位C
  533.    
  534.     initTimer0();        //初始化定時器0
  535.     initTimer1();
  536.    
  537.     //閥門動作:初始先排水
  538.     io_Control_Inlet = isio_Control_Inlet_OFF;   
  539.     io_Control_Outlet = isio_Control_Outlet_ON;
  540.     g_flagSwitch = isNo;   
  541.    
  542.     while(1)
  543.     {
  544.         io_US_TX = 1;                    //啟動超聲波模塊信號
  545.         delay10us();
  546.         io_US_TX = 0;
  547.         
  548.         while(io_US_RX == 0);            //等待計時開始
  549.         TR0 = 1;                            //開啟定時器0,計時開始   
  550.         IT1 = 1;                         //設置外中斷INT1輸入信號模式(1:Falling only僅下降沿有效 0:Low level低電平有效)
  551.         EX1 = 1;                        //使能外中斷INT1        
  552.         
  553.         while(EX1 == 1 && g_flag == isNo)//等待中斷或超時退出   
  554.         {
  555.             uchar ucKeyValue = GetKey();                    //在等待中檢測按鍵
  556.             if(ucKeyValue) execute_key_task(ucKeyValue);    //如果有鍵按下則執行按鍵任務   
  557.         }
  558.         
  559.         if(CalculatedWaterLevel() == isNo) continue;        //計算水位,如果超出范圍返回isNo并重新循環        
  560.         
  561.         TR0 = 0;        //暫時關閉定時器0
  562.         //清零定時器和計數變量以及標志
  563.         TL0 = 0;        
  564.         TH0 = 0;        
  565.         g_flag = isNo;
  566.         ucCount = 0;
  567.         g_flag05s = isNo;
  568.         
  569.         TR0 = 1;        //打開定時器0                    
  570.         while(g_flag05s == isNo)        //延時0.52秒,以防止此期間返回的超聲波產生錯誤信息,并使顯示變化放慢,保證視覺效果
  571.         {            
  572.             uchar ucKeyValue = GetKey();
  573.             if(ucKeyValue)
  574.             {
  575.                 if(ucKeyValue == DATA_KEY_DEC)
  576.                 {
  577.                     g_flagBeepTimer = isNo;//用減小按鍵取消報警標志
  578.                 }

  579.                 execute_key_task(ucKeyValue);    //如果有鍵按下則執行按鍵任務   
  580.             }               

  581.         }   
  582.         TR0 = 0;        //暫時關閉定時器0
  583.         //清零定時器和復位標志
  584.         TL0 = 0;   
  585.         TH0 = 0;   
  586.         g_flag = isNo;        
  587.         
  588.         //-----------------------------------
  589.         //水箱清洗提示:
  590.         
  591. ……………………

  592. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
51hei.png

全部資料51hei下載地址:
基于單片機超聲波液位控制器設計.7z (4.14 MB, 下載次數: 658)


評分

參與人數 2黑幣 +55 收起 理由
無名小白0 + 5 贊一個!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:137767 發表于 2018-9-19 20:10 | 顯示全部樓層
好資料,謝謝分享。
回復

使用道具 舉報

ID:400659 發表于 2018-9-20 18:30 | 顯示全部樓層
實用,做工也很好,值得學習
回復

使用道具 舉報

ID:401209 發表于 2018-9-24 15:21 來自觸屏版 | 顯示全部樓層
幣不夠怎么辦
回復

使用道具 舉報

ID:89286 發表于 2018-9-25 22:25 | 顯示全部樓層
thanks for sharing
回復

使用道具 舉報

ID:355489 發表于 2018-9-26 21:51 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:104477 發表于 2018-9-28 02:05 來自觸屏版 | 顯示全部樓層
編譯通不過
回復

使用道具 舉報

ID:423360 發表于 2018-11-8 23:58 | 顯示全部樓層
贊一個 好東西
回復

使用道具 舉報

ID:423360 發表于 2018-11-12 01:23 來自觸屏版 | 顯示全部樓層
wylx 發表于 2018-9-19 20:10
好資料,謝謝分享。

你做出來了嗎?。我做完硬件但是顯示不出來。不知道是不是軟件的問題。
回復

使用道具 舉報

ID:423360 發表于 2018-11-12 01:24 來自觸屏版 | 顯示全部樓層
xuiangin@com 發表于 2018-9-20 18:30
實用,做工也很好,值得學習

你做出來了嗎?。我做完硬件但是顯示不出來。不知道是不是軟件的問題。
回復

使用道具 舉報

ID:423360 發表于 2018-11-12 01:25 來自觸屏版 | 顯示全部樓層
faridzled 發表于 2018-9-25 22:25
thanks for sharing

你做出來了嗎?。我做完硬件但是顯示不出來。不知道是不是軟件的問題。
回復

使用道具 舉報

ID:423360 發表于 2018-11-12 01:25 來自觸屏版 | 顯示全部樓層
hjx820 發表于 2018-9-26 21:51
謝謝分享

你做出來了嗎?。我做完硬件但是顯示不出來。不知道是不是軟件的問題。
回復

使用道具 舉報

ID:423360 發表于 2018-11-12 01:26 來自觸屏版 | 顯示全部樓層
hs88 發表于 2018-9-28 02:05
編譯通不過

你做出來了嗎?。我做完硬件但是顯示不出來。不知道是不是軟件的問題。
回復

使用道具 舉報

ID:303383 發表于 2018-11-13 21:26 | 顯示全部樓層
提示: 作者被禁止或刪除 內容自動屏蔽
回復

使用道具 舉報

ID:433349 發表于 2018-11-29 19:19 | 顯示全部樓層
東西不錯,符合預期的設想
回復

使用道具 舉報

ID:476622 發表于 2019-2-22 00:18 | 顯示全部樓層
與光電式液位傳感器有什么區別嗎?
回復

使用道具 舉報

ID:476622 發表于 2019-2-22 00:38 | 顯示全部樓層
用光電式液位傳感器會怎么樣呢
回復

使用道具 舉報

ID:357502 發表于 2019-5-20 11:29 | 顯示全部樓層
感謝分享
回復

使用道具 舉報

ID:357502 發表于 2019-5-21 12:50 | 顯示全部樓層
有protus仿真嗎
回復

使用道具 舉報

20#
無效樓層,該帖已經被刪除
ID:687485 發表于 2020-1-20 08:51 | 顯示全部樓層
這個測試的距離是多少?
回復

使用道具 舉報

ID:732180 發表于 2020-4-27 20:06 | 顯示全部樓層
有大神仿真做出來了嗎,我做出仿真LCD沒有數據顯示
回復

使用道具 舉報

23#
無效樓層,該帖已經被刪除
ID:741892 發表于 2020-5-8 14:47 | 顯示全部樓層
很棒 很實用 很好
回復

使用道具 舉報

ID:749615 發表于 2020-5-12 09:25 | 顯示全部樓層
這個有人實現嗎?
回復

使用道具 舉報

ID:712493 發表于 2020-5-13 14:38 | 顯示全部樓層
那個超聲筆模塊哪里買的?好像有電路在里面
回復

使用道具 舉報

ID:712493 發表于 2020-5-13 14:39 | 顯示全部樓層
超聲波測距跟溫度有關?這個沒有?
回復

使用道具 舉報

ID:76671 發表于 2020-7-7 16:24 | 顯示全部樓層
cce9ed2b23a92c7bf1c5d3747835e98.jpg
開機就顯示000就卡死了,按任何按鍵不會動,重啟也還是這樣,能幫忙看下什么問題嗎?
回復

使用道具 舉報

ID:76671 發表于 2020-7-8 00:03 | 顯示全部樓層
28674500 發表于 2020-7-7 16:24
開機就顯示000就卡死了,按任何按鍵不會動,重啟也還是這樣,能幫忙看下什么問題嗎?

問題解決了,上電要給Trig一個高電平延時0.5S再低電平才能啟動超聲波模塊
現在問題是,通過按鍵設置的參數無法保存,重啟又復原了。
回復

使用道具 舉報

ID:76671 發表于 2020-7-8 11:03 | 顯示全部樓層
還有程序有問題。超過50CM就顯示不準了
回復

使用道具 舉報

31#
無效樓層,該帖已經被刪除
ID:906820 發表于 2021-4-16 15:03 來自觸屏版 | 顯示全部樓層
這個布線怎么布到同一層,
回復

使用道具 舉報

33#
無效樓層,該帖已經被刪除
34#
無效樓層,該帖已經被刪除
35#
無效樓層,該帖已經被刪除
ID:1051985 發表于 2022-11-19 12:38 | 顯示全部樓層
fj51hei 發表于 2020-5-13 14:39
超聲波測距跟溫度有關?這個沒有?

沒有,但是可以增加一個溫度檢測模塊
回復

使用道具 舉報

37#
無效樓層,該帖已經被刪除
ID:34298 發表于 2022-12-29 13:56 | 顯示全部樓層
這篇文章優秀實用
回復

使用道具 舉報

39#
無效樓層,該帖已經被刪除
ID:824664 發表于 2023-3-13 09:21 | 顯示全部樓層
思路清晰,有實用價值,好好學習。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
欧美成人激情| 91香蕉一区二区三区在线观看| 日韩成人短视频| 黄色av网址在线| 永久www成人看片| 亚洲性受xxx喷奶水| 国产韩国精品一区二区三区| 91麻豆精品视频| 91精品国产乱码久久蜜臀| 91精品国产91久久久久| 91精品国产吴梦梦| 北条麻妃在线观看视频| 四虎海外影库www4hu| yw视频在线观看| 欧美一级一片| www.欧美精品一二区| 91精品国产综合久久小美女| 国产精品视频一区国模私拍| 男人亚洲天堂网| 国产精品theporn动漫| 污网站在线观看| 大菠萝精品导航| 国产日韩欧美一区| 精品动漫一区二区三区| 国模私拍一区二区三区| 久久久久久久久久伊人| 少妇久久久久久被弄高潮| 国产免费一级| 国模私拍一区二区国模曼安| 亚洲国产综合在线看不卡| 亚洲福利一区二区三区| 97精品久久久| 一本久道综合色婷婷五月| 天干夜夜爽爽日日日日| 国产黄色网页| 秋霞午夜一区二区三区视频| 国产aⅴ精品一区二区三区色成熟| 日韩一区二区免费在线电影| 国产精品精品软件视频| 自拍偷拍亚洲天堂| 国内精品久久久久久影院8f| 中文字幕在线看片| 日本sm残虐另类| 91麻豆精品国产自产在线 | h网站在线免费观看| 日韩国产一区二区三区| 亚洲精品久久7777| 777777777亚洲妇女| 好男人www社区| a视频免费在线观看| 777电影在线观看| 一区视频在线看| 在线观看免费亚洲| 国产精品一区二区欧美| 九九热久久免费视频| 乱子伦在线视频| 久久免费福利| 国产情人综合久久777777| 欧美黄色www| 色播五月激情五月| www.中文字幕.com| 亚洲成人人体| 波多野结衣在线aⅴ中文字幕不卡| 日韩成人高清在线| 日本高清视频免费在线观看| 亚洲av无码乱码国产精品fc2| 水中色av综合| 国产精品v欧美精品v日本精品动漫| 舔着乳尖日韩一区| 92国产精品久久久久首页 | 91丨精品丨国产| 久久久国产一区二区三区四区小说 | 99免费精品在线观看| 国产亚洲欧美日韩美女| 国产freexxxx性播放麻豆| 亚洲熟妇无码久久精品| 日本在线一区| 久久草视频在线看| 免费在线观看黄色小视频| 成 人免费视频播放| 66精品视频在线观看| 国产精品福利电影一区二区三区四区| 97高清免费视频| 日本中文字幕精品| 四虎精品成人a在线观看| 日韩av免费| 久久久久国色av免费看影院| 91wwwcom在线观看| 好吊一区二区三区视频| 口述被爽到呻吟高潮自述| 日韩成人午夜| 日韩欧美精品网址| 国产伦精品一区二区三区四区免费| 美国黄色小视频| 欧美5-7sexvideos处| 国产精品jizz在线观看美国| 精品少妇一区二区| 丁香六月激情婷婷| 神马久久久久久久久久| 色婷婷综合久久久中字幕精品久久| 91玉足脚交白嫩脚丫在线播放| 久久久久久久久电影| 精品国产av色一区二区深夜久久 | 欧美日夜夜逼| 亚洲精选91| 国产偷亚洲偷欧美偷精品| 欧美视频第一区| 中文字幕久热精品视频免费| 日本一区影院| 精品久久久久久亚洲精品| 日本成人黄色| 国产免费视频一区二区三区| 中文字幕在线视频久| 国产精品乱人伦中文| av一区二区三区免费| www日韩精品| av毛片在线免费看| 91亚洲无吗| 亚洲在线免费播放| 日韩精品无码一区二区三区| 亚洲一区在线观| 日韩av电影资源网| 亚洲成av人片一区二区| 亚洲欧洲日韩综合二区| 俄罗斯嫩小性bbwbbw| 91成人精品观看| 一本久久精品一区二区| 热久久最新地址| 伊人影院蕉久552| 亚洲婷婷伊人| 精品福利一区二区三区 | 国产一级av毛片| a级网站在线播放| 久久精品这里都是精品| 国产精品视频500部| 亚洲网站免费观看| 日韩精品一页| 在线亚洲+欧美+日本专区| 国产真实老熟女无套内射| 美女把尿口扒开让男人桶在线观看| 给我免费播放日韩视频| 色婷婷国产精品综合在线观看| 欧美日韩一区二区三区电影| 性感美女视频一二三| 91成人精品在线| 欧美一级二级三级蜜桃| 欧美成人黑人猛交| 日本免费看黄| 欧美激情综合色综合啪啪| 亚洲欧美在线免费| 美女露出粉嫩尿囗让男人桶| 久草免费资源| 香蕉精品视频在线观看| 国产丝袜一区二区| 亚洲最大视频网| y4480在线8影院| 久久精品国产成人一区二区三区 | 欧美一级片在线观看| 激情六月丁香婷婷| 91野花视频| 国产日韩专区| 97国产精品视频人人做人人爱| 日韩国产第一页| 婷婷av在线| 国产精品免费看片| 91嫩草国产丨精品入口麻豆| 天堂精品高清1区2区3区| 成人影院天天5g天天爽无毒影院 | 黄色免费一级视频| 最新国产在线观看| 最新热久久免费视频| 亚洲精品日韩精品| 欧美黑人xxxxx性受| 99久久婷婷国产综合精品电影√| 蜜桃精品在线| 伊人久久大香线蕉综合网站| 欧美日韩二区三区| 免费av观看网址| 影音av在线| 视频一区二区三区中文字幕| 久久久久久国产精品久久| 91狠狠综合久久久| 2020av在线| 亚洲成av人片一区二区梦乃 | 第四色亚洲色图| 日韩av在线播放中文字幕| 亚洲免费观看高清完整| 国产精品av免费观看| 亚洲国产成人综合| 国产精品日韩| 国产成人精品999| 国产精品调教| 日韩欧美一区二区在线视频| caoporm在线视频| 中文字幕在线免费播放| 成人免费va视频| 久久影视中文粉嫩av| 影音日韩av| 狠狠色丁香久久综合频道| 久久久久久com| 好吊色在线视频| 欧美日日夜夜| 日韩日本欧美亚洲| 中文字幕免费观看| 国产成人福利av| 国产一区二区三区中文| 国产suv一区二区三区| 嫩草伊人久久精品少妇av杨幂| 精品久久久三级丝袜| 中文字幕欧美精品在线| 少妇大叫太粗太大爽一区二区| 美女写真理伦片在线看| 中文字幕欧美日韩一区| 国内自拍中文字幕| 男女无套免费网站| 91香蕉视频mp4| 美女黄色片网站| 又黄又爽无遮挡| 欧美经典一区二区| 亚洲 欧美 日韩 国产综合 在线| 国产字幕中文| 中文无字幕一区二区三区| 大胆欧美熟妇xx| 免费观看一二区视频网站| 久久久噜噜噜久久人人看| 欧洲一区二区在线观看| 福利视频网站导航| 久久机这里只有精品| 久久99久久99精品蜜柚传媒| 水蜜桃免费高清视频在线播放| 国产老妇另类xxxxx| 日本婷婷久久久久久久久一区二区| 极品白嫩少妇无套内谢| 永久免费在线观看视频| 亚洲成人手机在线| 久久6免费视频| 成年人黄视频在线观看| 欧美一区二区啪啪| 亚洲精品天堂网| 精品国产亚洲日本| yellow中文字幕久久| 五月天综合在线| 日韩aaaa| 国产福利精品在线| 天堂精品高清1区2区3区| 久久国产尿小便嘘嘘| 国产精品久久久久久久9999| 精品网站www| 成人性生交大片| 妺妺窝人体色www看人体| 嫩模私拍啪啪| 亚洲午夜精品久久久久久久久| 在线成人免费av| 极品在线视频| 亚洲欧美国产另类| 中文字幕欧美人妻精品一区蜜臀 | 日本免费看片网站| 国产图片一区| 午夜精品在线观看| 午夜成人免费影院| 另类成人小视频在线| 欧美少妇在线观看| 午夜影院在线免费观看| 欧美日韩国产大片| 久久久久亚洲AV成人| 九九视频免费观看视频精品 | 亚洲不卡1区| 最色在线观看| 欧美日韩mp4| 久久久久成人片免费观看蜜芽| 亚洲涩涩av| 91视频免费网站| av电影在线观| 亚洲国产一区在线观看| 人人妻人人澡人人爽人人精品| 五月婷婷视频在线观看| 一区二区三区无码高清视频| 国产又粗又猛又爽| 天堂成人免费av电影一区| 国产又爽又黄ai换脸| 成人日韩欧美| 亚洲国产精品国自产拍av秋霞| 久久精品久久久久久久| 亚洲一区二区成人| 亚洲一区二区高清视频| 日韩有码电影| 欧美一级专区免费大片| 丰满少妇乱子伦精品看片| 好看的日韩av电影| 亚洲国产欧美日韩| 一级香蕉视频在线观看| 日韩精品一区二区三区老鸭窝| 中文字幕免费观看| 视频一区在线播放| 阿v天堂2018| 日本视频不卡| 亚洲女人天堂成人av在线| 99国产在线播放| 国产麻豆精品theporn| 九九热99视频| 精品一区二区三区免费看| 国产精品久久视频| 网上成人av| 在线日韩av片| 九九热在线免费观看| 小嫩嫩精品导航| 黄色大片中文字幕| 午夜激情在线播放| 久久久久中文字幕| 日日夜夜网站| 欧美色另类天堂2015| 无码人妻一区二区三区免费| 免费成人在线观看视频| 日韩在线第三页| 亚洲精品无播放器在线播放| 亚洲伊人久久综合| 久草在线资源视频| 亚洲国产成人精品女人久久久 | 久久网站热最新地址| 成年人小视频在线观看| 色愁久久久久久| 日韩高清专区| 色呦呦在线免费观看| 九九热精品在线| 巨大黑人video| 中文字幕av一区二区三区谷原希美| xxxx国产视频| 极品束缚调教一区二区网站| av在线不卡一区| 免费在线高清av| 亚洲系列中文字幕| 午夜18视频在线观看| 亚洲欧美一区二区三区国产精品| 一级免费黄色录像| 亚洲女同同性videoxma| 欧美日韩福利在线| 日韩在线亚洲| 农村寡妇一区二区三区| 中文字幕伦理免费在线视频| 国自在线精品视频| 成人免费淫片95视频观看网站| 在线成人av影院| 三级在线观看网站| 午夜精品久久久久| 少妇一级淫片日本| www.99精品| 精品人妻一区二区三区蜜桃视频| av成人激情| 色播五月激情五月| 国产日产精品_国产精品毛片| 日本免费高清一区二区| 日本韩国欧美| 国产成人精品福利一区二区三区| 色大18成网站www在线观看| 欧美二区在线播放| 中文在线а√在线| 一个人看的www久久| 天堂在线免费视频| 在线观看日韩国产| 免费永久视频| 色综合久久综合网97色综合| 国产农村妇女毛片精品| 一卡二卡欧美日韩| 在线观看亚洲一区二区| 久久久精品国产免大香伊| 欧美卡一卡二卡三| aaa国产一区| 欧美黄色aaa| 国产精品99久久久久久久vr| www.99re6| 国产制服丝袜一区| 伊人网在线视频观看| 男女精品视频| 国产三级av在线播放| 国产欧美日韩亚洲一区二区三区| 人妻无码视频一区二区三区| 国产精选一区| 欧美日韩国产精品激情在线播放| 欧美日一区二区| 激情六月丁香婷婷| 日本精品黄色| 国产九九在线视频| 婷婷综合五月| 婷婷免费在线观看| 一区二区三区在线观看免费| 91人妻一区二区三区| 亚洲精品美女91| 精品影片一区二区入口| 麻豆专区一区二区三区四区五区| 大又大又粗又硬又爽少妇毛片 | 国产成人精品一区二区在线小狼| 综合av在线| 182在线视频| 美女诱惑一区| caopeng视频| 日本中文在线一区| 九九免费精品视频| 久久夜色精品一区| 无码视频一区二区三区| 午夜精品久久久久久久|