欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 5601|回復(fù): 11
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)大棚溫濕度檢測(cè)與控制程序+Proteus仿真 LCD1602顯示

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:528775 發(fā)表于 2021-11-17 20:40 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
大棚溫濕度,檢測(cè)與控制LCD1602顯示溫度與濕度,溫度大于設(shè)定值時(shí)開風(fēng)扇,小于時(shí)開電輔熱,使得氣溫保持一定限制,同時(shí)利用AD采集濕度,然后進(jìn)行澆水。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:

  1. /*=============================================================*/
  2. #include <reg52.H>                //器件配置文件
  3. #include <intrins.h>
  4. #include "lcd.h"


  5. #define u8 unsigned char  
  6. #define u16 unsigned int
  7. #define uchar unsigned char
  8. #define uint unsigned int

  9.                //一般選用500K
  10. sbit DQ=P2^7; //ds18b20 與單片機(jī)連接口
  11.                          //將短接片去掉開啟位選功能,否則默認(rèn)IN0為輸入引腳

  12. sbit motor=P1^0;//當(dāng)濕度過低時(shí)。給高電平
  13. sbit ledgreen=P1^1;//當(dāng)溫度過高時(shí),打開風(fēng)扇
  14. sbit ledred=P1^2;   //溫度低時(shí),打開輔熱
  15. unsigned char AD_DATA[2]; //保存IN0通道轉(zhuǎn)換后的數(shù)據(jù)

  16. unsigned char disbuff[7] = { 0,0,0,0,};
  17. unsigned char Disp[]="0123456789";         //使用字符串保存數(shù)字0~9所對(duì)應(yīng)的ASCLL碼
  18. //unsigned char I_Disp[]="value: ";           //初始顯示值
  19. unsigned char i,tflag;
  20. unsigned int a,voltage,circuit,electirc,aa,bb,cc,ab;
  21. unsigned char dd,ee,ff,gg;
  22. unsigned int tvalue,time,Level,High,t,ppm; // 溫度值
  23.         uint dat=0,shidu;
  24. void delay_18b20(unsigned int i) // 延時(shí) 1 微秒
  25. {
  26.         while(i--);
  27. }
  28. void ds18b20rst() //ds18b20 初始化子函數(shù)
  29. {
  30.         unsigned charx=0;
  31.         DQ = 1; // 信號(hào)線 DQ復(fù)位
  32.         delay_18b20(4); // 延時(shí)
  33.         DQ = 0; //DQ 拉低
  34.         delay_18b20(100); // 精確延時(shí)大于 480us
  35.         DQ = 1; // 拉高
  36.         delay_18b20(40);
  37. }
  38. void ds18b20wr(unsigned char wdata) /* 寫數(shù)據(jù)子函數(shù) , 無返回值,含參數(shù) */
  39. {
  40.         unsigned char i=0;
  41.         for (i=8; i>0; i--)// 要寫完一個(gè)字節(jié),故需要重復(fù) 8 次以下操作
  42.         {
  43.                 DQ = 0; // 數(shù)據(jù)線拉低
  44.                 DQ = wdata&0x01;// 按從低到高的順序發(fā)送數(shù)據(jù)(一次發(fā)送一位 )
  45.                 delay_18b20(10);
  46.                 DQ = 1; // 最后將數(shù)據(jù)線拉高
  47.                 wdata>>=1; // 將 wdata 右移 1 位
  48.         }
  49. }
  50. unsigned char ds18b20rd() // 讀數(shù)據(jù)子函數(shù) , 是有返回值 dat
  51. {
  52.         unsigned char i=0;
  53.         unsigned char dat = 0;
  54.         for (i=8;i>0;i--)// 要讀完一個(gè)字節(jié),故需要重復(fù) 8 次以下操作
  55.         {
  56.                 DQ = 0; // 給脈沖信號(hào)
  57.                 dat>>=1;
  58.                 DQ = 1; // 給脈沖信號(hào)
  59.                 if(DQ)
  60.                         dat|=0x80;
  61.                         delay_18b20(10);
  62.         }
  63.         return(dat); // 返回 dat
  64. }
  65. read_temp() // 讀取溫度值并轉(zhuǎn)換的子函數(shù),有返回值溫度值 tvalue
  66. {
  67.         unsigned char a,b;
  68.         ds18b20rst(); // 調(diào)用 ds18b20 初始化子函數(shù)
  69.         ds18b20wr(0xcc);// 調(diào)用寫數(shù)據(jù)子函數(shù),向 ds18b20 寫命令 0xcc
  70.         //ccH 表示跳過 ROM讀序列號(hào),適用于單機(jī)工作,直接向 18b20 發(fā)送溫度變換命令
  71.         ds18b20wr(0x44);// 調(diào)用寫數(shù)據(jù)子函數(shù),向 ds18b20 寫命令 0x44
  72.         //44H 表示啟動(dòng) ds18b20 溫度轉(zhuǎn)換 , 結(jié)果自行存入 9 字節(jié)的 RAM中
  73.         ds18b20rst(); // 調(diào)用 ds18b20 初始化子函數(shù)
  74.         ds18b20wr(0xcc);// 同上
  75.         ds18b20wr(0xbe);// 調(diào)用寫數(shù)據(jù)子函數(shù),向 ds18b20 寫命令 0xbe
  76.         //beH 表示讀取 RAM中 9 字節(jié)的溫度數(shù)據(jù)
  77.         a=ds18b20rd(); // 調(diào)用讀數(shù)據(jù)子函數(shù),并將所得數(shù)據(jù)給 a
  78.         b=ds18b20rd(); //
  79.         tvalue=b; // 把 b 的值給 tvalue
  80.         tvalue<<=8; //tvalue 左移 8 位
  81.         tvalue=tvalue|a;//tvalue 與 a 進(jìn)行按位或
  82.         if(tvalue<0x0fff)//
  83.         tflag=0; // 前五位為 0 時(shí),讀取的溫度為正,標(biāo)志位為 0,此時(shí)只要
  84.         else // 前五位為 1 時(shí),讀取的溫度為負(fù),標(biāo)志位為 1,此時(shí)需要
  85.         {                 // 將測(cè)得數(shù)值取反后再加 1,再乘以 0.0625 即可得到實(shí)際溫度
  86.         tvalue=~tvalue+1;
  87.         tflag=1; // 此時(shí)表示負(fù)溫度
  88.         }
  89.         tvalue=tvalue*(0.625);// 溫度值擴(kuò)大 10 倍,精確到 1 位小數(shù)
  90.         return(tvalue); // 返回溫度值


  91. }
  92. /***********************************
  93. 函數(shù)名:  AD()
  94. 功能:    啟動(dòng)AD轉(zhuǎn)換將值儲(chǔ)存于 AD_DATA[0]

  95. ***********************************/
  96. sbit ADCS         =P3^5;
  97. sbit ADCLK  =P3^2;
  98. sbit ADDI         =P3^3;
  99. sbit ADDO         =P3^4;
  100. unsigned int Adc0832(unsigned char channel)
  101. {
  102.         uchar i=0;
  103.         uchar j;

  104.         uchar ndat=0;
  105.         uchar  Vot=0;

  106.         if(channel==0)channel=2;
  107.         if(channel==1)channel=3;
  108.         ADDI=1;
  109.         _nop_();
  110.         _nop_();
  111.         ADCS=0;//拉低CS端
  112.         _nop_();
  113.         _nop_();
  114.         ADCLK=1;//拉高CLK端
  115.         _nop_();
  116.         _nop_();
  117.         ADCLK=0;//拉低CLK端,形成下降沿1
  118.         _nop_();
  119.         _nop_();
  120.         ADCLK=1;//拉高CLK端
  121.         ADDI=channel&0x1;
  122.         _nop_();
  123.         _nop_();
  124.         ADCLK=0;//拉低CLK端,形成下降沿2
  125.         _nop_();
  126.         _nop_();
  127.         ADCLK=1;//拉高CLK端
  128.         ADDI=(channel>>1)&0x1;
  129.         _nop_();
  130.         _nop_();
  131.         ADCLK=0;//拉低CLK端,形成下降沿3
  132.         ADDI=1;//控制命令結(jié)束
  133.         _nop_();
  134.         _nop_();
  135.         dat=0;
  136.         for(i=0;i<8;i++)
  137.         {
  138.                 dat|=ADDO;//收數(shù)據(jù)
  139.                 ADCLK=1;
  140.                 _nop_();
  141.                 _nop_();
  142.                 ADCLK=0;//形成一次時(shí)鐘脈沖
  143.                 _nop_();
  144.                 _nop_();
  145.                 dat<<=1;
  146.                 if(i==7)dat|=ADDO;
  147.         }
  148.         for(i=0;i<8;i++)
  149.         {
  150.                 j=0;
  151.                 j=j|ADDO;//收數(shù)據(jù)
  152.                 ADCLK=1;
  153.                 _nop_();
  154.                 _nop_();
  155.                 ADCLK=0;//形成一次時(shí)鐘脈沖
  156.                 _nop_();
  157.                 _nop_();
  158.                 j=j<<7;
  159.                 ndat=ndat|j;
  160.                 if(i<7)ndat>>=1;
  161.         }
  162.         ADCS=1;//拉低CS端
  163.         ADCLK=0;//拉低CLK端
  164.         ADDO=1;//拉高數(shù)據(jù)端,回到初始狀態(tài)
  165.         dat<<=8;
  166.         dat|=ndat;

  167.         return(dat);            //return ad data
  168. }
  169. void Conut(void)
  170. {

  171.                  circuit=dat/256;
  172.        

  173.         ppm=circuit;
  174.         aa=ppm/1000;
  175.          bb=ppm%1000/100;
  176.         cc=ppm%100/10;
  177.          ab=ppm%10;
  178.        
  179.         dd=tvalue/1000; // 百位數(shù)
  180.         ee=tvalue%1000/100;// 十位數(shù)
  181.         ff=tvalue%100/10 ;// 個(gè)位數(shù)
  182.         gg=tvalue%10; // 小數(shù)位
  183.         if(ppm>150)   //濕度大于150/256=58.59后電機(jī)停轉(zhuǎn)
  184.         {motor=0;}
  185.         if(ppm<=80) //小于31.25%電機(jī)開始啟動(dòng)
  186.         {motor=1;        }
  187.         if(tvalue>400)  //溫度大于40度風(fēng)扇開始啟動(dòng)
  188.         {ledgreen=1;ledred=0;}
  189.         if(tvalue<=400)  //溫度小于40度風(fēng)扇關(guān)閉
  190.         {ledgreen=0;ledred=1;}

  191. }


  192. /***********************************
  193. 函數(shù)名:  delayms()
  194. 功能:    延時(shí) ms 毫秒

  195. ***********************************/
  196. void delayms(unsigned int ms)
  197. {
  198.         unsigned char j;
  199.         i=100;
  200.         for(;ms;ms--)
  201.         {
  202.                 while(--i)
  203.                 {
  204.                         j=10;
  205.                         while(--j);
  206.                 }
  207.         }
  208. }
  209. /***********************************
  210. 函數(shù)名:  LcdDisplay()
  211. 功能:    用lcd顯示數(shù)組disbuff[]中的值

  212. ***********************************/


  213. void LcdDisplay(void)
  214. {
  215.   LCD1602_write_com(0x80+1+0x40);
  216.         LCD1602_write_word("c=");
  217.         LCD1602_write_com(0x80+3+0x40);          
  218.         LCD1602_write_data(0x30+aa);
  219.         LCD1602_write_com(0x80+4+0x40);
  220.         LCD1602_write_data(0x30+bb);
  221.   LCD1602_write_com(0x80+5+0x40);          
  222.         LCD1602_write_data(0x30+cc);               
  223.         LCD1602_write_com(0x80+6+0x40);          
  224.         LCD1602_write_data(0x30+ab);       
  225.         LCD1602_write_com(0x80+7+0x40);
  226.         LCD1602_write_word("humid");
  227.        
  228.         LCD1602_write_com(0x80+1);
  229.         LCD1602_write_word("tem=");
  230.         LCD1602_write_com(0x80+5);          
  231.         LCD1602_write_data(0x30+dd);
  232.         LCD1602_write_com(0x80+8);
  233.         LCD1602_write_word(".");
  234.   LCD1602_write_com(0x80+6);          
  235.         LCD1602_write_data(0x30+ee);               
  236.         LCD1602_write_com(0x80+7);          
  237.         LCD1602_write_data(0x30+ff);       
  238.         LCD1602_write_com(0x80+9);          
  239.         LCD1602_write_data(0x30+gg);       
  240.        
  241.        
  242. }
  243. /***********************************
  244. 函數(shù)名:  Analog_IO_Sel()
  245. 參數(shù)說明: m 的值對(duì)應(yīng)ADC0809芯片上模擬輸入的IO
  246. 功能:    確定模擬輸入位選

  247. ***********************************/


  248. //void init()
  249. //{if(a==0)
  250. //{
  251. //          EA=1; //開總中斷
  252. //    TMOD=0x02; //設(shè)定定時(shí)器 T0工作方式
  253. //    TH0=21; //利用T0中斷產(chǎn)生CLK信號(hào)
  254. //    TL0=21;  
  255. ……………………

  256. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei附件下載:
