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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

DHT11按鍵調(diào)節(jié)溫濕度+YL69土壤濕度報(bào)警

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:222946 發(fā)表于 2017-7-28 10:39 | 只看該作者 回帖獎(jiǎng)勵(lì) |正序?yàn)g覽 |閱讀模式
DHT11按鍵控制+土壤濕度報(bào)警

單片機(jī)源程序如下:
  1. #include<reg52.h>
  2. #include "intrins.h"
  3. typedef unsigned char uint8;
  4. typedef unsigned int uint16;
  5. sbit rs=P2^6;     // 數(shù)據(jù)命令選擇
  6. sbit rw=P2^5;     //讀寫選擇
  7. sbit e=P2^7;      //使能

  8. sbit k1=P3^3; //模式
  9. sbit k2=P2^1; //加
  10. sbit k3=P2^2; //減
  11. sbit bee=P1^5;//蜂鳴器

  12. sbit DO=P3^1;
  13. sbit DHT11_DQ_OUT=P3^2;
  14. sbit led1=P1^0;
  15. sbit led2=P1^1;
  16. sbit led3=P1^2;

  17. sbit dq=P2^0;

  18. uint8 date;
  19. uint8 mode=0,xian;
  20. char temph=28,templ=20;
  21. char humih=80,humil=20;
  22. uint8 temp,humi;
  23. uint8 flag;      //設(shè)定報(bào)警標(biāo)志
  24. uint8 code num[10]="0123456789";

  25. uint8 code str1[]="Temp:";  //溫度
  26. uint8 code str2[]="Humi:";  //濕度
  27. uint8 code str3[]="Error";  
  28. uint8 code str4[]="Success    ";
  29. uint8 code str5[]="%RH";
  30. uint8 code str6[]="TempH:";      //設(shè)定溫度上限顯示
  31. uint8 code str7[]="TempL:";      //設(shè)定溫度下限顯示
  32. uint8 code str8[]="HumiH:";       //設(shè)定濕度上限顯示
  33. uint8 code str9[]="HumiL:";       //設(shè)定濕度下限顯示


  34. void delay(uint16 i)
  35. {
  36.     while(i--);
  37. }

  38. void delay_ms(uint16 i)
  39. {
  40.     while(i--)
  41.         delay(90);
  42. }
  43. void delay1(uint16 z)
  44. {                                                                                               
  45.     uint16 i,j;
  46.     for(i=z;i>0;i--)
  47.         for(j=110;j>0;j--);
  48. }

  49. void wrc(uint8 c)     //寫命令
  50. {
  51.     delay(1000);
  52.     rs=0;
  53.     rw=0;
  54.     e=0;
  55.     P0=c;
  56.     e=1;
  57.     delay(10);
  58.     e=0;
  59. }
  60. void wrd(uint8 dat)      //寫數(shù)據(jù)
  61. {
  62.     delay(1000);
  63.     rs=1;
  64.     rw=0;
  65.     e=0;
  66.     P0=dat;
  67.     e=1;
  68.     delay(10);
  69.     e=0;
  70.     rs=0;
  71. }
  72. void lcd_init()       // LCD1602初始化
  73. {
  74.     delay(1000);
  75.     wrc(0x38);
  76.     wrc(0x38);     //功能設(shè)置命令,選擇8位總線,雙行顯示  5*7點(diǎn)陣字符
  77.     wrc(0x38);
  78.     wrc(0x06);    //光標(biāo)和顯示模式設(shè)置  光標(biāo)右移  整屏不移動(dòng)
  79.     wrc(0x0c);    //顯示開關(guān)控制  開顯示  無光標(biāo) 光標(biāo)不閃爍
  80.     wrc(0x01);    //清零指令  固定的
  81. }
  82. //復(fù)位DHT11
  83. void DHT11_Rst()      
  84. {                 
  85.     DHT11_DQ_OUT=0;     //拉低DQ
  86.     delay_ms(20);        //拉低至少18ms
  87.     DHT11_DQ_OUT=1;     //DQ=1
  88.     delay(3);         //主機(jī)拉高20~40us
  89. }

  90. //等待DHT11的回應(yīng)
  91. //返回1:未檢測到DHT11的存在
  92. //返回0:存在
  93. uint8 DHT11_Check()        
  94. {   
  95.     uint8 retry=0;     
  96.     while (DHT11_DQ_OUT&&retry<100)//DHT11會(huì)拉低40~50us
  97.     {
  98.         retry++;
  99.         _nop_();
  100.     };     
  101.     if(retry>=100)return 1;
  102.     else retry=0;
  103.     while (!DHT11_DQ_OUT&&retry<100)//DHT11拉低后會(huì)再次拉高40~50us
  104.     {
  105.         retry++;
  106.         _nop_();
  107.     };
  108.     if(retry>=100)return 1;        
  109.     return 0;
  110. }


  111. //DHT11初始化
  112. //返回0:初始化成功,1:失敗
  113. uint8 DHT11_Init()
  114. {
  115.     DHT11_Rst();      
  116.     return DHT11_Check();   
  117. }


  118. //從DHT11讀取一個(gè)位
  119. //返回值:1/0
  120. uint8 DHT11_Read_Bit(void)              
  121. {
  122.      uint8 retry=0;
  123.     while(DHT11_DQ_OUT&&retry<100)//等待變?yōu)榈碗娖?12-14us 開始
  124.     {
  125.         retry++;
  126.         _nop_();
  127.     }
  128.     retry=0;
  129.     while((!DHT11_DQ_OUT)&&retry<100)//等待變高電平     26-28us表示0,116-118us表示1
  130.     {
  131.         retry++;
  132.         _nop_();
  133.     }
  134.     delay(1);//等待40us
  135.     if(DHT11_DQ_OUT)return 1;
  136.     else return 0;           
  137. }

  138. //從DHT11讀取一個(gè)字節(jié)
  139. //返回值:讀到的數(shù)據(jù)
  140. uint8 DHT11_Read_Byte(void)   
  141. {        
  142.     uint8 i,dat=0;
  143.     for (i=0;i<8;i++)
  144.     {
  145.            dat<<=1;
  146.         dat|=DHT11_Read_Bit();
  147.     }                           
  148.     return dat;
  149. }

  150. //從DHT11讀取一次數(shù)據(jù)
  151. //temp:溫度值(范圍:0~50°)
  152. //humi:濕度值(范圍:20%~90%)
  153. //返回值:0,正常;1,讀取失敗
  154. uint8 DHT11_Read_Data(uint8 *temp,uint8 *humi)   
  155. {        
  156.      uint8 buf[5];
  157.     uint8 i;
  158.     DHT11_Rst();
  159.     if(DHT11_Check()==0)
  160.     {
  161.         for(i=0;i<5;i++)//讀取40位數(shù)據(jù)
  162.         {
  163.             buf[i]=DHT11_Read_Byte();
  164.         }
  165.         if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
  166.         {
  167.             *humi=buf[0];
  168.             *temp=buf[2];
  169.         }
  170.         
  171.     }else return 1;
  172.     return 0;        
  173. }


  174. void key_pros()  //按鍵處理函數(shù)
  175. {
  176.     if(k1==0)
  177.     {
  178.         delay(1000);
  179.         if(k1==0)
  180.         {
  181.             mode++;
  182.             if(mode==5)mode=0;
  183.             wrc(0x01);
  184.         }
  185.         while(!k1);
  186.     }
  187.     if(mode==1)          //對(duì)溫度上限設(shè)定
  188.     {
  189.         if(k2==0)          //加
  190.         {
  191.             delay(1000);
  192.             if(k2==0)
  193.             {
  194.                 temph++;
  195.                 if(temph>=80)temph=80;
  196.             }
  197.             while(!k2);
  198.         }
  199.         if(k3==0)       //減
  200.         {
  201.             delay(1000);
  202.             if(k3==0)
  203.             {
  204.                 temph--;
  205.                 if(temph<=0)temph=0;
  206.             }
  207.             while(!k3);
  208.         }
  209.     }
  210.     if(mode==2)          //對(duì)溫度下限設(shè)定
  211.     {
  212.         if(k2==0)          //加
  213.         {
  214.             delay(1000);
  215.             if(k2==0)
  216.             {
  217.                 templ++;
  218.                 if(templ>=80)templ=80;
  219.             }
  220.             while(!k2);
  221.         }
  222.         if(k3==0)       //減
  223.         {
  224.             delay(1000);
  225.             if(k3==0)
  226.             {
  227.                 templ--;
  228.                 if(templ<=0)templ=0;
  229.             }
  230.             while(!k3);
  231.         }
  232.     }
  233.     if(mode==3)          //對(duì)濕度上限設(shè)定
  234.     {
  235.         if(k2==0)          //加
  236.         {
  237.             delay(1000);
  238.             if(k2==0)
  239.             {
  240.                 humih++;
  241.                 if(humih>=80)humih=80;
  242.             }
  243.             while(!k2);
  244.         }
  245.         if(k3==0)       //減
  246.         {
  247.             delay(1000);
  248.             if(k3==0)
  249.             {
  250.                 humih--;
  251.                 if(humih<=0)humih=0;
  252.             }
  253.             while(!k3);
  254.         }
  255.     }
  256.     if(mode==4)          //對(duì)濕度下限設(shè)定
  257.     {
  258.         if(k2==0)          //加
  259.         {
  260.             delay(1000);
  261.             if(k2==0)
  262.             {
  263.                 humil++;
  264.                 if(humil>=80)humil=80;
  265.             }
  266.             while(!k2);
  267.         }
  268.         if(k3==0)       //減
  269.         {
  270.             delay(1000);
  271.             if(k3==0)
  272.             {
  273.                 humil--;
  274.                 if(humil<=0)humil=0;
  275.             }
  276.             while(!k3);
  277.         }
  278.     }
  279. }

  280. void lcd_init_display()       //LCD初始化顯示
  281. {
  282.     uint8 i;
  283.     for(i=0;i<5;i++)
  284.     {
  285.         wrc(0x80+i);
  286.         wrd(str1[i]);   
  287.     }

  288.     for(i=0;i<5;i++)
  289.     {
  290.         wrc(0xc0+i);
  291.         wrd(str2[i]);   
  292.     }
  293. }

  294. void data_pros()    //數(shù)據(jù)處理函數(shù)
  295. {
  296.     uint8 i;         
  297.     uint8 temp_buf[2],humi_buf[2];
  298.     uint8 temphbuf[2],templbuf[2],humihbuf[2],humilbuf[2];


  299.     DHT11_Read_Data(&temp,&humi);
  300.     temp_buf[0]=temp/10+0x30;   
  301.     temp_buf[1]=temp%10+0x30;

  302.     humi_buf[0]=humi/10+0x30;   
  303.     humi_buf[1]=humi%10+0x30;
  304.    


  305.     temphbuf[0]=temph/10+0x30;
  306.     temphbuf[1]=temph%10+0x30;
  307.     templbuf[0]=templ/10+0x30;
  308.     templbuf[1]=templ%10+0x30;

  309.     humihbuf[0]=humih/10+0x30;
  310.     humihbuf[1]=humih%10+0x30;
  311.     humilbuf[0]=humil/10+0x30;
  312.     humilbuf[1]=humil%10+0x30;

  313.     if(mode==0)
  314.     {
  315.         lcd_init_display();
  316.         wrc(0x85);
  317.         wrd(num[temp/10]);
  318.         wrd(num[temp%10]);
  319.         wrd(0xdf);
  320.         wrd('C');
  321.    
  322.         for(i=0;i<2;i++)
  323.         {
  324.             wrc(0Xc5+i);
  325.             wrd(humi_buf[i]);         
  326.         }   
  327.         for(i=0;i<3;i++)
  328.         {
  329.             wrc(0Xc7+i);
  330.             wrd(str5[i]);         
  331.         }   
  332.     }
  333.     if(mode==1)              //溫度上限顯示
  334.     {
  335.         wrc(0x80);
  336.         for(i=0;i<6;i++)
  337.         {
  338.             wrd(str6[i]);         
  339.         }
  340.         wrd(temphbuf[0]);
  341.         wrd(temphbuf[1]);            
  342.     }
  343.     if(mode==2)              //溫度下限顯示
  344.     {
  345.         wrc(0x80);
  346.         for(i=0;i<6;i++)
  347.         {
  348.             wrd(str7[i]);         
  349.         }
  350.         wrd(templbuf[0]);
  351.         wrd(templbuf[1]);            
  352.     }
  353.     if(mode==3)              //濕度上限顯示
  354.     {
  355.         wrc(0x80);
  356.         for(i=0;i<6;i++)
  357.         {
  358.             wrd(str8[i]);         
  359.         }
  360.         wrd(humihbuf[0]);
  361.         wrd(humihbuf[1]);            
  362.     }
  363.     if(mode==4)              //濕度下限顯示
  364.     {
  365.         wrc(0x80);
  366.         for(i=0;i<6;i++)
  367.         {
  368.             wrd(str9[i]);         
  369.         }
  370.         wrd(humilbuf[0]);
  371.         wrd(humilbuf[1]);            
  372.     }
  373. }

  374. void baojinpros()    //報(bào)警處理
  375. {
  376.     if(temp>=temph||humi>=humih)     //檢測溫度或者濕度高于設(shè)定上限值 降溫濕
  377.     {
  378.         led1=1;        //降溫濕指示燈
  379.         led2=0;
  380.     }
  381.     if(temp<=templ||humi<=humil)    //檢測溫度或者濕度低于設(shè)定下限值  升溫濕
  382.     {
  383.         led1=0;
  384.         led2=1;  //升高溫濕指示燈
  385.     }
  386.     if(DO==0)
  387.     {
  388.         led3=1;
  389.     }
  390.     if(DO==1)
  391.     {
  392.         led3=0;
  393.     }

  394.     if((temp>templ&&temp<temph)&&(humi>humil&&humi<humih)&&DO==1)
  395.     {
  396.         led1=0;
  397.         led2=0;
  398.         led3=0;
  399.     }
  400. }

  401. void Initial_com(void)
  402. {
  403. EA=1;        //開總中斷
  404. ES=1;        //允許串口中斷
  405. ET1=1;        //允許定時(shí)器T1的中斷
  406. TMOD=0x20;   //定時(shí)器T1,在方式2中斷產(chǎn)生波特率
  407. PCON=0x00;   //SMOD=0
  408. SCON=0x50;   // 方式1 由定時(shí)器控制
  409. TH1=0xfd;    //波特率設(shè)置為9600
  410. TL1=0xfd;
  411. TR1=1;       //開定時(shí)器T1運(yùn)行控制位
  412. }

  413. void main()
  414. {
  415.     uint8 i=0;
  416.     led1=0;
  417.     led2=0;
  418.     led3=0;
  419.     Initial_com();
  420.     lcd_init();
  421.     if(DO==0)
  422.     {
  423.         delay1(1);      //消抖動(dòng)
  424.         if(DO==0)      //確認(rèn)觸發(fā)
  425.         {
  426.                  SBUF=0X01;
  427.                  delay1(200);
  428.         }   
  429.          if(RI)
  430.          {
  431.             date=SBUF;    //單片機(jī)接受
  432.             SBUF=date;    //單片機(jī)發(fā)送
  433.             RI=0;
  434.           }
  435.     }
  436.     while(DHT11_Init())    //檢測DHT11是否純在
  437.     {
  438.         for(i=0;i<5;i++)
  439.         {
  440.             wrc(0x80+i);
  441.             wrd(str3[i]);   
  442.         }            
  443.     }
  444.     wrc(0x01);
  445.     lcd_init_display();       //LCD初始化顯示
  446.     i=0;         
  447.     while(1)
  448.     {   
  449.         i++;
  450.         key_pros();
  451.         baojinpros();    //報(bào)警處理
  452.         if(i==15)
  453.         {
  454.             i=0;
  455.             data_pros();       //讀取一次DHT11數(shù)據(jù)最少要大于100ms
  456.         }
  457.         delay(1000);
  458.         
  459.     }   
  460. }

