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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機DHT11溫濕度模塊智能澆花系統制作 1602顯示附源碼

  [復制鏈接]
跳轉到指定樓層
樓主
這是一個我做出來的51單片機的澆花系統,帶有DHT11溫濕度檢測模塊,以及土壤濕度檢測模塊,可以設置觸發澆花的臨界值,并且改進了澆水判斷程序,避免在臨界值抖動達不到澆水效果

這個1602顯示、帶DHT11的澆花系統的程序我們借鑒了51黑電子論壇上許多大佬的作品,在此對他們表示感謝٩(๑>◡<๑)۶,同時我們也對程序做了許多優化與更改,使得整個系統更具實用性,比如改進了澆水判斷程序,避免在臨界值抖動達不到澆水效果(〃'▽'〃)。但是時間緊,有一些地方并沒有完善,比如沒有加1602背光控制。還需要各位繼續完善(*/ω\*),然后,成品我們已經測試過可以正常使用,如果出現異常請檢查一下接線是否有誤~  
還有還有,水泵如果和單片機使用同一個電源,要濾波否則會影響1602的正常顯示,最好使用獨立的電源。原理圖沒畫1602的對比度調節,大家可以自己加上!


制作出來的實物圖如下:


電路原理圖如下:


單片機源程序如下:
  1. /**************************
  2. 制作:華南農業大學   LSR
  3. ***************************/
  4. //程序頭函數                                 
  5. #include <reg52.h>
  6. #include <intrins.H>
  7. #include <math.H>


  8. //宏定義
  9. #define uint unsigned int
  10. #define uchar unsigned char
  11. #define Data_ADC0809 P1

  12. //管腳聲明
  13. sbit Feng = P3^0;
  14. sbit DQ=P3^1;    //DTH11
  15. //ADC0809
  16. sbit ST=P3^3;
  17. sbit EOC=P3^4;
  18. sbit OE=P3^2;
  19. //按鍵
  20. sbit Key1=P3^5;
  21. sbit Key2=P3^6;
  22. sbit Key3=P3^7;

  23. sbit rs=P2^2;
  24. sbit lcden=P2^0;
  25. sbit rw=P2^1;



  26. uchar code table_num[]="0123456789abcdefg"; //定義數組
  27. uchar tem;
  28. uchar hum;

  29. //函數聲明

  30. extern uchar ADC0809();
  31. bit Init_DTH11() ;
  32. void delay_ms(uint z);
  33. void delay(uint t);
  34. void write_com(uchar com) ;
  35. void write_data(uchar dat)         ;
  36. void write_sfm2(uchar hang,uchar add,uint date);
  37. void write_string(uchar hang,uchar add,uchar *p);
  38. void init()         ;
  39. void Display(uchar X,uchar Data);
  40. void  DTH11_DUSHU();        
  41. void Display_DTH11();
  42.   
  43. uchar DTH11_RD_CHAR();


  44. //濕度變量
  45. uchar temp=0;
  46. //蜂鳴器變量
  47. uchar FF=60;
  48. //顯示模式
  49. uchar Mode=0;
  50. int  F=0;

  51. void main()
  52. {
  53.         tem=0;hum=0;
  54.          init();
  55.         write_string(2,0,"T:00'C  RH:00%");
  56.         while(1)
  57.         {        

  58.                 //正常模式
  59.                 if(Mode==0)
  60.                 {
  61.                         //讀取AD值
  62.                         bit Init_DTH11()  ;
  63.                         DTH11_DUSHU();
  64.                 Display_DTH11();
  65.                         delay(500);
  66.                         temp=ADC0809();
  67.                         delay(10);
  68.                         Display(0,temp);  
  69.                         delay(100);
  70.                         //判斷是否報警
  71.                         if(temp>FF)
  72.                         {
  73.                                 F=1;
  74.                                 Feng=0;
  75.                         }
  76.                         else if(temp<=FF&&temp>=(FF-20)&&F==1) {Feng=0;} //這里是當濕度下降20時停止澆水的程序,若想改變澆水多少,改20即可。
  77.                         
  78.                         else
  79.                         {
  80.                                 Feng=1;F=0;
  81.                         }
  82.                  }

  83.                 //調整模式
  84.                 else
  85.                 {
  86.                         Display(1,FF);
  87.                 }
  88.                 //功能鍵
  89.                 if(Key3==0)
  90.                 {
  91.                         Feng=1;
  92.                         delay(10);
  93.                         while(Key3==0)
  94.                         {
  95.                                 if(Mode==0)
  96.                                         Display(0,temp);        
  97.                                 else
  98.                                         Display(1,FF);                                                                        
  99.                         }
  100.                         if(Mode==0)
  101.                                 Mode=1;
  102.                         else
  103.                                 Mode=0;
  104.                         Feng=1;
  105.                 }
  106.                 //增加
  107.                 if(Key2==0&&Mode==1)
  108.                 {
  109.                         Feng=1;
  110.                         delay(10);
  111.                         while(Key2==0)
  112.                         {
  113.                                         Display(1,FF);
  114.                                         delay(100);                                                                        
  115.                         }
  116.                         FF++;
  117.                         if(FF==256)        
  118.                                 FF=255;        
  119.                         Feng=1;
  120.                 }
  121.                 //減少
  122.                 if(Key1==0&&Mode==1)
  123.                 {
  124.                         Feng=1;
  125.                         delay(10);
  126.                         while(Key1==0)
  127.                         {
  128.                                         Display(1,FF);                                                                        
  129.                         }
  130.                         FF--;
  131.                         if(FF==-1)        
  132.                                 FF=0;        
  133.                         Feng=1;
  134.                 }  
  135.                
  136.         }
  137. }
  138. void delay_ms(uint z)
  139. {
  140. uint x,y;
  141. for(x=z;x>0;x--)
  142.   for(y=114;y>0;y--);
  143. }

  144. void write_com(uchar com)                                //寫命令函數
  145. {
  146.         delay(5);
  147.         lcden=0;
  148.         rs=0;
  149.         rw=0;
  150.         delay(5);
  151.         P0=com;
  152.         delay(5);
  153.         lcden=1;
  154.         delay(25);
  155.         lcden=0;
  156. }

  157. void write_data(uchar dat)                                //寫數據函數
  158. {
  159.          delay(5);
  160.         lcden=0;
  161.         rs=1;
  162.         rw=0;
  163.         delay(5);
  164.         P0=dat;
  165.         delay(5);
  166.         lcden=1;
  167.         delay(25);
  168.         lcden=0;        
  169. }

  170. /********************************************************************
  171. * 名稱 : write_sfm2(uchar hang,uchar add,uchar date)
  172. * 功能 : 顯示3位十進制數,如果要讓第一行,第五個字符開始顯示"23" ,調用該函數如下
  173.                   write_sfm1(1,5,23)
  174. * 輸入 : 行,列,需要輸入1602的數據
  175. * 輸出 : 無                                                                !!!還需測試的!!!!
  176. ***********************************************************************/
  177. void write_sfm2(uchar hang,uchar add,uint date)
  178. {
  179.         if(hang==1)   
  180.                 write_com(0x80+add);
  181.         else
  182.                 write_com(0x80+0x40+add);
  183.                 delay(5);
  184.         write_data(0x30+date/100%10);
  185.         delay(5);
  186.         write_data(0x30+date/10%10);
  187.         delay(5);
  188.         write_data(0x30+date%10);        
  189. }

  190. /********************************************************************
  191. * 名稱 : write_string(uchar hang,uchar add,uchar *p)
  192. * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字符開始顯示"ab cd ef" ,調用該函數如下
  193.                   write_string(1,5,"ab cd ef;")
  194. * 輸入 : 行,列,需要輸入1602的數據
  195. * 輸出 : 無
  196. ***********************************************************************/
  197. void write_string(uchar hang,uchar add,uchar *p)
  198. {
  199.         if(hang==1)   
  200.                 write_com(0x80+add);
  201.         else
  202.                 write_com(0x80+0x40+add);
  203.                 while(1)
  204.                 {
  205.                         if(*p == '\0')  break;
  206.                         write_data(*p);
  207.                         p++;
  208.                 }        
  209. }

  210. void init()
  211. {
  212. //        uchar num;
  213.         rw=0;
  214.         lcden=0;

  215.         write_com(0x38);
  216.         write_com(0x0c);
  217.         write_com(0x06);
  218.         write_com(0x01);
  219.         delay(1000);
  220.         write_string(1,0,"shidu:")        ;
  221.         write_string(2,0,"T:00'C  RH:00%");
  222.         
  223. }
  224. //ADC0809讀取信息
  225. uchar ADC0809()
  226. {
  227.         uchar temp_=0x00;
  228.         //初始化高阻太
  229.         OE=0;
  230.         //轉化初始化
  231.         ST=0;
  232.         delay(5);
  233.         //開始轉換
  234.         ST=1;
  235.         ST=0;
  236.         //外部中斷等待AD轉換結束
  237.         while(EOC==0)
  238.         //讀取轉換的AD值
  239.         OE=1;
  240.         temp_=Data_ADC0809;
  241.         OE=0;
  242.         return temp_;
  243. }
  244. bit Init_DTH11()
  245. {
  246. bit flag;
  247. uchar num;
  248. DQ=0;
  249. delay_ms(19);   // >18ms
  250. DQ=1;
  251. for(num=0;num<10;num++);   // 20-40us    34.7us
  252. for(num=0;num<12;num++);
  253. flag=DQ;
  254. for(num=0;num<11;num++); //DTH響應80us
  255. for(num=0;num<24;num++);    //DTH拉高80us
  256. return flag;
  257. }
  258. //****************************讀DTH11數據
  259. uchar DTH11_RD_CHAR()
  260. {
  261. uchar byte=0;
  262. uchar num;
  263. uchar num1;
  264. while(DQ==1);
  265. for(num1=0;num1<8;num1++)
  266. {
  267.   while(DQ==0);
  268.   byte<<=1;     //高位在前
  269.   for(num=0;DQ==1;num++);
  270.   if(num<10)
  271.    byte|=0x00;
  272.   else
  273.    byte|=0x01;
  274. }
  275. return byte;
  276. }
  277. //******************************讀取DTH11溫度和濕度
  278. void  DTH11_DUSHU()
  279. {
  280. uchar num;
  281. if(Init_DTH11()==0)
  282. {
  283.   hum=DTH11_RD_CHAR();   //比正常值高7度左右
  284.   DTH11_RD_CHAR();
  285.   tem=DTH11_RD_CHAR();
  286.   DTH11_RD_CHAR();
  287.   DTH11_RD_CHAR();
  288.   for(num=0;num<17;num++);  //最后BIT輸出后拉低總線50us
  289.   DQ=1;
  290. }
  291. }


  292. //**************顯示函數
  293.   
  294. ……………………

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