大棚溫濕度控制.rar (198.02 KB, 下載次數(shù): 327)

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏15 分享淘帖 頂4 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:968456 發(fā)表于 2021-11-19 21:04 | 只看該作者
大佬那個(gè)溫度怎么改才能讓他一下加減沒那么多
回復(fù)

使用道具 舉報(bào)

板凳
ID:982166 發(fā)表于 2021-11-25 23:02 | 只看該作者
用ADC0832可以檢測(cè)濕度嗎,不是應(yīng)該用濕度傳感器嗎,有大佬可以說一下嗎
回復(fù)

使用道具 舉報(bào)

無效樓層,該帖已經(jīng)被刪除
5#
ID:343102 發(fā)表于 2022-1-16 07:06 | 只看該作者
大棚內(nèi)CO2 濃度也是一項(xiàng)重要指標(biāo),沒有CO2,作物就不會(huì)生長。智能大棚必須要有CO2自動(dòng)調(diào)節(jié)功能。
回復(fù)

使用道具 舉報(bào)

6#
無效樓層,該帖已經(jīng)被刪除
7#
ID:1007655 發(fā)表于 2022-3-3 22:50 來自觸屏版 | 只看該作者
w13325372056 發(fā)表于 2021-11-25 23:02
用ADC0832可以檢測(cè)濕度嗎,不是應(yīng)該用濕度傳感器嗎,有大佬可以說一下嗎

