标题: 单片机自动浇花系统(附原理图、仿真文件、源程序) [打印本页]

作者: dai@1228    时间: 2017-12-1 12:02
标题: 单片机自动浇花系统(附原理图、仿真文件、源程序)
(共享资料)自己做的基于stc89c51单片机的自动浇花系统,有自动和手动两种模式,可以设置湿度的上下限,利用lcd1602显示,有一点遗憾的是设置湿度上下限时,没有光标闪动提示,希望大家给点建议,帮助改进,我把源程序附在这。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


原理图:


单片机源代码:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit ad_cs=P1^3;         //ADC0832的控制位
  5. sbit ad_clk=P1^0;
  6. sbit ad_dat=P1^1;

  7. sbit lcd_rs=P2^7;         //LCD1602的控制位
  8. sbit lcd_e=P2^6;

  9. sbit key1=P1^4;                 //独立按键
  10. sbit key2=P3^2;
  11. sbit key3=P3^3;

  12. sbit relay=P1^6;     //继电器

  13. bit flag=1;                     //工作模式标志
  14. bit flag_motor=1;         //手动模式下,抽水机开关标志
  15. bit flag_jia=0;
  16. bit flag_jian=0;

  17. uchar Hum_H=60;                 //自动模式下,湿度设定最大值
  18. uchar Hum_L=30;                 //自动模式下,湿度设定最小值

  19. uchar num=0;

  20. /********************延时函数1ms*****************
  21. void delay_ms(uint a)                                       
  22. {
  23.         uint i;
  24.         while(a--)
  25.         for(i=0;i<125;i++);
  26. }
  27. *************************************/


  28. /*******************延时函数50us******************/
  29. void delay_50us(uint a)
  30. {
  31.         uint i;
  32.         while(a--)
  33.         for(i=0;i<19;i++);
  34. }
  35. /*************************************/

  36. /*******************ADC读取******************/
  37. uchar read_ad(uchar channel)  
  38. {
  39.         uchar i;
  40.         uchar dat1,dat2;
  41.         ad_clk=0;
  42.         ad_cs=0;
  43.         ad_dat=1;
  44.         ad_clk=1;
  45.         ad_clk=0;  //起始信号

  46.         ad_dat=1;
  47.         ad_clk=1;
  48.         ad_clk=0;  //选择单通道模式

  49.         ad_dat=channel;//0对应通道0,1对应通道1
  50.         ad_clk=1;
  51.         ad_clk=0;

  52.         ad_dat=1;

  53.         for(i=0;i<8;++i)
  54.         {
  55.                  ad_clk=1;
  56.                 ad_clk=0;
  57.                 dat1=dat1<<1;
  58.                 if(ad_dat)
  59.                 dat1|=0x01;        
  60.         
  61.         }
  62.         for(i=0;i<8;i++)
  63.         {
  64.                  dat2=dat2>>1;
  65.                 if(ad_dat)
  66.                 dat2|=0x80;        
  67.                
  68.                 ad_clk=1;
  69.                 ad_clk=0;
  70.         }
  71.         ad_cs=1;
  72.         return (dat1==dat2)?dat1:0;
  73.         
  74. }
  75. /*************************************/

  76. /*******************LCD1602初始化******************/
  77. void write_com(uchar com)        //写指令
  78. {
  79.         lcd_e=0;
  80.         lcd_rs=0;
  81.         P0=com;
  82.         delay_50us(10);
  83.         lcd_e=1;
  84.         delay_50us(10);
  85.         lcd_e=0;
  86. }

  87. void write_data(uchar dat)  //写数据
  88. {
  89.         lcd_e=0;
  90.         lcd_rs=1;
  91.         P0=dat;
  92.         delay_50us(10);
  93.         lcd_e=1;
  94.         delay_50us(10);
  95.         lcd_e=0;
  96. }                        

  97. void init_lcd1602()                 //lcd 初始化
  98. {
  99.         delay_50us(300);
  100.         write_com(0x38);
  101.         delay_50us(100);
  102.         write_com(0x38);
  103.         delay_50us(100);
  104.         write_com(0x38);
  105.         write_com(0x38);
  106.         write_com(0x08);
  107.         write_com(0x01);
  108.         write_com(0x06);
  109.         write_com(0x0c);
  110. }

  111. void display_shu(uchar add,uchar dat)          //显示数字
  112. {
  113.         uchar l,m;
  114.         
  115. //        k=dat/100;
  116.         l=dat%100/10;
  117.         m=dat%10;

  118.         write_com(0x80+add);
  119. //        write_data(k+0x30);
  120.         write_data(l+0x30);
  121.         write_data(m+0x30);
  122. }

  123. void display_string(uchar add,uchar *dat)  //显示字符串
  124. {
  125.         uchar i;
  126.          write_com(0x80+add);
  127.         while(dat!=0&&(*dat!='\0')&&i<16)
  128.         {
  129.                  write_data(*dat);
  130.                 dat++;
  131.                 i++;
  132.                 if(i==15) i=0;
  133.         }
  134. }
  135. /*****************************************/

  136. /****************主函数*******************/
  137. void main()
  138. {
  139.         EA=1;                                                          //开总中断
  140.         EX0=1;                                                          //开外部中断0
  141.         EX1=1;                                                          //开外部中断1
  142.         IT0=0;                                                          //外部中断0触发方式为低电平
  143.         IT1=0;                                                          //外部中断1触发方式为低电平
  144.         
  145.         init_lcd1602();        
  146.         
  147.         display_string(0,"Hum:  %");      //实时显示当前的湿度
  148.         display_string(11,"H:  %");       //显示设置的湿度最大值

  149.         display_string(0x40,"Mode:");          //显示工作模式
  150.         display_string(0x40+11,"L:  %");  //显示设置的湿度最小值


  151.     while(1)
  152.         {        
  153.                 uchar i;
  154.                
  155.                 i=100-read_ad(0)*0.39;
  156.                 display_shu(4,i);
  157.                 display_shu(13,Hum_H);
  158.                 display_shu(0x40+13,Hum_L);
  159.                 if(key1==0)        
  160.                         {
  161.                                 delay_50us(100);
  162.                                 if(key1==0)
  163.                                 {
  164.                                         while(!key1);
  165.                                         num++;
  166.                                         if(num>2) num=0;
  167.                                 }        
  168.                            
  169.                                 switch (num)                                         //选择工作模式和调整湿度设置最大、最小值
  170.                             {
  171.                                 case 0:flag=~flag;
  172.                                            flag_jia=0;
  173.                                            flag_jian=0;
  174.                                            //write_com(0x80+0x40);
  175.                                        //write_com(0x0f);
  176.                                            break;
  177.                                 case 1://write_com(0x80+9);
  178.                                        //write_com(0x0f);
  179.                                            //delay_50us(1000);
  180.                                            //write_com(0x0c);
  181.                                            flag_jia=1;
  182.                                            flag_jian=0;
  183.                                            break;
  184.                                 case 2://write_com(0x80+0x40+9);
  185.                                        //write_com(0x0f);
  186.                                            //delay_50us(1000);
  187.                                            //write_com(0x0c);
  188.                                            flag_jian=1;
  189.                                            flag_jia=0;
  190.                                            break;        
  191.                            }
  192.                            if(flag==0&&num==1)        
  193.                            {
  194.                                    flag=~flag;
  195.                                    num=0;
  196.                                    flag_jia=0;
  197.                                    flag_jian=0;
  198.                            }               
  199.                     }                  
  200.                 if(flag==0)                              //手动模式
  201.                 {
  202.                         
  203.                          display_string(0x40+5,"MT");
  204.                         if(flag_motor) relay=1;
  205.                         else if(i<Hum_H) relay=0;          //不能超过湿度最大值
  206.                         else relay=1;
  207.                 }                                
  208.                 else                                                          //自动模式
  209.                 {
  210.                         display_string(0x40+5,"AT");
  211.                         if(i<(Hum_L+Hum_H)/2)                   //最大和最小值的平均值作为抽水的判断条件
  212.                         {
  213.                                  relay=0;
  214.                         }
  215.                         else relay=1;
  216.                 }
  217.      }        
  218. }
  219. /********************************************/

  220. /***********************外部中断*********************/
  221. void int0() interrupt 0
  222. {
  223.         delay_50us(20);
  224.         if(key2==0)
  225.         while(!key2);
  226.         flag_motor=~flag_motor;
  227.         if(flag&&flag_jia)
  228.           {
  229.                     //write_com(0x80+9);
  230.               //write_com(0x0f);
  231.                   //delay_50us(1000);
  232.               //write_com(0x0c);
  233.                   //delay_50us(1000);
  234.                   Hum_H++;
  235.                   if(Hum_H>=99) Hum_H=99;
  236.           }
  237.         if(flag&&flag_jian)
  238.           {
  239.                     //write_com(0x80+0x40+9);
  240.                   //write_com(0x0f);
  241.                   //delay_50us(1000);
  242.                   //write_com(0x0c);
  243.                   //delay_50us(1000);
  244.                   Hum_L++;
  245.                   if(Hum_L>=Hum_H) Hum_L=Hum_H-1;
  246.           }   
  247. }

  248. void int1() interrupt 2
  249. {
  250.         delay_50us(20);
  251.         if(key3==0)
  252.         while(!key3);        
  253.         if(flag&&flag_jian)
  254.           {
  255.                     //write_com(0x80+0x40+9);
  256.                   //write_com(0x0f);
  257.                   //delay_50us(1000);
  258.                   //write_com(0x0c);
  259.                   //delay_50us(1000);
  260.                   Hum_L--;
  261.                   if(Hum_L<=1) Hum_L=1;
  262.           }
  263.         if(flag&&flag_jia)
  264.           {
  265.               //write_com(0x80+9);
  266.               //write_com(0x0f);
  267.                   //delay_50us(1000);
  268.               //write_com(0x0c);
  269.                   //delay_50us(1000);
  270.                   Hum_H--;
  271.                   if(Hum_H<=Hum_L) Hum_H=Hum_L+1;
  272.           }
  273. }
  274. /********************************************/
