找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2466|回复: 2
打印 上一主题 下一主题
收起左侧

AT89S52单片机盆栽助长器的PCB原理图+源程序设计

[复制链接]
跳转到指定楼层
楼主
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)


单片机源程序如下:
  1. /*头文件*/
  2. #include<reg52.h>
  3. #include <intrins.h>
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. #define yh 0x80 //LCD第一行的初始位置
  7. #define er 0x80+0x40 //LCD第二行初始位置
  8. sbit DHT=P1^7;                  //温湿度传感器数据线
  9. sbit set_key=P1^2;          //“设置”键 K1
  10. sbit add_key=P1^3;           //“加”键 K2
  11. sbit cut_key=P1^4;           //  “减”键 K3
  12. sbit rs=P1^0;          
  13. sbit en=P1^1;                 
  14. sbit speak=P1^5;           //   蜂鸣器

  15. sbit JK1=P2^3;                        //加温继电器
  16. sbit JK2=P2^2;                        //降温继电器
  17. sbit JK3=P2^1;                        //加湿继电器
  18. sbit JK4=P2^0;                        //降湿继电器

  19. unsigned char shiZ,wenZ,check;
  20. uchar flog4,temp,a;
  21. uchar code tab1[]={"T:  -H:  -L:  "}; //测量值显示的固定字符
  22. uchar code tab2[]={"RH:  -H:  -L:  "};//报警值显示的固定字符
  23. uchar set_data[4]={50,10,70,40};        //报警初始值的设定,分别是 温度上限 下限 湿度上限 下限
  24. uchar XX[8]={0,0,0,0,0,0,0,0};
  25. uchar tate[4];
  26. uchar read_data[5];

  27. void delay_10us()
  28. {
  29.          uchar i;
  30.          i--;i--;i--;i--;i--;i--;
  31. }
  32. void delay_1ms(uint xms)//延时函数,有参函数
  33. {
  34.         uint x,y;
  35.         for(x=xms;x>0;x--)
  36.          for(y=124;y>0;y--);
  37. }
  38. //****液晶写入指令函数****//
  39. void write_1602com(uchar com)
  40. {                                               
  41.         rs=0;//数据/指令选择置为指令
  42.         P0=com;//送入数据
  43.         delay_1ms(1);
  44.         en=1;//拉高使能端,为制造有效的下降沿做准备
  45.         delay_1ms(1);
  46.         en=0;//en由高变低,产生下降沿,液晶执行命令
  47. }
  48. //***液晶写入数据函数****//
  49. void write_1602dat(uchar dat)
  50. {
  51.         rs=1;//数据/指令选择置为数据
  52.         P0=dat;//送入数据
  53.         delay_1ms(1);
  54.         en=1; //en置高电平,为制造下降沿做准备
  55.         delay_1ms(1);
  56.         en=0; //en由高变低,产生下降沿,液晶执行命令
  57. }
  58. //***液晶初始化函数****//
  59. void lcd_init()
  60. {
  61.         write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据
  62.         write_1602com(0x0c);//开显示不显示光标
  63.         write_1602com(0x06);//整屏不移动,光标自动右移
  64.         write_1602com(0x01);//清显示

  65.         write_1602com(yh+0);//日历显示固定符号从第一行第1个位置之后开始显示
  66.         for(a=0;a<14;a++)
  67.         {
  68.          write_1602dat(tab1[a]);//向液晶屏写日历显示的固定符号部分
  69.         }
  70.         write_1602com(er+0);//时间显示固定符号写入位置,从第2个位置后开始显示
  71.         for(a=0;a<15;a++)
  72.         {
  73.         write_1602dat(tab2[a]);//写显示时间固定符号,两个冒号
  74.         }
  75. }
  76. /*****************温湿度传感器DHT11 读一个字节函数******************/
  77. uchar read_byte()
  78. {
  79.         uchar value,i;
  80.         for(i=0;i<8;i++)                //一个字节有八位 所以用for循环
  81.         {
  82.                 value=value<<1;                //从字节高位开始读  需要移位
  83.                 while(DHT==0);
  84.                 delay_10us();
  85.                 delay_10us();
  86.                 delay_10us();
  87.                 if(DHT)                                         //判断读到是“1”还是“0”
  88.                 {
  89.                         value=value|0x01;        //如果是“1” value的值就要加一
  90.                         while(DHT!=0)                //等待这一位数据结束 因为70us的高电平表示“1”
  91.                         {                                        //
  92.                                 DHT=1;
  93.                         }
  94.                 }
  95.         }
  96.         return value;                //返回读到的这一字节数据
  97. }
  98. /*****************温湿度传感器DHT11 读数据函数******************/
  99. /**一个完整的数据一共是五个字节******************/
  100. void read_value()          
  101. {
  102.         uchar i;
  103.         DHT=0;
  104.         delay_1ms(20);
  105.         DHT=1;
  106.         delay_10us();
  107.         delay_10us();
  108.         delay_10us();
  109.         delay_10us();
  110.         if(DHT==0)
  111.         {
  112.                 while(DHT!=1);
  113.                 DHT=1;
  114.                 while(DHT==1);
  115.                 for(i=0;i<5;i++)
  116.                 {
  117.                         read_data[i]=read_byte();//将读到的五个字节数据放到数组read_data【5】中
  118.                 }
  119.         }       
  120. }
  121. /**********处理读到的温湿度数据******************/
  122. void pro_value()
  123. {
  124.         read_value();
  125.         temp=read_data[0]+read_data[1]+read_data[2]+read_data[3];
  126.         if(read_data[4]==temp)                //检测读到的数据是否正确                         
  127.                 {
  128.                         shiZ=read_data[0];           //湿度整数部分
  129.                         wenZ=read_data[2];         //         温度整数部分
  130.                 }
  131.         tate[0]=wenZ/10;           //将温湿度的整数部分的十位和个位分开
  132.         tate[1]=wenZ%10;        //分开后的数据存放在数组tate【4】中 以供lcd显示       
  133.         tate[2]=shiZ/10;
  134.         tate[3]=shiZ%10;
  135. }
  136. /********** 报警处理函数******************/
  137. void baojing()
  138. {
  139.           if((set_data[2]<shiZ)||(set_data[3]>shiZ)) //判断是否有报警 如果有就进入函数 然后再判断具体是哪个值报警
  140.           {
  141.                         speak=0;
  142. //                if(set_data[0]<wenZ) //如果温度超过上限 降温
  143. //                        {
  144. //                                JK2=0;
  145. //                        }
  146. //                        else
  147. //                        {
  148. //                                JK2=1;
  149. //                        }
  150. //                if(set_data[1]>wenZ)   //如果温度低于下限 升温
  151. //                        {
  152. //                                JK1=0;
  153. //                        }
  154. //                        else
  155. //                        {
  156. //                                JK1=1;
  157. //                        }
  158.                 if(set_data[2]<shiZ)         //如果湿度超过上限 降湿
  159.                         {
  160.                                 JK4=0;
  161.                         }
  162.                         else
  163.                         {
  164.                                 JK4=1;
  165.                         }
  166.                 if(set_data[3]>shiZ)          //如果湿度低于下限 加湿
  167.                         {
  168.                                 JK3=0;
  169.                         }
  170.                         else
  171.                         {
  172.                                 JK3=1;
  173.                         }
  174.                 }
  175.           else                   //没有报警情况的出现
  176.           {
  177.                    speak=1;                                 //蜂鸣器不响
  178.                         JK1=1;
  179.                         JK2=1;                                //
  180.                         JK3=1;
  181.                         JK4=1;
  182.           }
  183.           
  184. }
  185. /**********显示函数******************/

  186. void display2()                        //测量显示
  187. {
  188.         write_1602com(yh+2);
  189.         for(a=0;a<2;a++)
  190.         {
  191.           write_1602dat(tate[a]+0x30);
  192.         }
  193.         write_1602com(er+3);
  194.         for(a=2;a<4;a++)
  195.         {
  196.           write_1602dat(tate[a]+0x30);
  197.         }
  198. }

  199. void pros_Sdata()//显示四个报警值
  200. {
  201.         uchar i;
  202.         for(i=0;i<4;i++)
  203.         {
  204.                 XX[2*i]=set_data[i]/10;
  205.                 XX[2*i+1]=set_data[i]%10;       
  206.         }
  207.         write_1602com(yh+7);  //显示温度上限
  208.         for(a=0;a<2;a++)
  209.         {
  210.           write_1602dat(XX[a]+0x30);
  211.         }
  212.         write_1602com(yh+12);  //显示温度下限
  213.         for(a=2;a<4;a++)
  214.         {
  215.           write_1602dat(XX[a]+0x30);
  216.         }
  217.         write_1602com(er+8);         //显示湿度上限
  218.         for(a=4;a<6;a++)
  219.         {
  220.           write_1602dat(XX[a]+0x30);
  221.         }
  222.         write_1602com(er+13);  //显示湿度下限
  223.         for(a=6;a<8;a++)
  224.         {
  225.           write_1602dat(XX[a]+0x30);
  226.         }
  227. }

  228. void key()
  229. {
  230.         if(set_key==0)
  231.                  {
  232.                          delay_1ms(5);
  233.                         if(set_key==0)
  234.                         {                 
  235.                                 flog4=flog4+1;
  236.                                 if(flog4>4)
  237.                                 {
  238.                                         flog4=0;
  239.                                 }
  240.                                 while(set_key==0);
  241.                         }
  242.                 }
  243.                 if(flog4==1)        //修改温度上限
  244.                 {
  245.                          if(add_key==0)
  246.                                 {
  247.                                  delay_1ms(5);
  248.                                  if(add_key==0)
  249.                                  {
  250.                                          set_data[0]=set_data[0]+1;
  251.                                         while(add_key==0);
  252.                                         if(set_data[0]>99)
  253.                                         {
  254.                                                         set_data[0]=99;
  255.                                         }
  256.                                  }
  257.                                 }
  258.                                 if(cut_key==0)
  259.                                 {
  260.                                  delay_1ms(5);
  261.                                  if(cut_key==0)
  262.                                  {
  263.                                          set_data[0]=set_data[0]-1;
  264.                                         while(cut_key==0);
  265.                                         if(set_data[0]<=0)
  266.                                         {
  267.                                                 set_data[0]=0;
  268.                                         }
  269.                                  }
  270.                                 }
  271.                                  pros_Sdata();
  272.                           }
  273.                 if(flog4==2)        //修改温度下限
  274.                 {
  275.                          if(add_key==0)
  276.                                 {
  277.                                  delay_1ms(5);
  278.                                  if(add_key==0)
  279.                                  {
  280.                                          set_data[1]=set_data[1]+1;
  281.                                         while(add_key==0);
  282.                                         if(set_data[1]>99)
  283.                                         {
  284.                                                 set_data[1]=99;
  285.                                         }
  286.                                  }
  287.                                 }
  288.                                 if(cut_key==0)
  289.                                 {
  290.                                  delay_1ms(5);
  291.                                  if(cut_key==0)
  292.                                  {
  293.                                          set_data[1]=set_data[1]-1;
  294.                                         while(cut_key==0);
  295.                                         if(set_data[1]<=0)
  296.                                         {
  297.                                                 set_data[1]=0;
  298.                                         }
  299.                                  }
  300.                                 }
  301.                                  pros_Sdata();
  302.                           }
  303.                 if(flog4==3)  //修改湿度上限
  304.                 {
  305.                          if(add_key==0)
  306.                                 {
  307.                                  delay_1ms(5);
  308.                                  if(add_key==0)
  309.                                  {
  310.                                          set_data[2]=set_data[2]+1;
  311.                                         while(add_key==0);
  312.                                         if(set_data[2]>99)
  313.                                         {
  314.                                                 set_data[2]=99;
  315.                                         }
  316.                                  }
  317.                                 }
  318.                                 if(cut_key==0)
  319.                                 {
  320.                                  delay_1ms(5);
  321.                                  if(cut_key==0)
  322.                                  {
  323.                                          set_data[2]=set_data[2]-1;
  324.                                         while(cut_key==0);
  325.                                         if(set_data[2]<=0)
  326.                                         {
  327.                                                 set_data[2]=0;
  328.                                         }
  329.                                  }
  330.                                 }
  331.                                  pros_Sdata();
  332.                           }
  333.         if(flog4==4)//修改湿度下限
  334.                 {
  335.                          if(add_key==0)
  336.                                 {
  337.                                  delay_1ms(5);
  338.                                  if(add_key==0)
  339.                                  {
  340.                                          set_data[3]=set_data[3]+1;
  341.                                         while(add_key==0);
  342.                                         if(set_data[3]>99)
  343.                                         {
  344.                                                 set_data[3]=99;
  345.                                         }
  346.                                  }
  347.                                 }
  348.                                 if(cut_key==0)
  349.                                 {
  350.                                  delay_1ms(5);
  351.                                  if(cut_key==0)
  352.                                  {
  353.                                          set_data[3]=set_data[3]-1;
  354.                                         while(cut_key==0);
  355.                                         if(set_data[3]<=0)
  356.                                         {
  357.                                                 set_data[3]=0;
  358.                                         }
  359.                                  }
  360.                                 }
  361.                                  pros_Sdata();
  362.                           }
  363. }
  364. /**********主函数******************/
  365. void main()
  366. {       
  367.         lcd_init();
  368.         pros_Sdata();
  369.         while(1)
  370.         {
  371.                         key();
  372.                         if(flog4==0)
  373.                         {
  374.                                 pro_value();
  375.                                 display2();
  376.                                 baojing();
  377.                         }
  378.                 }                         
  379. }
复制代码

所有资料51hei提供下载:
基于AT89S52的盆栽助长器的设计.zip (6.53 MB, 下载次数: 101)

2.PNG (13.16 KB, 下载次数: 105)

2.PNG

1.PNG (31.08 KB, 下载次数: 103)

1.PNG
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1038452 发表于 2022-7-5 17:35 | 只看该作者
大佬请问一下那个数模转换那一部分怎么实现的呀,就是那个土壤湿度传感器的模拟信号转换成数字信号的那个
回复

使用道具 举报

板凳
ID:1050605 发表于 2023-12-15 03:34 来自手机 | 只看该作者
好牛啊,感谢分享,帮大忙了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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