所有資料51hei提供下載:
澆花系統.rar (19.19 MB, 下載次數: 263)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:372154 發表于 2019-1-29 01:17 | 只看該作者
謝謝  下載學習
回復

使用道具 舉報

板凳
ID:445069 發表于 2019-2-20 15:52 | 只看該作者
多謝樓主的貢獻!
回復

使用道具 舉報

地板
ID:475174 發表于 2019-2-23 12:43 | 只看該作者
首先表達一下我對樓主的感謝與崇拜,不過我還是個單片機小白,有些地方還是看不太懂,比如說LCD里現實的第一行(個人感覺是土壤濕度傳感器的數據)如果帶個單位就更好了。額。。。其實還有好多地方都看不懂,如果能有一份詳細的說明呢就是錦上添花了,比如說,澆水的條件呀,按鍵的使用說明呀,還有硬件的型號呀。當然如果樓主有時間的話! 再次感謝樓主的寶貴資料!
回復

使用道具 舉報

5#
ID:334202 發表于 2020-8-31 16:11 | 只看該作者
樓主你這個濕度模塊是要插土里嗎
回復

使用道具 舉報

6#
ID:28260 發表于 2021-7-23 09:04 | 只看該作者
多謝樓主的貢獻!!!
回復

使用道具 舉報

