找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3914|回复: 8
收起左侧

stc89c51单片机定时浇水PCB仿真程序 使用了adc0832+土壤湿度传感器

  [复制链接]
回帖奖励 20 黑币 回复本帖可获得 1 黑币奖励! 每人限 1 次(中奖概率 50%)
ID:383498 发表于 2020-6-19 14:46 | 显示全部楼层 |阅读模式
制作出来的定时浇水实物图如下:

实物图片

实物图片

实物图片

实物图片

文件有点大,所有分批上传了,见谅

Altium Designer画的单片机定时浇水系统原理图和PCB图如下:(51hei附件中可下载工程文件)
51hei.png 51hei.png 51hei.png

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.png

单片机源程序如下:
  1. /* K1 用于设置选择高位还是低位                                                              左数第四个   
  2. K2 用于高/低位减                                                                            左数第三个
  3. K3 用于高/低位加                                                                            左数第二个
  4. K4用于 设置模式 初始设置其他3按键按下无用 显示at 按下一次之后启动3个按键 显示 mt            左数第一个
  5. 当测量值超过设置值或者低于设定值 小灯亮 反之不亮

  6. 显示内容
  7. hun :数值%       H:数值
  8. mode:模式        L:数值
  9. */
  10. #include<reg51.h>
  11. #include"lcd.h"
  12. #include"adc0832.h"

  13. unsigned char shidu;                                                  //湿度数据
  14. unsigned char shidu_h=70;                                              //湿度高位
  15. unsigned char shidu_l=20;                                             //湿度低位
  16. unsigned char shidu_table[]={0,0,0,0};                                //湿度数组
  17. unsigned char disp1[]="Hum :";                                         //显示
  18. unsigned char disp2[]="Mode:";
  19. unsigned char disp3[]="% AT MT H: L:";
  20. sbit LED=P1^1;
  21. sbit K1=P2^0;
  22. sbit K2=P2^1;
  23. sbit K3=P2^2;
  24. sbit K4=P2^3;
  25. bit mode_flag;                                                            //高低位模式
  26. bit shizhi_flag;                                                          //设置模式
  27. void key_proy();
  28. void Delay10ms(void) ;  //误差 0us

  29. void Delay10ms(void)   //误差 0us
  30. {
  31.     unsigned char a,b,c;
  32.     for(c=1;c>0;c--)
  33.         for(b=38;b>0;b--)
  34.             for(a=130;a>0;a--);
  35. }
  36. void Timer0Init()
  37. {
  38.         TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。

  39.         TH0=0XFC;        //给定时器赋初值,定时1ms
  40.         TL0=0X18;        
  41.         ET0=1;//打开定时器0中断允许
  42.         EA=1;//打开总中断
  43.         TR0=1;//打开定时器                        
  44. }



  45. void main()
  46. {
  47.   unsigned char i;
  48.         LcdInit();
  49.         Timer0Init();  //定时器0初始化
  50.          while(1)
  51.          {
  52.                     key_proy();
  53.                            LcdWriteCom(0x80);
  54.                                 for(i=0;i<5;i++)
  55.                                 {
  56.                                         LcdWriteData(disp1[i]);                                   //显示Hum :
  57.                                 }
  58.                                 LcdWriteCom(0x80+0X40);
  59.                                 for(i=0;i<5;i++)
  60.                                 {
  61.                                         LcdWriteData(disp2[i]);                                  //显示Mode:
  62.                                 }
  63.                                 LcdWriteCom(0x85);
  64.                                 LcdWriteData(shidu_table[0]+'0');                           //显示湿度               
  65.                                 LcdWriteCom(0x86);
  66.                                 LcdWriteData(shidu_table[1]+'0');        
  67.         LcdWriteCom(0x87);        
  68.         LcdWriteData(disp3[0]);                                                              //显示%
  69.                                 if(shizhi_flag==0)
  70.                                 {
  71.                                         LcdWriteCom(0x80+0X45);                                    //显示at

  72.                                         LcdWriteData(disp3[2]);        
  73.                                         LcdWriteCom(0x80+0X46);        
  74.                                         LcdWriteData(disp3[3]);        
  75.                                 }
  76.                                 else
  77.                                 {
  78.                                   LcdWriteCom(0x80+0X45);                                     //显示MT
  79.                                         LcdWriteData(disp3[5]);        
  80.                                         LcdWriteCom(0x80+0X46);        
  81.                                         LcdWriteData(disp3[6]);                                
  82.                                 }
  83.                                 LcdWriteCom(0x8c);                                     //显示设定值  高位
  84.                                 LcdWriteData(disp3[8]);                    
  85.         LcdWriteCom(0x8d);
  86.                                 LcdWriteData(disp3[9]);               
  87.         LcdWriteCom(0x8e);
  88.                                 LcdWriteData(shidu_h/10+'0');        
  89.               LcdWriteCom(0x8f);
  90.                                 LcdWriteData(shidu_h%10+'0');               

  91.                           LcdWriteCom(0xcc);                                 //显示设定值  低位
  92.                                 LcdWriteData(disp3[11]);        
  93.         LcdWriteCom(0xcd);
  94.                                 LcdWriteData(disp3[12]);               
  95.         LcdWriteCom(0xce);
  96.                                 LcdWriteData(shidu_l/10+'0');        
  97.               LcdWriteCom(0xcf);
  98.                                 LcdWriteData(shidu_l%10+'0');                                                
  99.          
  100.          }
  101. }               

  102. void key_proy()
  103. {
  104.             unsigned char i;
  105.       if(K1==0)                 
  106.                         {
  107.               Delay10ms();        //消除抖动
  108.                                 if(K1==0)
  109.                           mode_flag=~mode_flag;                                            // 设置按键模式
  110.                                 while((i<50)&&(K1==0))         //检测按键是否松开
  111.                                 {
  112.                                         Delay10ms();
  113.                                         i++;
  114.                                 }
  115.                                 i=0;                                
  116.                         }         
  117.       if(K2==0)                                                                  // 高低位减
  118.                         {
  119.               Delay10ms();        //消除抖动
  120.                                 if(K2==0)
  121.                                 {
  122.                                         if(shizhi_flag==1)
  123.                                         {
  124.                                                 if(mode_flag==0)
  125.                                                                 shidu_l--;        
  126.                                                 if(mode_flag==1)
  127.                                                                 shidu_h--;        
  128.                                         }
  129.                                                    
  130.                                 }               
  131.                                 while((i<50)&&(K2==0))         //检测按键是否松开
  132.                                 {
  133.                                         Delay10ms();
  134.                                         i++;
  135.                                 }
  136.                                 i=0;                                
  137.                         }         
  138.                   if(K3==0)                                                             // 高低位加
  139.                         {
  140.               Delay10ms();        //消除抖动
  141.                                 if(K3==0)
  142.                                 {
  143.           if(shizhi_flag==1)
  144.                                         {
  145.                                                 if(mode_flag==0)
  146.                                                                 shidu_l++;        
  147.                                                 if(mode_flag==1)
  148.                                                                 shidu_h++;        
  149.                                         }                                       
  150.                                 }               
  151.                                 while((i<50)&&(K3==0))         //检测按键是否松开
  152.                                 {
  153.                                         Delay10ms();
  154.                                         i++;
  155.                                 }
  156.                                 i=0;                                
  157.                         }
  158.                         if(K4==0)                                                           // 设置高位/低位
  159.                         {
  160.               Delay10ms();         
  161.                                 if(K4==0)
  162.                                 {
  163.                          shizhi_flag=~shizhi_flag;
  164.                                 }               
  165.                                 while((i<50)&&(K4==0))         //检测按键是否松开
  166.                                 {
  167.                                         Delay10ms();
  168.                                         i++;
  169.                                 }
  170.                                 i=0;                                
  171.                         }

  172. }

  173. void Timer0() interrupt 1
  174. {
  175.         static unsigned char i,key_time;
  176.         TH0=0XFC;        //给定时器赋初值,定时1ms
  177.         TL0=0X18;
  178.         i++;key_time++;
  179.         if(key_time==10)
  180.         {
  181.           key_time=0;
  182.         //        key_proy();
  183.         }
  184.         if(i==100)                                               //每100ms读取一次数据
  185.         {
  186.                   i=0;
  187.                   shidu=100-read_ad(0)*0.39 ;              
  188.                         shidu_table[0] = shidu%100/10; //十位
  189.                         shidu_table[1] = shidu%10;//个位
  190.                   if((shidu<=shidu_h)&&(shidu>=shidu_l))              //温度在 设定值小灯灭
  191.                                 LED=1;
  192.                         else                                                // 小灯亮
  193.                                 LED=0;
  194.                         
  195.         }        
  196. }
