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

標題: 51單片機+ADC0832智能澆花系統Proteus仿真程序 [打印本頁]

作者: 未來可期鴨    時間: 2021-6-3 08:49
標題: 51單片機+ADC0832智能澆花系統Proteus仿真程序
功能描述:
(1)本系統采用單片機STC89C52+ADC0832+LCD1602液晶+土壤濕度傳感器+抽水電機+ 按鍵+蜂鳴器設計而成。
(2)能夠檢測土壤的濕度,實時顯示到LCD1602液晶屏上。其中,液晶第一行顯示實際的濕度。液晶第二行顯示濕度上限值和濕度下限值。
(3)根據不同的土壤,能夠合理的調整澆水要求。通過按鍵設置上下限值。濕度低于下限報警,開始澆水直到上限停止報警及澆水。隨后濕度下降到下限開始報警并啟動澆水。
(4)按鍵分為,減鍵、加鍵、設置鍵。潛水泵通過繼電器控制通斷。
(5)可通過藍牙模塊對應的手機端讀取實時濕度數據,并控制單片機端繼電器和蜂鳴器功能的有無。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include <reg52.H>
  2. #include "intrins.h"
  3. #include "uart.h"
  4. #include "stdio.h"
  5. #include <stdio.h>

  6. #define uint unsigned int
  7. #define uchar unsigned char
  8. #define ulong unsigned long
  9. #define     LCDIO      P0         //液晶屏數據口
  10. //ADC0832的引腳
  11. sbit ADCLK =P3^6;  //ADC0832 clock signal
  12. sbit ADDIO =P3^7;  //ADC0832 k in
  13. sbit ADCS =P3^4;  //ADC0832 chip seclect

  14. sbit rs=P2^5;  //定義1602 RS
  15. sbit rw=P2^6;  //定義1602 Rw
  16. sbit lcden=P2^7; //定義1602 EN

  17. sbit key1=P1^7;    //設定
  18. sbit key2=P1^6;    //加
  19. sbit key3=P1^5;    //減
  20. sbit motor=P2^1;   //繼電器接口
  21. sbit speak=P2^0;        //蜂鳴器接口
  22. uchar key;         //設定指針
  23. uint RH=500,RL=10;//水位上下限
  24. float temp_f;
  25. ulong temp;
  26. uchar v;
  27. uchar count,s1num;
  28. uchar code table[]= "shi du:          ";
  29. uchar code table1[]="RH:  %              ";
  30. uchar getdata; //獲取ADC轉換回來的值

  31. unsigned char init_flag=1;

  32. /*********************************************/
  33. void delay(uint z)                  //延時
  34. {
  35.         uint x,y;
  36.         for(x=z;x>0;x--)
  37.                 for(y=110;y>0;y--);
  38. }

  39. void long_alarm(void)                  //延時
  40. {
  41.     speak=0;                       
  42.     delay(800);                
  43.     speak=1;
  44.     delay(800);
  45. }

  46. void alarm(void)                  //延時
  47. {
  48.     speak=0;                       
  49.     delay(50);                
  50.     speak=1;
  51.     delay(50);
  52. }

  53. /**********************************************/
  54. void write_com(uchar com)
  55. {
  56.         rs=0;
  57. //        rd=0;
  58.         lcden=0;
  59.         P0=com;
  60.         delay(5);
  61.         lcden=1;
  62.         delay(5);
  63.         lcden=0;       
  64. }
  65. /*********************************************/
  66. void write_date(uchar date)
  67. {
  68.         rs=1;
  69. //        rd=0;
  70.         lcden=0;
  71.         P0=date;
  72.         delay(5);
  73.         lcden=1;
  74.         delay(5);
  75.         lcden=0;       
  76. }
  77. /***********************************************/
  78. void init()
  79. {
  80.         uchar num;

  81.         Uart_Init();

  82.         lcden=0;
  83.         rw=0;
  84.         write_com(0x38);
  85.         write_com(0x0c);
  86.         write_com(0x06);
  87.         write_com(0x01);
  88.         write_com(0x80);
  89.         for(num=0;num<15;num++)
  90.                 {
  91.                         write_date(table[num]);
  92.                         delay(5);
  93.                 }
  94.         write_com(0x80+0x40);
  95.         for(num=0;num<15;num++)
  96.                 {
  97.                         write_date(table1[num]);
  98.                         delay(5);
  99.                 }
  100.         }
  101. //****************************************************************************/
  102. /************
  103. 讀ADC0832函數
  104. ************/
  105. //采集并返回
  106. /****************************************************************************
  107. 函數功能:AD轉換子程序
  108. 入口參數:CH(如果讀取CH0,channel的值為0x01,如果讀取CH1則channel的值為0x03)
  109. 出口參數:adval
  110. ****************************************************************************/
  111. uchar Adc0832()     //AD轉換,返回結果
  112. {
  113.     uchar i;
  114.     uchar dat=0;

  115.     ADCLK=0;
  116.     ADDIO=1;
  117.     ADCS=0;                  //拉低CS端
  118.     ADCLK=1;                 
  119.     ADCLK=0;                 //拉低CLK端,形成下降沿1

  120.     ADDIO=1;//指定轉換通道是CH1還是CH2,指定值位與0x1,取最后一位的值
  121.     ADCLK=1;   
  122.     ADCLK=0;                 //拉低CLK端,形成下降沿2

  123.     ADDIO=0;//指定值右移一位,再取最后一位的值
  124.     ADCLK=1;
  125.     ADCLK=0;                //拉低CLK端,形成下降沿3


  126.     ADDIO=1;               
  127.         for(i=0;i<8;i++)
  128.     {
  129.         ADCLK=1;
  130.         ADCLK=0;           //形成一次時鐘脈沖
  131.         if(ADDIO)
  132.                    dat|= 0x80>>i;  //收數據
  133.     }


  134.     ADCS=1;                //拉低CS端
  135.     ADCLK=1;
  136.     ADDIO=1;               //拉高數據端,回到初始狀態
  137.     return(dat);           //return dat
  138. }
  139. /***************************************************************************/


  140. /********************************************************/
  141. void displayRH()                        //下限顯示
  142. {write_com(0xc0+3);
  143. write_date(RH/100%10+0x30);//上限百位
  144. write_date(RH/10%10+0x30);//上限十位
  145. //write_date('.');
  146. //write_date(RH%10+0x30);
  147. }
  148. void displayRL()          //下限顯示
  149. {write_com(0xca);
  150.   write_date('R');
  151.   write_date('L');
  152.   write_date(':');
  153. write_date(RL/100%10+0x30);//下限百位
  154. write_date(RL/10%10+0x30);//下限十位
  155. write_date('%');
  156. }
  157. /**************************************************/
  158. /********************************************************/
  159. void keyscan()                 //按鍵處理
  160. {
  161.         bit kk1=0,kk2=0;

  162.         if(key1==0)
  163.         {
  164.          delay(10);
  165.          while(key1==0);
  166.          alarm();       
  167.          key=1;

  168.            switch(key)
  169.            {
  170. //            speak=1;kk2=motor;motor=1;
  171.             case 1:        //RL下線報警值設置
  172.                     {
  173.                             write_com(0x0f);write_com(0xce); //光標閃爍
  174.                                 while(key1!=0)         //等待按鍵松開
  175.                                 {
  176.                                     if(key2==0)                //key2按鍵下
  177.                                    {   
  178.                                            delay(10);                //按鍵延時消抖
  179.                                            if(key2==0)                //確定key2按下
  180.                                            {
  181.                                                     while(key2==0); //等待松開
  182.                                             alarm();
  183.                                                         if(RL>=998)
  184.                                                         {RL=999;                //RL下限最大設置為99
  185.                                                         }
  186.                                                         else
  187.                                                         {RL+=10;                //RL加1
  188.                                                         }       
  189.                                            }
  190.                                            displayRL();                //調用RL下限顯示函數
  191.                                            write_com(0xce);
  192.                                    }  
  193.                                     

  194.                                    if(key3==0)                //key3按下
  195.                                    {                                  
  196.                                                    delay(10);                //按鍵延時消抖
  197.                                                   if(key3==0)                //確定key3按下
  198.                                            {
  199.                                                     while(key3==0);         //等待key3按鍵松開
  200.                                             alarm();
  201.                                                         if(RL<=1)                 //RL最小設置為1
  202.                                                         {RL=0;
  203.                                                         }
  204.                                                         else
  205.                                                         {RL-=10;                 //RL下限減1
  206.                                                         }
  207.                                            }
  208.                                            displayRL();                //調用RL下限顯示函數
  209.                                            write_com(0xce);
  210.                                   }                          
  211.                            }
  212.                                    while(key1==0);
  213.                     alarm();                       
  214.                         }


  215.                         case 2:        //RL上線報警值設置
  216.                         {
  217.                            write_com(0x0f);write_com(0xc4);  //RH設置數據,光標閃爍
  218.                            while(key1==1)
  219.                            {
  220.                                     if(key2==0)           //key2按下
  221.                                    {
  222.                                            delay(30);           //按鍵延時消抖
  223.                                            if(key2==0)           //確定key2按下
  224.                                            {
  225.                                                     while(key2==0);        //等待松開
  226.                                             alarm();
  227.                                                         if(RH>=998)                //RH最大設置為99
  228.                                                         {RH=999;
  229.                                                         }
  230.                                                         else
  231.                                                         {RH+=10;                //RH加1
  232.                                                         }                                       
  233.                                            }
  234.                                             displayRH();                //RH上限顯示函數
  235.                                             write_com(0xc4);
  236.                                     }
  237.                                  
  238.                                   
  239.                                   
  240.                                    if(key3==0)          //key3按下
  241.                                    {
  242.                                            delay(30);          //按鍵延時消抖
  243.                                            if(key3==0)          //確定按下
  244.                                            {
  245.                                                     while(key3==0);//等待松開
  246.                                             alarm();
  247.                                                         if(RH<=1)           //RH最小設置為1
  248.                                                         {RH=0;
  249.                                                         }
  250.                                                         else
  251.                                                         {RH-=10;                //RH減1
  252.                                                         }                                               
  253.                                                 }
  254.                                                    displayRH();                //調用RH顯示函數
  255.                                                    write_com(0xc4);
  256.                                   }                       
  257.                            }
  258.                            while(key1==0);
  259.                        alarm();
  260.                            }


  261.                         case 0:
  262.                         {
  263.                                         write_com(0x0c);
  264.                                     break;
  265.                         }


  266.          }
  267.    }
  268. }
  269. /**************************************************/
  270. void Conut(void)          //土壤檢測數據轉換
  271. {          
  272.       v=Adc0832();
  273.           temp=v;
  274. //      temp_f=temp*10/2.55;
  275.           temp_f=(temp-173.4)*12.25;
  276.       temp=temp_f;
  277.           temp=1000-temp;         
  278.           write_com(0x80+10);
  279.           write_date(temp/100%10+0x30);//千位
  280.           write_date(temp/10%10+0x30);//百位
  281.           write_date('.');
  282.           write_date(temp%10+0x30);
  283.           write_date('%');//顯示符號位
  284.        
  285.          }
  286. /********************************************************/
  287. void main(void)
  288. {
  289.     char alarm_flag=0;
  290.         char alarm_forbidden_flag=0;
  291.         unsigned char shidu_string[20];

  292.         init();
  293.         displayRH();   //顯示上限
  294.         displayRL();   //顯示下限
  295.         delay(50);         //啟動等待,等LCD講入工作狀態
  296.         delay(50);         //延時片刻(可不要)
  297.         delay(50);                         //延時
  298.         delay(50);
  299.         Conut();           //顯示函數
  300.         delay(150);        
  301.        

  302.         while(1)
  303.         {        
  304. //                printf("%d",1);
  305.            Conut();        //顯示當前濕度
  306.                  keyscan();
  307.                  

  308.                   sprintf(shidu_string, "shi du: %2d.%d \r\n",(int)(temp/10),(int)(temp%10));
  309.                   Send_Word(shidu_string); //通過藍牙將數據上報出去,給你的手機藍牙助手。


  310.                 if(init_flag!=0)
  311.                  {
  312. ……………………

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

所有資料51hei提供下載:
基于51單片機智能澆花系統.7z (231.39 KB, 下載次數: 164)



作者: qxuem    時間: 2021-6-24 17:36
請問如果需要多個土壤檢測點和多個水泵.應該怎么弄呢
作者: heikeji2021    時間: 2021-6-24 18:04
不錯,照著做一個試試
作者: newforce    時間: 2021-7-16 16:46

不錯,照著做一個試試
作者: huang.xizhi    時間: 2021-7-20 18:01
看了您的作品,感覺慢有意思的,我是做科研的 想做一個多通道的噴霧單片機。不知道有沒有興趣,項目開發
作者: kamiyali    時間: 2021-9-13 16:06
感謝分享,下載下來學習一下




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 在线一区二区三区 | 精品国产91乱码一区二区三区 | 成年人黄色一级毛片 | 91久久精品一区二区二区 | 成人在线免费电影 | 国产十日韩十欧美 | 欧美激情a∨在线视频播放 成人免费共享视频 | 精品日韩| 欧美一二区 | 在线国产视频 | 成人在线观看网址 | 色狠狠一区 | 在线不卡视频 | 国产精品久久久 | 亚洲一区二区三区在线视频 | 精品久久久久一区 | 成人国产在线视频 | 亚洲精品久久久久久久久久久久久 | 免费观看一区二区三区毛片 | 激情毛片 | 亚洲国产精品久久久 | 国产精品亚洲视频 | 欧美一区二区三区一在线观看 | av网站免费 | www.性色| 欧美不卡| 久久精品播放 | 精品一区在线免费观看 | 亚洲成人精品在线观看 | 91精品91久久久 | 国产在线视频一区二区董小宛性色 | 成人午夜黄色 | 久久成人免费视频 | 精品国产91乱码一区二区三区 | 亚洲视频国产 | 免费在线观看av网站 | 精品亚洲91| 成人深夜福利网站 | 国产精品一区二区三区在线 | 黄色一级毛片免费看 | 成人综合久久 |