找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7839|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)DHT11溫濕度模塊智能澆花系統(tǒng)制作 1602顯示附源碼

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:336315 發(fā)表于 2018-11-25 11:43 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
這是一個(gè)我做出來的51單片機(jī)的澆花系統(tǒng),帶有DHT11溫濕度檢測模塊,以及土壤濕度檢測模塊,可以設(shè)置觸發(fā)澆花的臨界值,并且改進(jìn)了澆水判斷程序,避免在臨界值抖動(dòng)達(dá)不到澆水效果

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


制作出來的實(shí)物圖如下:


電路原理圖如下:


單片機(jī)源程序如下:
  1. /**************************
  2. 制作:華南農(nóng)業(yè)大學(xué)   LSR
  3. ***************************/
  4. //程序頭函數(shù)                                 
  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"; //定義數(shù)組
  27. uchar tem;
  28. uchar hum;

  29. //函數(shù)聲明

  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.                         //判斷是否報(bào)警
  71.                         if(temp>FF)
  72.                         {
  73.                                 F=1;
  74.                                 Feng=0;
  75.                         }
  76.                         else if(temp<=FF&&temp>=(FF-20)&&F==1) {Feng=0;} //這里是當(dāng)濕度下降20時(shí)停止?jié)菜某绦颍粝敫淖儩菜嗌,?0即可。
  77.                         
  78.                         else
  79.                         {
  80.                                 Feng=1;F=0;
  81.                         }
  82.                  }

  83.                 //調(diào)整模式
  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)                                //寫命令函數(shù)
  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)                                //寫數(shù)據(jù)函數(shù)
  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位十進(jìn)制數(shù),如果要讓第一行,第五個(gè)字符開始顯示"23" ,調(diào)用該函數(shù)如下
  173.                   write_sfm1(1,5,23)
  174. * 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
  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. * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個(gè)字符開始顯示"ab cd ef" ,調(diào)用該函數(shù)如下
  193.                   write_string(1,5,"ab cd ef;")
  194. * 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
  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.         //轉(zhuǎn)化初始化
  231.         ST=0;
  232.         delay(5);
  233.         //開始轉(zhuǎn)換
  234.         ST=1;
  235.         ST=0;
  236.         //外部中斷等待AD轉(zhuǎn)換結(jié)束
  237.         while(EOC==0)
  238.         //讀取轉(zhuǎn)換的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響應(yīng)80us
  255. for(num=0;num<24;num++);    //DTH拉高80us
  256. return flag;
  257. }
  258. //****************************讀DTH11數(shù)據(jù)
  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. //**************顯示函數(shù)
  293.   
  294. ……………………

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


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


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

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

使用道具 舉報(bào)

沙發(fā)
ID:372154 發(fā)表于 2019-1-29 01:17 | 只看該作者
謝謝  下載學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

板凳
ID:445069 發(fā)表于 2019-2-20 15:52 | 只看該作者
多謝樓主的貢獻(xiàn)!
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

6#
ID:28260 發(fā)表于 2021-7-23 09:04 | 只看該作者
多謝樓主的貢獻(xiàn)!!!
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表