复制代码
全部资料51hei下载地址:
基于51单片机的自动浇花系统.zip (33.96 KB, 下载次数: 1461)




作者: yxlclp17    时间: 2017-12-5 10:11
在吗,怎么在keil3_full编译不行的,我一摸一样复制的
作者: GeminiYJL    时间: 2017-12-5 12:33
很厉害的
作者: dai@1228    时间: 2017-12-8 13:33
yxlclp17 发表于 2017-12-5 10:11
在吗,怎么在keil3_full编译不行的,我一摸一样复制的

提示什么错误 我用的keil4编译环境
作者: y382246268    时间: 2017-12-8 14:30
赞一个!
作者: 残剑飞雪    时间: 2017-12-9 19:49
adc0832不能仿真怎么办
作者: what-小白    时间: 2018-1-2 12:00
我是小白,请问左下角的那个圆形在ISIS中怎么找啊
作者: 1126469277    时间: 2018-2-8 11:49
yxlclp17 发表于 2017-12-5 10:11
在吗,怎么在keil3_full编译不行的,我一摸一样复制的

格式不对或者缺少什么语句,仔细检查,如果代码没问题建议换keil 4
作者: xdl932365660    时间: 2018-2-8 13:25
给你点赞,暂时不下载 ,需要的时候自然下载
作者: 大力做大力愛    时间: 2018-2-8 18:45
没有下载电路吧
作者: 41797511    时间: 2018-4-1 11:42
非常给力!!!
作者: BOOKS    时间: 2018-4-2 19:09
很不错,能仿真出来
作者: 无时崩溃    时间: 2018-4-3 08:05
感谢楼主分享
作者: yilinghai    时间: 2018-4-3 10:59
可以用keil 4编译成功,仿真可以

