欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 單片機花卉自動澆水電路原理圖與源程序 [打印本頁]

作者: henanda    時間: 2018-5-27 08:53
標題: 單片機花卉自動澆水電路原理圖與源程序
花卉自動澆水系統仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)




我的畢業設計,自動澆水系統的仿真程序,是基于單片機的

單片機源碼如下:
  1. #include <reg52.h>
  2. #include <intrins.h>




  3. #define uchar unsigned char
  4. #define uint  unsigned int


  5. sbit         Key_Min=P3^5;
  6. sbit         Key_Add=P3^6;
  7. sbit         Key_Set=P3^7;
  8. sbit         Key_Mode=P1^0;


  9. sbit         Key_Low=P1^2;
  10. sbit         Key_High=P1^3;


  11. sbit led1=P3^2;        //綠燈,澆水狀態,與繼電器同步
  12. sbit led2=P3^3;        //黃燈,水位上限
  13. sbit led3=P3^4;        //紅燈,水位下限
  14. //------------繼電器引腳-------------------
  15. sbit          JD=P2^1;
  16. sbit sw=P1^6;
  17. sbit BEEP=P2^0;
  18. uchar HumTab=0;                        //溫度澆水時上下限切換的標志,記錄是上一個狀態,0是缺少,1是盛水。
  19. sbit rs=P2^5;    //命令/數據選擇
  20. sbit rw=P2^6;    //讀寫口
  21. sbit  e=P2^7;    //鎖存控制


  22. sbit DQ = P1^5;
  23. bit DS18B20_IS_OK = 1; //DS18B20 正常標志
  24. uchar Temp_Value[]={0x00,0x00}; //讀到的溫度值
  25. #define  NOP()   _nop_()   /* 定義空指令 */
  26. #define  _Nop()  _nop_()   /*定義空指令*/




  27. uchar ThresholdL=20;        //濕度閥值下限,低于這個值就開始澆水;
  28. uchar ThresholdH=50;        //濕度閥值上限,澆水超過這個值就停止澆水
  29. uchar code df_Table[]={ 0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9 };
  30. uchar Display_Digit[]={0,0,0,0};
  31. uchar CurrentT = 0;
  32. float time=0.0;
  33. long distance=0.0;
  34. int  num=0,num1=0;






  35. //**************************************************************************************************
  36. //延時函數
  37. //**************************************************************************************************
  38. void delay(uint time)         //int型數據為16位,所以最大值為65535            
  39. {
  40.   uint  i,j;             //定義變量i,j,用于循環語句
  41.   for(i=0;i<time;i++)    //for循環,循環50*time次
  42.      for(j=0;j<100;j++); //for循環,循環50次
  43. }
  44. void Delay1(uint x) //延時 2
  45. {
  46.         while(x--);
  47. }
  48. //**************************************************************************************************
  49. //向LCD寫一命令
  50. //**************************************************************************************************
  51. void wcode(uchar t)
  52. {
  53.   rs=0;           // 寫的是命令
  54.   rw=0;           // 寫狀態
  55.   e=1;            //使能
  56.   P0=t;           //寫入命令
  57.   delay(20);      //等待寫入,如果時間太短,會導致液晶無法顯示
  58.   e=0;            //數據的鎖定
  59. }


  60. //**************************************************************************************************
  61. //向LCD寫一數據
  62. //**************************************************************************************************
  63. void wdata(uchar t)
  64. {
  65.   rs=1;          // 寫的是數據
  66.   rw=0;          // 寫狀態
  67.   e=1;           //使能
  68.   P0=t;          //寫入數據
  69.   delay(20);     //等待寫入,如果時間太短,會導致液晶無法顯示
  70.   e=0;           //數據的鎖定
  71. }
  72. //**************************************************************************************************
  73. //LCD顯示第一行
  74. //**************************************************************************************************
  75. void xian1(uchar *dis)
  76. {
  77.   uchar i;
  78.   wcode(0x80);          //設置第一行顯示地址
  79.   for(i=0;i<16;i++)     //循環16次,寫完1行
  80.     {
  81.       wdata(dis[ i]);   //寫入該行數據[ i]
  82.     }
  83. }
  84. //**************************************************************************************************
  85. //LCD顯示第二行
  86. //**************************************************************************************************
  87. void xian2(uchar *str)
  88. {
  89.    uchar i;
  90.    wcode(0xc0);        //設置第二行顯示地址
  91.    for(i=0;i<16;i++)   //循環16次,寫完1行
  92.     {
  93.       wdata(str[ i]);  //寫入該行數據[ i]
  94.     }
  95. }
  96. //**************************************************************************************************
  97. //LCD 初始化
  98. //**************************************************************************************************
  99. void InitLCD()
  100.    {                  
  101.    wcode(0x01);          //清屏
  102.    wcode(0x06);   //輸入方式控制,增量光標不移位
  103.    wcode(0x0c);   //顯示開關控制
  104.    wcode(0x38);   //功能設定:設置16x2顯示,5x7顯示,8位數據接口            
  105.    }  
  106. /*********************************************************/
  107. // 液晶光標定位函數
  108. /*********************************************************/
  109. void LcdGotoXY(uchar line,uchar column)
  110. {
  111.     if(line==1)        // 第一行
  112.         wcode(0x80+column-1);
  113.     if(line==2)        // 第二行
  114.         wcode(0xC0+column-1);
  115. }
  116. /*********************************************************/
  117. // 液晶輸出數字
  118. /*********************************************************/
  119. void LcdPrintNum(uchar num)
  120. {


  121.         wdata(num/10%10+0x30);                    
  122.         wdata(num%10+0x30);        


  123. }


  124. void delay100us(void)   //誤差 0us
  125. {
  126.     unsigned char a,b;
  127.     for(b=19;b>0;b--)
  128.         for(a=1;a>0;a--);
  129. }




  130. uchar Init_DS18B20() //初始化(或者說復位) DS18B20
  131. {
  132.         uchar status;
  133.         DQ = 1;
  134.         Delay1(8);
  135.         DQ = 0;
  136.         Delay1(90);
  137.         DQ = 1;
  138.         Delay1(8);
  139.         status=DQ;Delay1(100);
  140.         DQ = 1;
  141.         return status;
  142. }
  143. uchar ReadOneByte() //從 DS18B20 讀一字節數據
  144. {
  145.         uchar i,dat=0;
  146.         DQ = 1;
  147.         _nop_();
  148.         for(i=0;i<8;i++)
  149.         {
  150.                 DQ = 0;
  151.                 dat >>= 1;
  152.                 DQ = 1;
  153.                 _nop_();
  154.                 _nop_();
  155.                 if(DQ)
  156.                 dat |= 0X80;
  157.                 Delay1(30);
  158.                 DQ = 1;
  159.         }
  160.         return dat;
  161. }
  162. void WriteOneByte(uchar dat) //從 DS18B20 寫一字節數據
  163. {
  164.         uchar i;
  165.         for(i=0;i<8;i++)
  166.         {
  167.                 DQ = 0;
  168.                 DQ = dat& 0x01;
  169.                 Delay1(5);
  170.                 DQ = 1;
  171.                 dat >>= 1;
  172.         }
  173. }
  174. void Read_Temperature() //從 DS18B20 讀取溫度值
  175. {
  176.         if(Init_DS18B20()==1) //DS18B20 故障
  177.                 DS18B20_IS_OK=0;
  178.         else
  179.         {        
  180.                 WriteOneByte(0xcc); //跳過序列號命令
  181.                 WriteOneByte(0x44); //啟動溫度轉換命令
  182.                 Init_DS18B20(); //復位 DS18B20 ( 每一次讀寫之前都要對 DS18B20 進行復位操作)
  183.                 WriteOneByte(0xcc); //跳過序列號命令
  184.                 WriteOneByte(0xbe); //讀取溫度寄存器
  185.                 Temp_Value[0] = ReadOneByte(); //讀取溫度低 8 位(先讀低字節,再讀高字節,)
  186.                 Temp_Value[1] = ReadOneByte();//讀取溫度高 8 位 (每次只能讀一個字節)
  187.                 DS18B20_IS_OK=1; //DS18B20 正常
  188.         }
  189. }
  190. void Display_Temperature() //在 1602LCD 上顯示當前溫度
  191. {
  192.         
  193.         uchar t = 150, ng = 0; //延時值與負數標志
  194.         if((Temp_Value[1]&0xf8)==0xf8) //高字節高 5 位如果全為 1,則為負數,為負數時取反
  195.         { //加 1,并設置負數標志為 1
  196.                 Temp_Value[1] = ~Temp_Value[1];
  197.                 Temp_Value[0] = ~Temp_Value[0]+1;
  198.                 if(Temp_Value[0]==0x00) //若低字節進位,則高字節加 1
  199.                         Temp_Value[1]++;
  200.                         ng = 1; //設置負數標志為 1
  201.         }
  202.         Display_Digit[0] = df_Table[Temp_Value[0]&0x0f]; //查表得到溫度小數部分
  203.         //獲取溫度整數部分(低字節低 4 位清零,高 4 位右移 4 位) +(高字節高 5 位清零,
  204.         //低三位左移 4 位)
  205.         CurrentT = ((Temp_Value[0]&0xf0)>>4) | ((Temp_Value[1]&0x07)<<4);
  206.         //將溫度整數部分分解為 3 位待顯示數字
  207.         Display_Digit[3] = CurrentT/100;
  208.         Display_Digit[2] = CurrentT%100/10;
  209.         Display_Digit[1] = CurrentT%10;
  210.         //刷新 LCD 緩沖 //加字符 0 是為了將待數字轉化為字符顯示
  211.         LcdGotoXY(2,3);
  212.         wdata(Display_Digit[2]+'0');
  213.         wdata(Display_Digit[1]+'0');
  214.         wdata('.');
  215.         wdata(Display_Digit[0]+'0');
  216. }
  217. void delay10ms(void)   //誤差 -0.000000000001us
  218. {
  219.     unsigned char a,b,c;
  220.     for(c=7;c>0;c--)
  221.         for(b=168;b>0;b--)
  222.             for(a=22;a>0;a--);
  223. }
  224. void WateringIntelligence()        //智能控制模式
  225. {
  226.         //--------------設置濕度上下限函數----
  227.     {
  228.                    JD=1;
  229.                 wcode(0x0f);                                   // 顯示光標,并閃爍
  230.                 //delay10ms();
  231.                 while(Key_Set==0);                                // 等待按鍵釋放
  232.                 //delay10ms();
  233.                 wcode(0x01);                            // 清屏
  234.                 xian1("Humidity   Set  ");                                 // 顯示 "Humidity Set" (第一行)
  235.                 xian2("      -   %RH   ");                                        // 顯示“  -   %RH  ” (第二行)
  236.                 LcdGotoXY(2,5);
  237.                 LcdPrintNum(HumiLowTemp);
  238.                 LcdGotoXY(2,8);
  239.                 LcdPrintNum(HumiHigTemp);
  240.                 LcdGotoXY(2,6);
  241.                 /*****濕度下限值設置******************************************
  242.                 ------------------------------------------------------------*/
  243.                 while(Key_Set!=0)
  244.                 {
  245.                         if(Key_Min==0)                                                // 濕度下限值 減
  246.                         {
  247.                                 HumiLowTemp--;
  248.                                 if(HumiLowTemp<0)
  249.                                         HumiLowTemp=0;
  250.                                 LcdGotoXY(2,5);                                        // 顯示濕度下限值
  251.                                 LcdPrintNum(HumiLowTemp);               
  252.                                 LcdGotoXY(2,6);
  253.                                 delay(500);                                       
  254.                         }
  255.                         if(Key_Add==0)                                                // 濕度下限值 加
  256.                         {
  257.                                   HumiLowTemp++;
  258.                                 if(HumiLowTemp==100)
  259.                                         HumiLowTemp=99;
  260.                                 LcdGotoXY(2,5);                                          // 顯示濕度下限值
  261.                                 LcdPrintNum(HumiLowTemp);               
  262.                                 LcdGotoXY(2,6);
  263.                                 delay(500);        
  264.                         }
  265.                 }
  266.                 //delay10ms();
  267.                 while(Key_Set==0);                                                // 等待按鍵釋放
  268.                 //delay10ms();
  269.                 LcdGotoXY(2,9);        
  270.                 while(Key_Set!=0)                                                // 如果按鍵1按下,那么跳到下一級設置,否則是濕度上限值的大小設置
  271.                 {
  272.                         if(Key_Min==0)                                                // 濕度上限值 減
  273.                         {
  274.                                 HumiHigTemp--;
  275.                                 if(HumiHigTemp<0)
  276.                                         HumiHigTemp=0;
  277.                                 LcdGotoXY(2,8);                                        // 顯示濕度上限值
  278.                                 LcdPrintNum(HumiHigTemp);
  279.                                 LcdGotoXY(2,9);
  280.                                 delay(500);               
  281.                         }
  282.                         if(Key_Add==0)                                                // 濕度上限值 加
  283.                         {
  284.                                 HumiHigTemp++;
  285.                                 if(HumiHigTemp==100)
  286.                                         HumiHigTemp=99;
  287.                                 LcdGotoXY(2,8);                                        // 顯示度上限值
  288.                                 LcdPrintNum(HumiHigTemp);
  289.                                 LcdGotoXY(2,9);
  290.                                 delay(500);                        
  291.                         }                                                        
  292.                 }
  293.                 //delay10ms();
  294.                 while(Key_Set==0);                                                // 等待按鍵釋放
  295.                 //delay10ms();
  296.                 wcode(0x0c);
  297.                
  298.                 ThresholdL=HumiLowTemp;                // 更新濕度下限報警值
  299.                 ThresholdH=HumiHigTemp;                // 更新濕度上限報警               
  300.                
  301.                 InitLCD();           //初始化1602  
  302.                    xian1("Watering System ");           //顯示第一行           
  303.                    xian2("T:   C H:  %RH  ");       //顯示第二行                  
  304.                 LcdGotoXY(2,5);
  305.                 wdata(0xdf);                        
  306.                
  307.         }        


  308.         if(sw==0)                   //當前溫度低于閾值下限,澆水        
  309.         {        
  310.                 JD=0;        
  311.                 led1=0;        
  312.                 HumTab=0;
  313.                 LcdGotoXY(2,10);
  314.                 LcdPrintNum(19);
  315.                                 
  316.         }               
  317.         else        //當前溫度高于閾值上限,停止澆水        
  318.         {        
  319.                 JD=1;        
  320.                 led1=1;        
  321.                 HumTab=1;
  322.                 LcdGotoXY(2,10);
  323.                 LcdPrintNum(53);        
  324.         }                        


  325. }               


  326. //水位檢測函數
  327. void CheckWaterLevel()
  328. {
  329.         if(Key_Low==1&&Key_High==1)//高低水位都沒水
  330.         {
  331.                    led3=0;                         //下水位,快沒水了
  332.                 led2=1;
  333.                 BEEP=0;                        //蜂鳴器報警
  334.         }


  335.         else if(Key_Low==0&&Key_High==0)//低水位有水,高水位有水,水滿了
  336.         {
  337.                 led3=1;
  338.                 led2=0;
  339.                 BEEP=0;
  340.         }        
  341.           else
  342.           {
  343.         led3=1;
  344.                 led2=1;
  345.                 BEEP=1;


  346.           }
  347. }               
  348. void main()
  349. {


  350.         InitLCD();           //初始化1602  


  351.         xian1("Watering System ");
  352.         xian2("T:   C H:  %RH  ");       //顯示第二行
  353.         LcdGotoXY(2,5);
  354.         wdata(0xdf);               
  355.            while(1)           //進入死循環,防止看門狗復位
  356.         {
  357.                 //key1deal();
  358.                 Read_Temperature();
  359.                 Display_Temperature();
  360.                 CheckWaterLevel();
  361.                 WateringIntelligence();
  362.                 delay(1000);
  363.         }


  364. }
復制代碼


全部資料51hei下載地址:
花卉自動澆水.rar (76.03 KB, 下載次數: 159)






作者: pfyy    時間: 2018-6-13 00:33
hi,你這個畢業設計有電路原理圖嗎?
作者: roseqaq2    時間: 2019-3-26 21:07
謝謝樓主分享
作者: KK1031011    時間: 2019-5-10 16:12
樓主,我想問一下那個藍色字體是什么,看不清楚
作者: aryk    時間: 2019-12-10 12:34
謝謝大佬




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1