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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3242|回復: 2
收起左側

AT89S52單片機盆栽助長器的PCB原理圖+源程序設計

[復制鏈接]
ID:375780 發(fā)表于 2020-6-26 18:18 | 顯示全部樓層 |閱讀模式
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
51hei.png 51hei.png 51hei.png

單片機源程序如下:
  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;                  //溫濕度傳感器數(shù)據(jù)線
  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)//延時函數(shù),有參函數(shù)
  33. {
  34.         uint x,y;
  35.         for(x=xms;x>0;x--)
  36.          for(y=124;y>0;y--);
  37. }
  38. //****液晶寫入指令函數(shù)****//
  39. void write_1602com(uchar com)
  40. {                                               
  41.         rs=0;//數(shù)據(jù)/指令選擇置為指令
  42.         P0=com;//送入數(shù)據(jù)
  43.         delay_1ms(1);
  44.         en=1;//拉高使能端,為制造有效的下降沿做準備
  45.         delay_1ms(1);
  46.         en=0;//en由高變低,產生下降沿,液晶執(zhí)行命令
  47. }
  48. //***液晶寫入數(shù)據(jù)函數(shù)****//
  49. void write_1602dat(uchar dat)
  50. {
  51.         rs=1;//數(shù)據(jù)/指令選擇置為數(shù)據(jù)
  52.         P0=dat;//送入數(shù)據(jù)
  53.         delay_1ms(1);
  54.         en=1; //en置高電平,為制造下降沿做準備
  55.         delay_1ms(1);
  56.         en=0; //en由高變低,產生下降沿,液晶執(zhí)行命令
  57. }
  58. //***液晶初始化函數(shù)****//
  59. void lcd_init()
  60. {
  61.         write_1602com(0x38);//設置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數(shù)據(jù)
  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 讀一個字節(jié)函數(shù)******************/
  77. uchar read_byte()
  78. {
  79.         uchar value,i;
  80.         for(i=0;i<8;i++)                //一個字節(jié)有八位 所以用for循環(huán)
  81.         {
  82.                 value=value<<1;                //從字節(jié)高位開始讀  需要移位
  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)                //等待這一位數(shù)據(jù)結束 因為70us的高電平表示“1”
  91.                         {                                        //
  92.                                 DHT=1;
  93.                         }
  94.                 }
  95.         }
  96.         return value;                //返回讀到的這一字節(jié)數(shù)據(jù)
  97. }
  98. /*****************溫濕度傳感器DHT11 讀數(shù)據(jù)函數(shù)******************/
  99. /**一個完整的數(shù)據(jù)一共是五個字節(jié)******************/
  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();//將讀到的五個字節(jié)數(shù)據(jù)放到數(shù)組read_data【5】中
  118.                 }
  119.         }       
  120. }
  121. /**********處理讀到的溫濕度數(shù)據(jù)******************/
  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)                //檢測讀到的數(shù)據(jù)是否正確                         
  127.                 {
  128.                         shiZ=read_data[0];           //濕度整數(shù)部分
  129.                         wenZ=read_data[2];         //         溫度整數(shù)部分
  130.                 }
  131.         tate[0]=wenZ/10;           //將溫濕度的整數(shù)部分的十位和個位分開
  132.         tate[1]=wenZ%10;        //分開后的數(shù)據(jù)存放在數(shù)組tate【4】中 以供lcd顯示       
  133.         tate[2]=shiZ/10;
  134.         tate[3]=shiZ%10;
  135. }
  136. /********** 報警處理函數(shù)******************/
  137. void baojing()
  138. {
  139.           if((set_data[2]<shiZ)||(set_data[3]>shiZ)) //判斷是否有報警 如果有就進入函數(shù) 然后再判斷具體是哪個值報警
  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                   //沒有報警情況的出現(xiàn)
  176.           {
  177.                    speak=1;                                 //蜂鳴器不響
  178.                         JK1=1;
  179.                         JK2=1;                                //
  180.                         JK3=1;
  181.                         JK4=1;
  182.           }
  183.           
  184. }
  185. /**********顯示函數(shù)******************/

  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. /**********主函數(shù)******************/
  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, 下載次數(shù): 106)
2.PNG
1.PNG
回復

使用道具 舉報

ID:1038452 發(fā)表于 2022-7-5 17:35 | 顯示全部樓層
大佬請問一下那個數(shù)模轉換那一部分怎么實現(xiàn)的呀,就是那個土壤濕度傳感器的模擬信號轉換成數(shù)字信號的那個
回復

使用道具 舉報

ID:1050605 發(fā)表于 2023-12-15 03:34 來自手機 | 顯示全部樓層
好牛啊,感謝分享,幫大忙了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久www免费视频 | 亚洲性在线 | 久久午夜国产精品www忘忧草 | 免费成人午夜 | 日韩一区二区福利 | 午夜一区二区三区在线观看 | 午夜电影日韩 | 狠狠干网站 | 欧美日韩在线观看一区 | www.日本在线观看 | 岛国在线免费观看 | 99爱在线免费观看 | 精产国产伦理一二三区 | 国产精品视频一区二区三区, | 亚洲免费在线观看视频 | 色综合久久久 | 欧美精品在线一区 | 黄色a视频 | 日韩欧美在线视频 | 一区二区视频免费观看 | 精品亚洲一区二区 | 欧美日韩国产在线观看 | 欧美日韩精品久久久免费观看 | 一区二区激情 | 一本在线 | 99精品欧美 | jav成人av免费播放 | 在线日韩欧美 | 亚洲电影第1页 | 国产精品欧美日韩 | 亚洲国产一区在线 | 中文字幕在线视频免费视频 | 视频在线h | 本道综合精品 | 国产成人99久久亚洲综合精品 | 日韩有码一区 | 人人看人人射 | 九九久久精品视频 | 超碰人人人 | 欧美日韩综合一区 | 色婷婷综合网 |