搜狗截图20180403105826.jpg (260.46 KB, 下载次数: 247)

搜狗截图20180403105826.jpg

作者: slt201199    时间: 2018-4-15 10:36
又没有做出来东西

作者: icgsgf    时间: 2018-4-15 14:46
身为一个小白感觉很厉害厉害
作者: timepasserby    时间: 2018-4-25 17:00
请问能解释一下AD原理图继电器模块与电源接口模块的工作原理吗,看不太懂。
作者: 畴昔至稚    时间: 2018-5-5 22:54
为啥我下载了,却没有清单
作者: epaysh    时间: 2018-5-6 05:45
BOOKS 发表于 2018-4-2 19:09
很不错,能仿真出来

你好,我是新手,请问用的是什么仿真软件?能不能发给我一份?545535222@qq.com 谢谢
作者: epaysh    时间: 2018-5-6 05:46
你好,我是新手,请问用的是什么仿真软件?能不能发给我一份?545535222@qq.com 谢谢
作者: 秋天的童话    时间: 2018-5-6 14:35
厉害了
作者: 清如许    时间: 2018-5-10 15:46
很厉害,正好用到
作者: 17802971359    时间: 2018-5-13 16:30
绝对干货,不错
作者: 刘乐涛    时间: 2018-5-15 16:01
仿真软件叫什么名字   在哪里可以下载,谢谢
作者: PaJamas_X    时间: 2018-5-16 16:08
这个。。。楼主用的是什么湿度传感器呢没找到
作者: PaJamas_X    时间: 2018-5-16 16:09
刘乐涛 发表于 2018-5-15 16:01
仿真软件叫什么名字   在哪里可以下载,谢谢

