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

標(biāo)題: 單片機(jī)DHT11溫濕度模塊智能澆花系統(tǒng)制作 1602顯示附源碼 [打印本頁(yè)]

作者: 巴拉巴拉一大堆    時(shí)間: 2018-11-25 11:43
標(biāo)題: 單片機(jī)DHT11溫濕度模塊智能澆花系統(tǒng)制作 1602顯示附源碼
這是一個(gè)我做出來(lái)的51單片機(jī)的澆花系統(tǒng),帶有DHT11溫濕度檢測(cè)模塊,以及土壤濕度檢測(cè)模塊,可以設(shè)置觸發(fā)澆花的臨界值,并且改進(jìn)了澆水判斷程序,避免在臨界值抖動(dòng)達(dá)不到澆水效果

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


制作出來(lái)的實(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è)字符開(kāi)始顯示"23" ,調(diào)用該函數(shù)如下
  173.                   write_sfm1(1,5,23)
  174. * 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
  175. * 輸出 : 無(wú)                                                                !!!還需測(cè)試的!!!!
  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è)字符開(kāi)始顯示"ab cd ef" ,調(diào)用該函數(shù)如下
  193.                   write_string(1,5,"ab cd ef;")
  194. * 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
  195. * 輸出 : 無(wú)
  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.         //開(kāi)始轉(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. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼


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



作者: 江渚鷺鷥    時(shí)間: 2019-1-29 01:17
謝謝  下載學(xué)習(xí)
作者: ontheroad    時(shí)間: 2019-2-20 15:52
多謝樓主的貢獻(xiàn)!
作者: Mary哥    時(shí)間: 2019-2-23 12:43
首先表達(dá)一下我對(duì)樓主的感謝與崇拜,不過(guò)我還是個(gè)單片機(jī)小白,有些地方還是看不太懂,比如說(shuō)LCD里現(xiàn)實(shí)的第一行(個(gè)人感覺(jué)是土壤濕度傳感器的數(shù)據(jù))如果帶個(gè)單位就更好了。額。。。其實(shí)還有好多地方都看不懂,如果能有一份詳細(xì)的說(shuō)明呢就是錦上添花了,比如說(shuō),澆水的條件呀,按鍵的使用說(shuō)明呀,還有硬件的型號(hào)呀。當(dāng)然如果樓主有時(shí)間的話! 再次感謝樓主的寶貴資料!
作者: 吃瓜    時(shí)間: 2020-8-31 16:11
樓主你這個(gè)濕度模塊是要插土里嗎
作者: chendaying    時(shí)間: 2021-7-23 09:04
多謝樓主的貢獻(xiàn)!!!
作者: 247015164    時(shí)間: 2021-9-6 09:13
有程序,有圖紙。好




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 婷婷久久五月天 | 欧美 日本 国产 | 99久久久无码国产精品 | 一区二区免费在线 | 久草欧美视频 | 国产精品毛片无码 | 91亚洲精品久久久电影 | 国产精品视频在线播放 | 成人小视频在线观看 | 久久精品久久久久久 | 最新高清无码专区 | 午夜不卡一区二区 | 二区久久| 亚洲精品视频网站在线观看 | 日韩国产欧美在线观看 | 久久久久久久久久久高潮一区二区 | 国产一区二区三区久久 | 日韩一二三区 | 欧美无乱码久久久免费午夜一区 | 欧美精品v国产精品v日韩精品 | 视频一区 亚洲 | 欧美日韩中文国产一区发布 | 一区二区在线不卡 | 欧美一区二区在线视频 | 欧美成人免费在线视频 | 国产精品一区二区久久久久 | 亚洲精品免费在线观看 | 精品精品| 九九九久久国产免费 | 国产精品福利网站 | 久久免费视频1 | 日韩爱爱网 | 在线国产一区二区三区 | 亚洲精品免费在线观看 | 91免费在线看 | 亚洲福利在线视频 | 亚洲国产成人精品女人久久久 | 国产视频二区在线观看 | 亚洲视频在线观看一区二区三区 | 亚洲综合无码一区二区 | 亚洲精品国产a久久久久久 中文字幕一区二区三区四区五区 |