久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2308|回復: 0
打印 上一主題 下一主題
收起左側

單片機超聲波水位檢測系統溫度補償報警器 求幫助

[復制鏈接]
跳轉到指定樓層
樓主

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

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

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

  12. bool        g_flag = isNo;                //用于標記超時(65.536ms)           
  13. bool        g_flag05s = isNo;        //用于標記0.52秒  
  14. uchar         ucCount = 0;                        //用于計數0.52秒     

  15. uint        uiH = 80;                        //設定的最高報警水位 H
  16. uint        uiL = 30;                        //設定的最低報警水位 L
  17. uint        uiD = 100;                         //檢測探頭到水庫底部的距離 D

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

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

  26.         _nop_();
  27.         i = 2;
  28.         while (--i);
  29. }

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

  34.         _nop_();
  35.         i = 47;
  36.         while (--i);
  37. }

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

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

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

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

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

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

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

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

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


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

  124.         TL1 = 0xB0;                //設置定時初值
  125.         TH1 = 0x3C;                //設置定時初值

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

  149.         }
  150. }

  151. //-----------------------------------------------





  152. //外部中斷1
  153. void exint1() interrupt 2
  154. {
  155.     EX1 = 0;                         //關閉當前中斷
  156.         TR0 = 0;                           //關閉時器0
  157.         
  158. }
  159. //-----------------------------------------------------------------------

  160. //讀LCD忙狀態并等待忙狀態結束
  161. void LCD_waitNotBusy(void)
  162. {
  163.         IO_LCD_Data = 0xFF;
  164.         io_LCD_RS = 0;
  165.         io_LCD_RW = 1;
  166.         io_LCD_E = 0;
  167.         _nop_();
  168.         _nop_();
  169.         io_LCD_E = 1;
  170.         while(IO_LCD_Data & 0x80); //檢測如果是忙信號,一直等到不忙
  171. }

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

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




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



  213. //按指定位置顯示一個字符
  214. void putOneCharToLCD1602(uchar line, uchar position, uchar ucData)
  215. {

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

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


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


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



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

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

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

  386.                                         }
  387.                                         break;
  388.                                         case 2:
  389.                                         {
  390.                                                 uiL = DEC_Number(uiL, 0, uiH - 2);        
  391.                                                 putThreeCharToLCD1602(lineTow, 0 + 2, uiL);        

  392.                                         }
  393.                                         break;
  394.                                 }
  395.                                 
  396.                         }
  397.                         break;
  398.                         
  399.                 }
  400.                
  401.         }
  402.         
  403. }



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

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

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

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

  579.                 }        
  580.                 TR0 = 0;                //暫時關閉定時器0
  581.                 //清零定時器和復位標志
  582.                 TL0 = 0;        
  583.                 TH0 = 0;        
  584.                 g_flag = isNo;               
  585.                
  586.                 //-----------------------------------
  587.                 //水箱清洗提示:
  588.                
  589.                 if(g_flagBeepTimer == isYes)
  590.                 {
  591.                         buzzerCall();               
  592.                         //用減小按鍵取消報警標志
  593.                         
  594.                 }
  595.                 //-----------------------------------
  596.                
  597.         }
  598. }





  599. #ifndef __MAIN_H__
  600. #define __MAIN_H__

  601. //-----------------------------------------------
  602. typedef unsigned char         uchar;        //為了方便書寫定義別名
  603. typedef unsigned int         uint;
  604. typedef unsigned long         ulong;
  605. typedef        bit                                bool;

  606. sbit         io_Control_Inlet = P1 ^ 7;        //定義進水繼電器(水泵)控制端口
  607. #define        isio_Control_Inlet_ON         0
  608. #define        isio_Control_Inlet_OFF         1

  609. sbit         io_Control_Outlet = P0 ^ 0;        //定義出水繼電器(水泵)控制端口
  610. #define        isio_Control_Outlet_ON         0
  611. #define        isio_Control_Outlet_OFF         1

  612. #define         isYes                1
  613. #define        isNo                0
  614. //----------------------------------------------------
  615. //定義超聲波模塊引腳
  616. sbit         io_US_RX          =        P3 ^ 3;        
  617. sbit         io_US_TX          =        P3 ^ 2;
  618. //----------------------------------------------------
  619. //定義LCD引腳
  620. sbit         io_LCD_RW          =        P3 ^ 6;
  621. sbit         io_LCD_RS          =        P3 ^ 7;
  622. sbit         io_LCD_E           =        P3 ^ 5;            
  623. #define          IO_LCD_Data                  P2
  624. #define         lineOne                        0
  625. #define         lineTow                        1

  626. #define        isReadBusy        1
  627. #define        isNotReadBusy        0

  628. #define        DATA_LineMax                0x01                //LCD最大的行索引數
  629. #define        DATA_PositionMax        0x0F                //(16 - 1) 字符在LCD一行中的最后一個索引位置
  630. #define        DATA_LineTow                0x01                //LCD第二行的索引值
  631. //-------------------------------------------
  632. #define        Data_Key20msCountMax        160        //125us * 160 = 20ms 鍵去抖動延時
  633. //-------------------------------------------------
  634. // 定義指示燈端口
  635. sbit        ioLed_Red = P1 ^ 3;
  636. sbit        ioLed_Green = P1 ^ 2;
  637. sbit        ioLed_Yellow = P1 ^ 1;

  638. #define        isLedOFF                1                        // 關閉LED
  639. #define        isLedON                0                        // 點亮LED
  640. //---------------------------------------------
  641. //定義按鍵端口
  642. #define        IO_KEY                                P1        

  643. #define        DATA_KEY_ORL                        0x8f        //10001111        //過濾按鍵以外的端口的數據
  644. #define        DATA_KEY_Null                        0xff        //11111111        //無鍵按下的數據

  645. #define        DATA_KEY_Set                        0xef        //11101111        //設置時間按鍵按下的數據
  646. #define        DATA_KEY_INC                        0xdf        //11011111        //增加鍵按下的數據
  647. #define        DATA_KEY_DEC                        0xbf        //10111111        //減少鍵按下的數據
  648. //---------------------------------------------
  649. //定義蜂鳴器端口
  650. sbit        io_Buzzer        =        P1 ^ 0;        
  651. //---------------------------------------------
  652. //定義檢測探頭到水庫底部的設定距離范圍
  653. #define        DATA_uiD_Min                20                // 定義檢測探頭到水庫底部的最小設定距離 單位cm
  654. #define        DATA_uiD_Max                255                // 定義檢測探頭到水庫底部的最大設定距離 單位cm

  655. #define        DATA_alarmCoefficient        2                // 超限報警閥值的系數
  656. #define        DATA_switchTime        200                //50ms的200倍 = 10S,控制閥門連續開啟間隔延時(保護)
  657. #define        DATA_BeepTimer        100                // 清洗水箱提示:分鐘的倍數

  658. sbit        buzzerCallFlag = P3 ^ 4;
  659. #define        isCall        0
  660. #endif