Proteus
作者: li15616313970    时间: 2018-5-20 15:19
怎么显示屏没有显示啊

作者: xianfajushi    时间: 2018-5-23 18:05
下载一个试看,谢谢分享。
作者: echoma    时间: 2018-5-23 20:10
请问现在很多土壤湿度传感器不需要AD,那程序应该变成什么样子呢?
作者: 刘乐涛    时间: 2018-5-30 20:24
各位大哥们,程序有点看不懂,大神能加我好友指点一下吗,1224799169重谢
作者: amz    时间: 2018-6-5 19:36
感觉好厉害呀  新人勿怪
作者: hjj12345    时间: 2018-6-25 10:15
yilinghai 发表于 2018-4-3 10:59
可以用keil 4编译成功,仿真可以

朋友如何仿真啊
作者: 丑东西    时间: 2018-6-26 18:42
您好,如果有STC89C51单片机开发板,这个仿真图该怎样设计
作者: vbnm    时间: 2018-9-26 22:00
楼主你好.怎解湿度低于下限值时电机不工作啊
作者: cwzhang_87    时间: 2018-10-6 15:14
多谢分享哈

作者: Moqi-S    时间: 2018-11-7 21:24
感谢楼主分享
作者: duyi324    时间: 2018-11-8 09:05
很给力,谢谢分享
作者: wangchang    时间: 2018-11-8 10:29
谢谢楼主 感谢这次带来的帮助
作者: mumu168    时间: 2018-11-9 07:58
下载学习一下,谢谢分享
作者: 回忆味    时间: 2018-11-27 08:59
刚好时实训作业要做赞一个
作者: 守望幸福笑笑    时间: 2018-12-24 15:02
不错,很实用!
作者: shaochen666    时间: 2019-1-14 17:00
厉害呀楼主
作者: a86340    时间: 2019-1-14 22:50
没原理图
作者: 江渚鹭鸶    时间: 2019-1-29 01:43

很给力,谢谢分享
作者: Mary哥    时间: 2019-2-7 12:35
厉害   老哥
作者: anhuizj    时间: 2019-2-20 22:59
yilinghai 发表于 2018-4-3 10:59
可以用keil 4编译成功,仿真可以

你好  我在自动浇花器那里看到了你   我有事请教你一下  可以加我QQ吗?QQ1019062703  感激不尽
作者: hylinzhi    时间: 2019-3-13 09:10
好东西,很早前就想弄一个了,谢谢楼主
作者: Songx    时间: 2019-3-18 08:01
可以把需要的元器件都列出来吗
作者: 正直少年L    时间: 2019-3-21 21:40
赞一个
作者: zxldpj    时间: 2019-3-25 17:17
赞一个
作者: bi7jvw    时间: 2019-4-8 10:09
好东西,正是需要的

作者: bi7jvw    时间: 2019-4-8 10:11
谢谢,正是我需要的
作者: 八年级的我    时间: 2019-4-16 22:06
yilinghai 发表于 2018-4-3 10:59
可以用keil 4编译成功,仿真可以

为什么我的LCD只亮屏,不显示数据?
作者: john0317    时间: 2019-4-16 23:34
不错的代码,谢谢楼主
作者: monkop    时间: 2019-4-17 10:56
谢谢楼主分享
作者: Mary哥    时间: 2019-4-25 17:28
发现一个小问题,感觉设置最大值和最小值好像没什么意义呀,不管怎么样都是根据平均值进行判断的。我觉得浇水状态下直接浇到最大值停止,最小值开始工作比较好

作者: delialsh    时间: 2019-4-27 20:01
本帖最后由 delialsh 于 2019-5-1 16:25 编辑

已经仿真成功,谢谢楼主


作者: 51黑真棒    时间: 2019-5-3 01:40
刘乐涛 发表于 2018-5-15 16:01
仿真软件叫什么名字   在哪里可以下载,谢谢

