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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機自動澆花+溫濕度報警系統程序仿真設計 可設置濕度閾值

  [復制鏈接]
跳轉到指定樓層
樓主
基于51單片機的自動澆花系統,可自設濕度閾值。
帶有溫濕度監測功能,可借鑒學習。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char                //宏定義
  4. #define uint unsigned int
  5. #include"eeprom.h"
  6. typedef unsigned char unint8;
  7. typedef unsigned char unint16;
  8. typedef unsigned int   U16;
  9. uchar code table[] = {"moisture:       "};
  10. uchar code table1[] ={"                "};
  11. uchar code table3[] ={" H:  %   H:   C "};
  12. uchar code table2[] ={"Set The:         "};
  13. sbit TRH = P1^4;//溫濕度傳感器DHT11數據接入
  14. sbit rs = P2^6;            
  15. sbit en = P2^7;
  16. sbit beep=P2^0;//蜂鳴器控制端

  17. sbit k1=P3^1;
  18. sbit k2=P3^2;
  19. sbit k3=P3^3;

  20. sbit jdq=P3^4;

  21. sbit CS   = P1^0;
  22. sbit Clk = P1^1;
  23. sbit DATI = P1^2;
  24. sbit DATO = P1^2;
  25. uchar stemp=35,shr=50,tr=80;           //溫濕度上下線初始化
  26. bit yyp=1,lalarm=0;                                                  //設置標志位,報警標志位
  27. int key_delay=0;
  28. const int key_count=400;
  29. unsigned char dat = 0x00;      
  30. unsigned char CH;   
  31. uchar s1num,num,shis,shig,wens,weng;
  32. unint8 TH_data,TL_data,RH_data,RL_data,CK_data;
  33. unint8 TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;
  34. unint8 com_data,untemp,temp;
  35. unint8 respond;
  36. void delay(uint x) //毫秒級延時函數
  37. {
  38.   uint i,j;
  39.   for(i=x;i>0;i--)
  40.      for(j=110;j>0;j--);
  41. }
  42. void di()                           //蜂鳴器報警
  43. {
  44.         beep=0;
  45.         delay(100);
  46.         beep=1;
  47. }
  48. void write_com(uchar com)
  49. {
  50.         rs=0;//命令
  51.         P0=com;
  52.         delay(5);
  53.         en=1;
  54.         delay(5);
  55.         en=0;
  56. }
  57. void write_date(uchar date)
  58. {
  59.         rs=1;//數據
  60.         P0=date;
  61.         delay(5);
  62.         en=1;
  63.         delay(5);
  64.         en=0;
  65. }
  66. void init1602()
  67. {
  68.         write_com(0x38);        //設置工作方式
  69.         write_com(0x0c);        //設置光標
  70.         write_com(0x06);        //設置輸入方式
  71.         write_com(0x01);        //清屏
  72.         write_com(0x80);
  73.         for(num=0;num<16;num++)
  74.         {
  75.                 write_date(table[num]);
  76.         }
  77.         write_com(0x80+0x40);
  78.         for(num=0;num<16;num++)
  79.         {
  80.                 write_date(table1[num]);
  81.         }
  82. }
  83. void init16021()                //設置溫度上下限顯示初始化函數
  84. {
  85.         write_com(0x80);
  86.         for(num=0;num<16;num++)
  87.         {
  88.                 write_date(table2[num]);
  89.         }
  90.         write_com(0x80+0x40);
  91.         for(num=0;num<16;num++)
  92.         {
  93.                 write_date(table3[num]);
  94.         }
  95.         write_com(0x80+0x40+13);
  96.         write_date(0xdf);                 
  97.        
  98. }
  99. void write_H(uchar add,uchar date)
  100. {
  101.         uchar shi,ge;
  102.         shi=date/10;
  103.         ge=date%10;
  104.         write_com(0x80+0x40+add);
  105.         write_date(0x30+shi);
  106.         write_date(0x30+ge);
  107. }
  108. void write_tr(uchar add,uchar Data)
  109. {
  110.         uchar bai,shi,ge;
  111.         bai=Data/100;
  112.         shi=Data/10%10;
  113.         ge=Data%10;
  114.         write_com(0x80+add);
  115.         write_date(0X30+bai);
  116.         write_date(0X30+shi);
  117.         write_date(0X30+ge);
  118. }
  119. /////////////////////////////////
  120. /***********DHT11子程序*************************/
  121. /*********************************************************************************/

  122. /*********************************************************************************/
  123. // 毫秒級延時子程序
  124. /*********************************************************************************/
  125. void delay_ms(U16 j)
  126. {      unint8 i;
  127.             for(;j>0;j--)
  128.           {        
  129.                 for(i=0;i<27;i++);

  130.           }
  131. }
  132. /*********************************************************************************/

  133. /*********************************************************************************/
  134. //5us級延時程序
  135. /*********************************************************************************/
  136. void delay_us()
  137. {
  138.           unint8 i;
  139.           i--;
  140.           i--;
  141.           i--;
  142.           i--;
  143.           i--;
  144.           i--;
  145. }
  146. /********************************************************************************/

  147. /****************************************************************************/
  148. //收發信號檢測,數據讀取
  149. /****************************************************************************/
  150. char receive()
  151. {   
  152.           unint8 i;
  153.           for(i=0;i<8;i++)   
  154.          {
  155.                     respond=2;
  156.                     while((!TRH)&&respond++);
  157.                     delay_us();
  158.                     delay_us();
  159.                     delay_us();

  160.                                         temp=0;


  161.                     if(TRH)temp=1;
  162.                      respond=2;
  163.                      while((TRH)&&respond++);
  164.                                          //超時則跳出for循環                  
  165.                                          if(respond==1)break;

  166.                                                  //判斷數據位是0還是1         
  167.                      
  168.                 // 如果高電平高過預定0高電平值則數據位為 1
  169.                     com_data<<=1;
  170.                     com_data|=temp;   
  171.           }
  172.           return(com_data);  
  173. }
  174. /****************************************************************************/

  175. /****************************************************************************/
  176. //濕度讀取子程序
  177. //溫度高8位== TL_data
  178. //溫度低8位== TH_data
  179. //濕度高8位== RH_data
  180. //濕度低8位== RH_data
  181. //校驗 8位 == CK_data
  182. //調用的程序有 delay();, Delay_5us();,RECEIVE();
  183. /***************************************************************************/
  184. void GET_TRH()
  185. {
  186.          //主機拉低18ms
  187.          TRH=0;
  188.          delay_ms(180);
  189.          TRH=1;
  190.          //DATA總線由上拉電阻拉高 主機延時20us
  191.          delay_us();
  192.          delay_us();
  193.          delay_us();
  194.          delay_us();
  195.          //主機設為輸入 判斷從機響應信號
  196.          TRH=1;
  197.          //判斷DHT11是否有低電平響應信號 如不響應則跳出,響應則向下運行   
  198.          if(!TRH)   
  199.          {
  200.                 respond=2;
  201.                 //判斷DHT11發出 80us 的低電平響應信號是否結束
  202.                 while((!TRH)&& respond++);
  203.                 respond=2;
  204.                 //判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態
  205.                 while(TRH && respond++);
  206.                        //數據接收狀態   
  207.                 RH_temp = receive();
  208.                 RL_temp = receive();
  209.                 TH_temp = receive();
  210.                 TL_temp = receive();
  211.                 CK_temp = receive();
  212.                 TRH=1;//ST=1;     
  213.                 //數據校驗
  214.                 untemp=(RH_temp+RL_temp+TH_temp+TL_temp);
  215.                 if(untemp==CK_temp)
  216.                 {
  217.                      RH_data = RH_temp;
  218.                      RL_data = RL_temp;
  219.                      TH_data = TH_temp;
  220.                      TL_data = TL_temp;
  221.                      CK_data = CK_temp;
  222.                 }
  223.         }
  224.                                 //濕度整數部分
  225.                          shis= (char)(0X30+RH_data/10);  //濕度的十位
  226.                          shig= (char)(0X30+RH_data%10);         //濕度的個
  227.                          //溫度整數部分
  228.                          wens= (char)(0X30+TH_data/10);   //溫度的十位
  229.                          weng= (char)(0X30+TH_data%10);         //溫度的個位
  230.                                 //濕度整數部分
  231.                          shis= (char)(0X30+RH_data/10);  //濕度的十位
  232.                          shig= (char)(0X30+RH_data%10);         //濕度的個
  233.                          //溫度整數部分
  234.                          wens= (char)(0X30+TH_data/10);   //溫度的十位
  235.                          weng= (char)(0X30+TH_data%10);         //溫度的個位
  236.                                 //溫濕度顯示函數
  237.                                  write_com(0x80+0x40+2);
  238.                                  write_date(shis);
  239.                                  write_date(shig);
  240.                                  write_date('%');         //濕度符號
  241.                                  write_com(0x80+0x40+9);
  242.                                  write_date(wens);
  243.                                  write_date(weng);
  244.                                  write_date(0xdf);        //溫度符號
  245.                                  write_date('C');


  246. }
  247. /****按鍵掃描******/
  248. void keyscan()
  249. {
  250.         if(k1==0)
  251.         {
  252.                 delay(10);
  253.                 if(k1==0)
  254.                 {
  255.                         s1num++;
  256.                         while(!k1);                        //等待按鍵釋放
  257.                         yyp=0;
  258.                         di();                       
  259.                         switch(s1num)
  260.                         {
  261.                                 case 1:        init16021();                                  //設置溫度上下限初始化
  262.                                                 tr=byte_read(0x2000);
  263.                                                   shr=byte_read(0x2200);
  264.                                                   stemp=byte_read(0x2400);
  265.                                                 write_tr(9,tr);
  266.                                                 write_H(3,shr);
  267.                                                 write_H(11,stemp);
  268.                                                 write_com(0x80+11);
  269.                                                 write_com(0x0f);                        //打開光標
  270.                                                 break;
  271.                                 case 2:        write_com(0X40+0x80+4);
  272.                                                 break;
  273.                                 case 3:        write_com(0X40+0x80+12);
  274.                                                 break;
  275.                                 case 4:        s1num=0;
  276.                                                 write_com(0x0c);                        //關閉光標
  277.                                                 yyp=1;
  278.                                                 init1602();                                        //上電后顯示初始化
  279.                                                 break;
  280.                         }               
  281.                 }
  282.         }
  283.         if(s1num!=0)
  284.         {
  285.                 if(k2==0)
  286.                 {
  287.                         delay(10);
  288.                         if(k2==0)
  289.                         {
  290.                                
  291.                                 while(!k2);                //等待按鍵釋放
  292.                                 di();
  293.                                 switch(s1num)
  294.                         {
  295.                                         case 1: tr++;
  296.                                                         if(tr==255)tr=0;
  297.                                                         write_tr(9,tr);
  298.                                                         write_com(0x80+11);
  299.                                                         SectorErase(0x2000);//擦除扇區
  300.                                                            byte_write(0x2000,tr);//重新寫入數據       
  301.                                                         break;
  302.                                         case 2: shr++;
  303.                                                         if(shr==85)shr=0;
  304.                                                         write_H(3,shr);
  305.                                                         write_com(0X40+0x80+4);       
  306.                                                         SectorErase(0x2200);//擦除扇區
  307.                                                            byte_write(0x2200,shr);//重新寫入數據       
  308.                                                         break;
  309.                                         case 3: stemp++;
  310.                                                         if(stemp==45)stemp=0;
  311.                                                         write_H(11,stemp);
  312.                                                         write_com(0X40+0x80+12);
  313.                                                         SectorErase(0x2400);//擦除扇區
  314.                                                            byte_write(0x2400,stemp);//重新寫入數據
  315.                                                     break;
  316.                                 }
  317.                         }
  318.                 }
  319.                 if(k3==0)
  320.                 {
  321.                         delay(10);
  322.                         if(k3==0)
  323.                         {
  324.                        
  325.                                 while(!k3);                //等待按鍵釋放
  326.                                 di();
  327.                                 switch(s1num)
  328.                         {
  329.                                         case 1: tr--;
  330.                                                         if(tr==0)tr=255;
  331.                                                         write_tr(9,tr);
  332.                                                         write_com(0x80+11);
  333.                                                         SectorErase(0x2000);//擦除扇區
  334.                                                            byte_write(0x2000,tr);//重新寫入數據               
  335.                                                         break;
  336.                                         case 2: shr--;
  337.                                                         if(shr==0)shr=85;
  338.                                                         write_H(3,shr);
  339.                                                         write_com(0X40+0x80+4);       
  340.                                                         SectorErase(0x2200);//擦除扇區
  341.                                                            byte_write(0x2200,shr);//重新寫入數據
  342.                                                         break;
  343.                                         case 3: stemp--;
  344.                                                         if(stemp==0)stemp=45;
  345.                                                         write_H(11,stemp);
  346.                                                         write_com(0X40+0x80+12);
  347.                                                         SectorErase(0x2400);//擦除扇區
  348.                                                            byte_write(0x2400,stemp);//重新寫入數據
  349.                                                     break;
  350.                                 }
  351.                         }
  352.                 }
  353.         }
  354. }

  355. unsigned char adc0832(unsigned char CH)
  356. {        
  357.         unsigned char i,test,adval;      
  358.         adval = 0x00;      
  359.         test = 0x00;      
  360.         Clk = 0;       //初始化      
  361.         DATI = 1;     
  362.         _nop_();     
  363.         CS = 0;     
  364.         _nop_();     
  365.         Clk = 1;   
  366.         _nop_();      
  367.         if ( CH == 0x00 )      //通道選擇   
  368.         {         
  369.                 Clk = 0;         
  370.                 DATI = 1;      //通道0的第一位      
  371.                  _nop_();      
  372.                  Clk = 1;         
  373.                  _nop_();         
  374.                  Clk = 0;        
  375.                  DATI = 0;      //通道0的第二位      
  376.                  _nop_();  
  377.                  Clk = 1;      
  378.                  _nop_();     
  379.         }      
  380.         else     
  381.         {         
  382.                 Clk = 0;        
  383.                 DATI = 1;      //通道1的第一位        
  384.                 _nop_();        
  385.                 Clk = 1;        
  386.                 _nop_();        
  387.                 Clk = 0;        
  388.                 DATI = 1;      //通道1的第二位     
  389.                 _nop_();      
  390.                 Clk = 1;      
  391.                 _nop_();     
  392.         }        
  393.                 Clk = 0;      
  394.                 DATI = 1;        
  395.                 for( i = 0;i < 8;i++ )      //讀取前8位的值     
  396.                 {         
  397.                         _nop_();         
  398.                         adval <<= 1;        
  399.                         Clk = 1;        
  400.                         _nop_();        
  401.                         Clk = 0;        
  402.                         if (DATO)            
  403.                         adval |= 0x01;      
  404.                         else            
  405.                         adval |= 0x00;     
  406.                 }         
  407.                 for (i = 0; i < 8; i++)      //讀取后8位的值      
  408.                 {            
  409.                         test >>= 1;            
  410.                         if (DATO)               
  411.                         test |= 0x80;            
  412.                         else                 
  413.                         test |= 0x00;            
  414.                         _nop_();           
  415.                         Clk = 1;           
  416.                         _nop_();           
  417.                         Clk = 0;      
  418.                 }        
  419.                 if (adval == test)      //比較前8位與后8位的值,如果不相同舍去。若一直出現顯示為零,請將該行去掉            
  420.                 dat = test;        
  421.                 _nop_();         
  422.                 CS = 1;        //釋放ADC0832        
  423.                 DATO = 1;        
  424.                 Clk = 1;      
  425.                 return dat;
  426. }
  427. void display(uchar Data)
  428. {
  429.         uchar bai,shi,ge;
  430.         bai=Data/100;
  431.         shi=Data/10%10;
  432.         ge=Data%10;
  433.         write_com(0x80+9);
  434.         write_date(0X30+bai);
  435.         write_date(0X30+shi);
  436.         write_date(0X30+ge);
  437. }
  438. void baojing()
  439. {
  440.                         if(TH_data>stemp||RH_data>shr)//判斷溫濕度
  441.                         {
  442.                                 lalarm=1;
  443.                                 if(RH_data>shr) //        報警
  444.                                 {
  445.                                                
  446.                                 }
  447.                                  if(TH_data>stemp) //        報警
  448. ……………………

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

所有資料51hei提供下載:
自動澆花系統+溫濕度監測.zip (762.24 KB, 下載次數: 147)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:790946 發表于 2020-6-29 15:18 | 只看該作者
你的仿真圖怎么運行操作呀
回復

使用道具 舉報

板凳
ID:793756 發表于 2020-7-15 09:42 | 只看該作者
仿真圖里少了點東西吧
回復

使用道具 舉報

地板
ID:826049 發表于 2020-10-9 10:10 | 只看該作者
p3.1的k1按鍵能不能用別的接口代替?p3.1我要拿來寫程序好像不能使用
回復

使用道具 舉報

5#
ID:826049 發表于 2020-10-20 20:41 | 只看該作者
你這個東西的元器件庫有沒有啊,我找不到封裝庫庫
回復

使用道具 舉報

6#
ID:406598 發表于 2020-11-2 14:30 | 只看該作者
哈哈哈4399 發表于 2020-6-29 15:18
你的仿真圖怎么運行操作呀

click here
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲成人国产 | 国产精品3区 | 欧美一区二区三区在线视频 | 狠狠干狠狠插 | 欧美一级网站 | 国产精品欧美一区喷水 | 欧美一区二区在线免费观看 | 久久一区二区三区四区 | 日韩在线成人 | 精品久久影院 | 99视频免费看| www.中文字幕.com | 国产精品免费福利 | 欧美国产精品一区二区 | 一区 | 成人毛片在线观看 | 欧美日韩精品一区二区天天拍 | 91精品国产综合久久精品图片 | 亚洲中字在线 | 国产亚洲一区精品 | 国产电影一区二区在线观看 | 国产高清一区二区 | 久久久99国产精品免费 | 中文字幕亚洲视频 | 国产精品永久免费视频 | 97人人草 | 久久久久久亚洲国产精品 | 断背山在线观看 | 国产一区二区三区网站 | 五月香婷婷 | 日韩欧美精品 | 久久久久久999 | 黄色一级视频免费 | 91精品观看| 日韩av一区二区在线 | 蜜臀久久 | 国产精品综合视频 | 老司机免费视频 | 欧美日韩精品一区二区三区四区 | 久久久久久久久久毛片 | 99精品一区二区三区 |