ADC0832是進(jìn)行是A/D轉(zhuǎn)換器,用來轉(zhuǎn)換數(shù)據(jù)的
回復(fù)

使用道具 舉報(bào)

8#
ID:456792 發(fā)表于 2022-3-4 10:55 | 只看該作者
w13325372056 發(fā)表于 2021-11-25 23:02
用ADC0832可以檢測(cè)濕度嗎,不是應(yīng)該用濕度傳感器嗎,有大佬可以說一下嗎

題主的設(shè)計(jì)中,沒有濕度傳感器。大多數(shù)的傳感器的輸出都是電信號(hào),通過ADC0832模數(shù)轉(zhuǎn)換和滑動(dòng)變阻器來代替濕度傳感器進(jìn)行仿真。
回復(fù)

使用道具 舉報(bào)

9#
ID:1008207 發(fā)表于 2022-3-4 22:19 來自觸屏版 | 只看該作者
不明白濕度檢測(cè)的原理
回復(fù)

使用道具 舉報(bào)

10#
ID:297903 發(fā)表于 2022-3-5 08:34 | 只看該作者
很好用的,參考下,謝謝!!
回復(fù)

使用道具 舉報(bào)

11#
ID:1003077 發(fā)表于 2022-3-5 10:10 | 只看該作者
單點(diǎn)檢測(cè)?傳感器布置在哪兒合適?
回復(fù)

使用道具 舉報(bào)

12#
ID:1003077 發(fā)表于 2022-3-5 10:11 | 只看該作者
為什么不用個(gè)DHT11,或者SHT11什么的,一次吧溫濕度都給解決了
回復(fù)

使用道具 舉報(bào)

13#
ID:397211 發(fā)表于 2022-3-5 11:55 | 只看該作者
w13325372056 發(fā)表于 2021-11-25 23:02
用ADC0832可以檢測(cè)濕度嗎,不是應(yīng)該用濕度傳感器嗎,有大佬可以說一下嗎

可以的,配合模擬量的濕度傳感器,0832是模數(shù)轉(zhuǎn)換芯片。
回復(fù)

使用道具 舉報(bào)

14#
無效樓層,該帖已經(jīng)被刪除
15#
ID:1019495 發(fā)表于 2022-6-14 08:59 | 只看該作者
請(qǐng)問,水泵、風(fēng)扇、電輔熱在硬件上應(yīng)該怎么選擇呢
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

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

快速回復(fù) 返回頂部 返回列表