復制代碼

1-程序.zip

87.12 KB, 下載次數: 28, 下載積分: 黑幣 -5

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品免费在线观看 | av毛片在线免费观看 | 国产在线观看一区二区三区 | 久久爆操| 日本高清中文字幕 | 美女黄色在线观看 | 欧洲亚洲精品久久久久 | 亚洲精品国产a久久久久久 中文字幕一区二区三区四区五区 | 我要看免费一级毛片 | 亚洲欧美成人影院 | 91精品91久久久| 亚洲狠狠爱 | 亚洲午夜在线 | 成人免费视屏 | 日本精品国产 | 日韩视频在线一区 | 国产精品成人一区二区 | 亚洲精品福利视频 | www免费视频 | 国产一区二区免费 | 一级大黄色片 | 亚洲国产精品一区二区久久 | 欧美激情精品久久久久久变态 | 日韩一区二区三区av | 性高湖久久久久久久久 | av电影一区 | 黄色免费在线观看 | 国产情侣一区 | 亚洲日日 | 欧美一级一 | 国产福利在线看 | 国产精品国产亚洲精品看不卡15 | 久久久精品一区二区三区 | 久草院线| 成年人的视频免费观看 | 亚洲二区视频 | 久久久国产一区二区三区四区小说 | 免费在线成人网 | 一级黄在线观看 | 国产精品嫩草影院精东 | 激情a |