可以用proteus这个仿真软件,可以在微信关注公众号软件安转管家里搜,就会有下载方法跟链接
作者: 1841252099    时间: 2019-5-8 16:49
duoxei
作者: 1841252099    时间: 2019-5-8 16:54
多谢楼主,很好的资料
作者: 崇zcw    时间: 2019-5-12 18:44
赞一个
作者: 春光乍现    时间: 2019-5-14 19:07
很实用!受益匪浅
作者: 15872418270    时间: 2019-5-15 17:14
测试程序,1602显示屏显示不了是为什么?
作者: 190267532    时间: 2019-6-6 00:33
设置不了上下限值呀
作者: Youlidedapao    时间: 2019-6-18 17:33
老哥 能把原理图仿真文件发给我吗 感谢
作者: Yangyuan    时间: 2019-6-27 16:04
不错不错不错
作者: TTQ001    时间: 2019-7-6 10:12
谢谢分享

作者: 1527471539    时间: 2019-10-8 15:54
为什么仿真程序显示有两个错误啊
作者: 1527471539    时间: 2019-10-8 15:54
残剑飞雪 发表于 2017-12-9 19:49
**** 作者被禁止或删除 内容自动屏蔽 ****

对啊,为什么不可以啊
作者: 一朵云彩    时间: 2019-10-16 23:03
刚好要用,赞了
作者: xiayuchen    时间: 2019-11-10 19:35
能不能发我一份仿真 我的仿真软件一放晶振就闪退
作者: xiayuchen    时间: 2019-11-10 20:44
我的邮箱187386825@qq.com
作者: 孙铭浩    时间: 2019-11-20 13:55
很好,有个方向了
作者: 孙铭浩    时间: 2019-11-20 15:21
感谢楼主分享
作者: 何涂涂    时间: 2019-12-3 19:28
多谢大神帮助
作者: 纵火    时间: 2019-12-28 12:28
刚好设计可以用到,赞一个
作者: x刘1234    时间: 2020-3-25 15:35
我画的一模一样    怎么运行不了呢   出 No power supply specified for net VCC in Power Rail Configuration.
这一行字
作者: Clear-Aurora    时间: 2020-4-22 16:25
如果用开发板怎么接线呢
作者: Ambiton    时间: 2020-5-10 12:06
代码怎么有错误呢
作者: 997233503    时间: 2020-5-11 13:34
楼主这个真的很给力!
作者: 997233503    时间: 2020-5-11 13:36
感谢楼主的分享   !
作者: 阿飞7812    时间: 2020-5-13 20:43
收下了 谢谢分享
作者: 阿飞7812    时间: 2020-5-13 21:03
湿度检测土的湿度是个什么元件 放在土里 楼主指点
作者: h4--    时间: 2020-5-24 19:16
八年级的我 发表于 2019-4-16 22:06
为什么我的LCD只亮屏,不显示数据?

你知道怎样设置adc08032的型号吗?我的仿真不出来,说我没有设置它的型号
作者: h4--    时间: 2020-5-24 19:17
yilinghai 发表于 2018-4-3 10:59
可以用keil 4编译成功,仿真可以

请问你知道adc08032的型号怎么设定吗?我仿真不出来
作者: LWFDZY    时间: 2020-5-28 11:00
厉害了,这个真的对我有很大帮助
作者: lxxxx99    时间: 2020-6-2 14:07
想加个蜂鸣报警系统,求怎么改程序
作者: 有个网名也不错    时间: 2020-6-2 15:58
还不错吧
作者: 黄马年    时间: 2020-6-5 10:23
先复制代码编译看看
作者: yousir    时间: 2020-6-5 20:05
yilinghai 发表于 2018-4-3 10:59
可以用keil 4编译成功,仿真可以

这个太强了,找了好久
作者: 喜大叔    时间: 2020-6-6 14:48
这个不错,家里的花花草草有救了
作者: 努力吧    时间: 2020-6-11 16:40
yilinghai 发表于 2018-4-3 10:59
可以用keil 4编译成功,仿真可以

我想问一下,为什么我弄出来的温度中值不是45而是50啊
作者: Burger    时间: 2020-6-13 00:42
插个眼,等我学会了,再学这个
作者: Burger    时间: 2020-6-13 00:43
赞!学一手,自己也试一试
作者: 叶俊哥哥    时间: 2020-6-22 14:31
实测,在keil5中编译成功;谢谢楼主提供的代码。
作者: Alexcs    时间: 2020-6-24 12:12
很有参考价值
作者: 烈火    时间: 2020-6-24 17:13
用STC89C51单片机开发这个项目,很好的。赞一个
作者: 铃儿响叮当    时间: 2020-6-26 10:59
刚好时实训作业要做赞一个
作者: 铃儿响叮当    时间: 2020-6-26 20:29
谢谢楼主 感谢这次带来的帮助
作者: 原沐柒    时间: 2020-6-27 10:08
好像程序错误




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1