7#
ID:585365 發表于 2021-9-6 09:13 | 只看該作者
有程序,有圖紙。好
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久精品一级 | www.亚洲视频.com | 国产区在线观看 | 欧美亚洲视频 | 精品国产一区一区二区三亚瑟 | 亚州av| 黑人巨大精品欧美一区二区一视频 | 免费天天干 | 激情婷婷| 国产成人精品一区二区三区四区 | 成年人在线视频 | 二区精品 | 欧美精品片 | 91日日 | 色爱av| 亚洲欧美日韩精品 | 天天拍夜夜爽 | 久久久久久电影 | 成人精品在线观看 | 日日干天天操 | 91成人免费看片 | 日本午夜网 | 精品国产网 | 综合五月 | 一级欧美一级日韩片免费观看 | 中文字幕精品一区久久久久 | 日韩欧美中文字幕在线观看 | 国产亚洲一区二区在线观看 | 最新中文字幕在线 | 超碰在线人人干 | 久久久久久九九九九九九 | 午夜影院网站 | 日韩综合在线视频 | 蜜桃视频一区二区三区 | 国产精品自拍视频 | 精品国产乱码久久久久久蜜退臀 | 欧美日韩不卡 | 国产福利网站 | 久久久久久av | 伊人国产精品 | www.久|