找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7799|回复: 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 单片机教程网

快速回复 返回顶部 返回列表