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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5411|回復: 11
打印 上一主題 下一主題
收起左側

單片機大棚溫濕度檢測與控制程序+Proteus仿真 LCD1602顯示

  [復制鏈接]
跳轉到指定樓層
樓主
ID:528775 發表于 2021-11-17 20:40 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
大棚溫濕度,檢測與控制LCD1602顯示溫度與濕度,溫度大于設定值時開風扇,小于時開電輔熱,使得氣溫保持一定限制,同時利用AD采集濕度,然后進行澆水。

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


單片機源程序如下:

  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 與單片機連接口
  11.                          //將短接片去掉開啟位選功能,否則默認IN0為輸入引腳

  12. sbit motor=P1^0;//當濕度過低時。給高電平
  13. sbit ledgreen=P1^1;//當溫度過高時,打開風扇
  14. sbit ledred=P1^2;   //溫度低時,打開輔熱
  15. unsigned char AD_DATA[2]; //保存IN0通道轉換后的數據

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


  91. }
  92. /***********************************
  93. 函數名:  AD()
  94. 功能:    啟動AD轉換將值儲存于 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;//控制命令結束
  133.         _nop_();
  134.         _nop_();
  135.         dat=0;
  136.         for(i=0;i<8;i++)
  137.         {
  138.                 dat|=ADDO;//收數據
  139.                 ADCLK=1;
  140.                 _nop_();
  141.                 _nop_();
  142.                 ADCLK=0;//形成一次時鐘脈沖
  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;//收數據
  152.                 ADCLK=1;
  153.                 _nop_();
  154.                 _nop_();
  155.                 ADCLK=0;//形成一次時鐘脈沖
  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;//拉高數據端,回到初始狀態
  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; // 百位數
  180.         ee=tvalue%1000/100;// 十位數
  181.         ff=tvalue%100/10 ;// 個位數
  182.         gg=tvalue%10; // 小數位
  183.         if(ppm>150)   //濕度大于150/256=58.59后電機停轉
  184.         {motor=0;}
  185.         if(ppm<=80) //小于31.25%電機開始啟動
  186.         {motor=1;        }
  187.         if(tvalue>400)  //溫度大于40度風扇開始啟動
  188.         {ledgreen=1;ledred=0;}
  189.         if(tvalue<=400)  //溫度小于40度風扇關閉
  190.         {ledgreen=0;ledred=1;}

  191. }


  192. /***********************************
  193. 函數名:  delayms()
  194. 功能:    延時 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. 函數名:  LcdDisplay()
  211. 功能:    用lcd顯示數組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. 函數名:  Analog_IO_Sel()
  245. 參數說明: m 的值對應ADC0809芯片上模擬輸入的IO
  246. 功能:    確定模擬輸入位選

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


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

  256. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

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

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

地板
ID:343102 發表于 2022-1-16 07:06 | 只看該作者
大棚內CO2 濃度也是一項重要指標,沒有CO2,作物就不會生長。智能大棚必須要有CO2自動調節功能。
回復

使用道具 舉報

5#
ID:1007655 發表于 2022-3-3 22:50 來自手機 | 只看該作者
w13325372056 發表于 2021-11-25 23:02
用ADC0832可以檢測濕度嗎,不是應該用濕度傳感器嗎,有大佬可以說一下嗎

ADC0832是進行是A/D轉換器,用來轉換數據的
回復

使用道具 舉報

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

題主的設計中,沒有濕度傳感器。大多數的傳感器的輸出都是電信號,通過ADC0832模數轉換和滑動變阻器來代替濕度傳感器進行仿真。
回復

使用道具 舉報

7#
ID:1008207 發表于 2022-3-4 22:19 來自手機 | 只看該作者
不明白濕度檢測的原理
回復

使用道具 舉報

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

使用道具 舉報

9#
ID:1003077 發表于 2022-3-5 10:10 | 只看該作者
單點檢測?傳感器布置在哪兒合適?
回復

使用道具 舉報

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

使用道具 舉報

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

可以的,配合模擬量的濕度傳感器,0832是模數轉換芯片。
回復

使用道具 舉報

12#
ID:1019495 發表于 2022-6-14 08:59 | 只看該作者
請問,水泵、風扇、電輔熱在硬件上應該怎么選擇呢
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久精品免费 | 91大神在线资源观看无广告 | 中文字幕一区二区三区乱码在线 | 粉嫩一区二区三区四区公司1 | 欧美三级电影在线播放 | 国产a区 | 亚洲一区视频在线 | 欧美www在线 | 亚洲五码久久 | 国产黄色一级片 | 国产精品久久久久久久久大全 | 亚洲精彩视频在线观看 | 国产欧美在线 | 精品久久久一区 | 一区二区三区久久 | 国产日韩一区二区三免费高清 | 羞羞的视频在线观看 | 久久久精品一区二区三区 | 日韩在线中文字幕 | 青青操av| 成人精品一区二区三区中文字幕 | 91短视频网址 | 欧美成人二区 | 久久久久久免费观看 | 久久国产视频网站 | 久久精品国产99国产精品亚洲 | 91精品国产91久久久久久 | 久久神马 | 91九色在线观看 | 久久天堂| 日韩视频在线免费观看 | 老外黄色一级片 | 一区二区视频 | 国内91在线 | 人人爽人人爽 | 天天影视色综合 | 色婷婷综合久久久中字幕精品久久 | 国产成人精品999在线观看 | 日韩在线小视频 | 亚洲区一 | 男人av的天堂 |