復(fù)制代碼



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

使用道具 舉報(bào)

9#
ID:1019895 發(fā)表于 2022-4-20 10:21 | 只看該作者
請教一下如何畫仿真圖
回復(fù)

使用道具 舉報(bào)

8#
ID:982245 發(fā)表于 2021-11-20 13:57 | 只看該作者
有仿真嘛??
回復(fù)

使用道具 舉報(bào)

7#
ID:718951 發(fā)表于 2020-3-30 17:56 | 只看該作者
請問有與51單片機(jī)的連接原理圖嗎
回復(fù)

使用道具 舉報(bào)

6#
ID:429320 發(fā)表于 2018-12-19 10:34 | 只看該作者
有沒有用在STM32F103ZET6上的
回復(fù)

使用道具 舉報(bào)

5#
無效樓層,該帖已經(jīng)被刪除
地板
ID:342081 發(fā)表于 2018-6-12 15:19 | 只看該作者
有仿真圖嗎
回復(fù)

使用道具 舉報(bào)

板凳
ID:345957 發(fā)表于 2018-6-6 10:11 | 只看該作者
學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

無效樓層,該帖已經(jīng)被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日本不卡免费新一二三区 | 玖玖在线精品 | 在线观看中文字幕 | 国产精品揄拍一区二区久久国内亚洲精 | 国产精品波多野结衣 | 亚洲精品一区在线 | 日韩在线观看网站 | 免费看大片bbbb欧美 | 99精品电影 | 日日干夜夜草 | 欧美精品久久久久 | 成人av网站在线观看 | 中文字幕免费在线 | 国产精品久久国产精品 | av黄色免费在线观看 | 国产乱精品一区二区三区 | 欧美日韩亚洲视频 | 一区二区av | 欧美aaaaaaaaaa| 精品国产欧美 | 日韩av电影院 | 久久精品亚洲精品国产欧美 | 成人在线看片 | 久久久天堂| 中文在线www | 老司机狠狠爱 | 性网站免费 | 久久久综合色 | 亚洲精品九九 | 成人在线精品视频 | cao在线| 精品国产乱码久久久久久图片 | 久久国产精品偷 | 亚洲高清在线观看 | 欧美日韩亚洲二区 | 国产高清视频 | 九九久久在线看 | 久久伦理电影 | 日韩一区二区在线视频 | 久国产精品 | 国产高清精品在线 |