复制代码

所有资料51hei提供下载:

仿真.zip

64.54 KB, 下载次数: 77, 下载积分: 黑币 -5

程序.zip

39.12 KB, 下载次数: 98, 下载积分: 黑币 -5

资料.zip

338.78 KB, 下载次数: 70, 下载积分: 黑币 -5

硬件.zip

15.52 MB, 下载次数: 68, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:32289 发表于 2020-6-19 20:41 | 显示全部楼层
不错、不错,正想DIY一个。
回复

使用道具 举报

ID:108573 发表于 2020-6-20 08:32 | 显示全部楼层
多谢分享,一块学习
回复

使用道具 举报

ID:774462 发表于 2020-6-20 10:37 | 显示全部楼层
多谢分享,一块学习
回复

使用道具 举报

ID:477512 发表于 2020-6-21 22:25 | 显示全部楼层
正需要这个单片机浇水控制器,谢谢分享!
回复

使用道具 举报

ID:787812 发表于 2020-6-25 11:17 | 显示全部楼层
这个厉害了 多谢分享
回复

使用道具 举报

ID:789477 发表于 2020-6-25 14:31 | 显示全部楼层

正需要这个单片机浇水控制器,谢谢分享!
回复

使用道具 举报

ID:495287 发表于 2020-6-27 12:20 | 显示全部楼层
谢谢楼主分享指点,学习下先。
好人一生平安。
回复

使用道具 举报

ID:305511 发表于 2020-9-21 18:04 | 显示全部楼层
正需要烧水控制器,谢谢分享!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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