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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC單片機溫濕度自動檢測系統

[復制鏈接]
跳轉到指定樓層
樓主
ID:346276 發表于 2018-6-6 16:54 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

單片機源程序如下:
  1. //程序頭函數
  2. #include <reg52.h>
  3. //顯示函數
  4. #include         "intrins.h"                                                                                          

  5. //宏定義
  6. #define uint unsigned int
  7. #define uchar unsigned char


  8. //宏定義
  9. #define uint unsigned int
  10. #define uchar unsigned char
  11. //管腳聲明
  12. sbit LED_wendu                = P2^5;                //溫度上限值操作端口,報警燈吸合繼電器;
  13. sbit LED_wendu_L        = P2^4;                //溫度下限報警燈
  14. sbit LED_humi                        = P2^2;                //濕度上限報警燈
  15. sbit LED_humi_L                = P2^0;                //濕度下限報警燈
  16. sbit baojing                        = P3^2;                //蜂鳴器接口
  17. //按鍵
  18. sbit Key1=P1^1;                                 //設置鍵
  19. sbit Key2=P1^5;                                 //加按鍵
  20. sbit Key3=P1^6;                                 //減按鍵

  21. sbit DHT11=P1^0;                                 //DHT11

  22. signed char w;                                     //溫度值全局變量
  23. uint c;                                         //溫度值全局變量
  24. uchar temp;                                         //用于讀取ADC數據
  25. uchar yushe_wendu=60;                 //溫度預設值
  26. uchar yushe_humi=80;                 //濕度預設值

  27. uchar yushe_wendu_L=05;                 //溫度預設值
  28. uchar yushe_humi_L=10;                 //濕度預設值
  29. //按鈕模式|  
  30. uchar Mode=0;                                 
  31. uchar  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
  32. uchar  U8FLAG,U8comdata;
  33. uchar  U8count,U8temp;
  34. uchar  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;


  35. //軟件延時函數
  36. void delay(uint z)                  //延時函數大約延時z ms
  37. {
  38.         uint i,j;
  39.         for(i=0;i<z;i++)
  40.         for(j=0;j<121;j++);
  41. }

  42. void Delay_Ms(uint ms)
  43. {
  44.         uint i,j;
  45.         for(i=ms;i>0;i--)
  46.                 for(j=112;j>0;j--);
  47. }



  48.         
  49.         
  50. /*******************************************************************************************************
  51.                                                                                                                                                                                 LCD1602相關命令            
  52. ********************************************************************************************************/





  53. //LCD管腳聲明 (RW引腳實物直接接地,因為本設計只用到液晶的寫操作,RW引腳一直是低電平)
  54. sbit LCDRS = P2^7;
  55. sbit LCDEN = P2^6;

  56. //初始畫時顯示的內容
  57. uchar code Init1[]="TA=    L    H   ";
  58. uchar code Init2[]="RH=  % L  % H  %";
  59. //LCD延時
  60. void LCDdelay(uint z)                  //該延時大約100us(不精確,液晶操作的延時不要求很精確)
  61. {
  62.   uint x,y;
  63.   for(x=z;x>0;x--)
  64.     for(y=10;y>0;y--);
  65. }

  66. //寫命令
  67. void write_com(uchar com)
  68. {
  69.   LCDRS=0;                                 
  70.   P0=com;
  71.   LCDdelay(5);
  72.   LCDEN=1;
  73.   LCDdelay(5);
  74.   LCDEN=0;
  75. }
  76. //寫數據
  77. void write_data(uchar date)
  78. {
  79.   LCDRS=1;
  80.   P0=date;
  81.   LCDdelay(5);
  82.   LCDEN=1;
  83.   LCDdelay(5);
  84.   LCDEN=0;
  85. }
  86. //1602初始化
  87. void Init1602()
  88. {
  89.   uchar i=0;
  90.   write_com(0x38);//屏幕初始化
  91.   write_com(0x0c);//打開顯示 無光標 無光標閃爍
  92.   write_com(0x06);//當讀或寫一個字符是指針后一一位
  93.   write_com(0x01);//清屏
  94.         
  95.   write_com(0x80);//設置位置
  96.   for(i=0;i<16;i++)
  97.   {
  98.                 write_data(Init1[i]);          //顯示數組1的數據
  99.   }
  100.         write_com(0x80+5);
  101.         write_data(0xdf);//°
  102.         write_com(0x80+10);
  103.         write_data(0xdf);//°
  104.         write_com(0x80+15);
  105.         write_data(0xdf);//°
  106.         
  107.   write_com(0x80+0x40);//設置位置
  108.   for(i=0;i<16;i++)
  109.   {
  110.                 write_data(Init2[i]);          //顯示數組2的數據
  111.   }
  112.         
  113. }

  114. void Display_1602(yushe_wendu,yushe_yanwu,yushe_wendu_L,yushe_yanwu_L,c,temp)
  115. {
  116.         //設置最高溫度值
  117.         write_com(0x80+13);
  118.         write_data(0x30+yushe_wendu/10);
  119.         write_data(0x30+yushe_wendu%10);
  120.         //設置最低溫度值
  121.         write_com(0x80+8);
  122.         write_data(0x30+yushe_wendu_L/10);
  123.         write_data(0x30+yushe_wendu_L%10);

  124.         //設置最高濕度值
  125.         write_com(0x80+0x40+13);
  126.         write_data(0x30+yushe_yanwu%100/10);
  127.         write_data(0x30+yushe_yanwu%10);
  128.         //設置最低濕度值
  129.         write_com(0x80+0x40+8);
  130.         write_data(0x30+yushe_yanwu_L%100/10);
  131.         write_data(0x30+yushe_yanwu_L%10);

  132.         //時時溫度
  133.         write_com(0x80+3);
  134.         write_data(0x30+c%100/10);
  135.         write_data(0x30+c%10);
  136.         
  137.         //時時濕度
  138.         write_com(0x80+0x40+3);
  139.         write_data(0x30+temp%100/10);
  140.         write_data(0x30+temp%10);
  141. }



  142. //按鍵處理函數
  143. void Key()
  144. {
  145.         //模式選擇
  146.         if(Key1==0)          //設置按鍵
  147.         {
  148.                 while(Key1==0);
  149.                 if(Mode>=5) Mode=0;
  150.                 else
  151.                 {
  152.                         Mode++;                        //模式加一
  153.                         switch(Mode)        //判斷模式的值
  154.                         {
  155.                                 case 1://調溫度上限值模式
  156.                                 {
  157.                                         write_com(0x80+12);//為1時 溫度閥值的位置閃爍
  158.                                         write_data('-');
  159.                                         write_com(0x80+0x40+12);//為2時 濕度閥值的位置閃爍
  160.                                         write_data('H');
  161.                                         write_com(0x80+7);//為1時 溫度閥值的位置閃爍
  162.                                         write_data('L');
  163.                                         write_com(0x80+0x40+7);//為2時 濕度閥值的位置閃爍
  164.                                         write_data('L');
  165.                                         break;                          //執行后跳出switch
  166.                                 }
  167.                                 case 2://調濕度上限值模式
  168.                                 {
  169.                                         write_com(0x80+0x40+12);//為2時 濕度閥值的位置閃爍
  170.                                         write_data('-');
  171.                                         write_com(0x80+12);//為1時 溫度閥值的位置閃爍
  172.                                         write_data('H');
  173.                                         write_com(0x80+7);//為1時 溫度閥值的位置閃爍
  174.                                         write_data('L');
  175.                                         write_com(0x80+0x40+7);//為2時 濕度閥值的位置閃爍
  176.                                         write_data('L');
  177.                                         break;
  178.                                 }
  179.                                 case 3://調溫度下限值模式
  180.                                 {
  181.                                         write_com(0x80+7);//為1時 溫度閥值的位置閃爍
  182.                                         write_data('-');
  183.                                         write_com(0x80+12);//為1時 溫度閥值的位置閃爍
  184.                                         write_data('H');
  185.                                         write_com(0x80+0x40+12);//為2時 濕度閥值的位置閃爍
  186.                                         write_data('H');
  187.                                         write_com(0x80+0x40+7);//為2時 濕度閥值的位置閃爍
  188.                                         write_data('L');
  189.                                         break;                          //執行后跳出switch
  190.                                 }
  191.                                 case 4://調濕度下限值模式
  192.                                 {
  193.                                         write_com(0x80+0x40+7);//為2時 濕度閥值的位置閃爍
  194.                                         write_data('-');
  195.                                         write_com(0x80+12);//為1時 溫度閥值的位置閃爍
  196.                                         write_data('H');
  197.                                         write_com(0x80+0x40+12);//為2時 濕度閥值的位置閃爍
  198.                                         write_data('H');
  199.                                         write_com(0x80+7);//為1時 溫度閥值的位置閃爍
  200.                                         write_data('L');
  201.                                         break;
  202.                                 }
  203.                                 case 5:                                        //當模式加到3時
  204.                                 {
  205.                                         write_com(0x38);//屏幕初始化
  206.                                         write_com(0x0c);//打開顯示 無光標 無光標閃爍
  207.                                         write_com(0x80+12);//為1時 溫度閥值的位置閃爍
  208.                                         write_data('H');
  209.                                         write_com(0x80+0x40+12);//為2時 濕度閥值的位置閃爍
  210.                                         write_data('H');
  211.                                         write_com(0x80+7);//為1時 溫度閥值的位置閃爍
  212.                                         write_data('L');
  213.                                         write_com(0x80+0x40+7);//為2時 濕度閥值的位置閃爍
  214.                                         write_data('L');
  215.                                         Mode=0;                        //模式清零
  216.                                         break;
  217.                                 }
  218.                         }
  219.                 }
  220.         }
  221.         if(Key2==0&&Mode!=0)         //加按鍵只有在模式不等于0時有效
  222.         {
  223.                 while(Key2==0);
  224.                 switch(Mode)                 //加按鍵按下時 判斷當前模式
  225.                 {
  226.                         case 1:                         //模式為1時
  227.                         {
  228.                                 yushe_wendu++;                                //預設溫度上限值(閥值)加1
  229.                                 if(yushe_wendu>=99)                        //加到大于等于99時
  230.                                 yushe_wendu=99;                                //固定為99
  231.                                 write_com(0x80+13);                        //選1602上顯示的位置
  232.                                 write_data(0x30+yushe_wendu/10);         //將溫度上限值數據分解開送入液晶顯示
  233.                                 write_data(0x30+yushe_wendu%10);
  234.                                 break;
  235.                         }
  236.                         case 2:
  237.                         {
  238.                                 yushe_humi++;                                //濕度上限值,同溫度上限值設置
  239.                                 if(yushe_humi>=100)
  240.                                 yushe_humi=100;
  241.                                 write_com(0x80+0x40+13);
  242.                                 write_data(0x30+yushe_humi%100/10);
  243.                                 write_data(0x30+yushe_humi%10);
  244.                                 break;                                
  245.                         }
  246.                         case 3:                         //模式為3時
  247.                         {
  248.                                 yushe_wendu_L++;                        //溫度下限值,同溫度上限值設置
  249.                                 if(yushe_wendu_L>=95)                                                                 
  250.                                 yushe_wendu_L=95;                                                                                 
  251.                                 write_com(0x80+8);                                                                 
  252.                                 write_data(0x30+yushe_wendu_L/10);
  253.                                 write_data(0x30+yushe_wendu_L%10);
  254.                                 break;
  255.                         }
  256.                         case 4:
  257.                         {
  258.                                 yushe_humi_L++;                                //濕度下限值,同溫度上限值設置
  259.                                 if(yushe_humi_L>=90)                                                                 
  260.                                 yushe_humi_L=90;                                                                                 
  261.                                 write_com(0x80+0x40+8);
  262.                                 write_data(0x30+yushe_humi_L%100/10);
  263.                                 write_data(0x30+yushe_humi_L%10);
  264.                                 break;                                
  265.                         }
  266.                 }
  267.         }
  268.         if(Key3==0&&Mode!=0)
  269.         {
  270.                 while(Key3==0);
  271.                 switch(Mode)
  272.                 {
  273.                         case 1:
  274.                         {
  275.                                 if(yushe_wendu<=1)                        //當溫度上限值減小到1時
  276.                                 yushe_wendu=1;                        //固定為1
  277.                                 yushe_wendu--;                                //預設溫度值減一
  278.                                 write_com(0x80+13);                        //選1602上顯示的位置
  279.                                 write_data(0x30+yushe_wendu/10);             //將溫度上限值數據分解開送入液晶顯示
  280.                                 write_data(0x30+yushe_wendu%10);
  281.                                 break;
  282.                         }
  283.                         case 2:
  284.                         {
  285.                                 if(yushe_humi<=1)                        //濕度上限值,同溫度上限值設置
  286.                                 yushe_humi=1;
  287.                                 yushe_humi--;                                                         
  288.                                 write_com(0x80+0x40+13);
  289.                                 write_data(0x30+yushe_humi%100/10);
  290.                                 write_data(0x30+yushe_humi%10);
  291.                                 break;                                
  292.                         }
  293.                         case 3:                         //模式為3時
  294.                         {
  295.                                 if(yushe_wendu_L<=1)                        //溫度下限值,同溫度上限值設置
  296.                                 yushe_wendu_L=1;                                                                        
  297.                                 yushe_wendu_L--;                                                                        
  298.                                 write_com(0x80+8);                                                                 
  299.                                 write_data(0x30+yushe_wendu_L/10);
  300.                                 write_data(0x30+yushe_wendu_L%10);
  301.                                 break;
  302.                         }
  303.                         case 4:
  304.                         {
  305.                                 if(yushe_humi_L<=1)                        //濕度下限值,同溫度上限值設置
  306.                                 yushe_humi_L=1;                                                                                 
  307.                                 yushe_humi_L--;                                                                                 
  308.                                 write_com(0x80+0x40+8);
  309.                                 write_data(0x30+yushe_humi_L%100/10);
  310.                                 write_data(0x30+yushe_humi_L%10);
  311.                                 break;                                
  312.                         }                }
  313.         }
  314.         delay(10);                                                         //延時去抖動
  315.         write_com(0x38);//屏幕初始化
  316.         write_com(0x0c);//打開顯示 無光標 無光標閃爍
  317. }



  318. /*******************************************************************************************************
  319.                                                                                                                                                                                 DHT11相關命令            
  320. ********************************************************************************************************/
  321. void Delay1(uint j)
  322. {  
  323.         uchar i;
  324.         for(;j>0;j--)
  325.         {         
  326.                 for(i=0;i<27;i++);
  327.         }
  328. }

  329. void  Delay_10us(void)
  330. {
  331.         uchar i;
  332.         i--;
  333.         i--;
  334.         i--;
  335.         i--;
  336.         i--;
  337.         i--;
  338. }




  339. void  COM(void)
  340. {
  341.         uchar i;
  342.         for(i=0;i<8;i++)           
  343.         {
  344.                 U8FLAG=2;        
  345.                 while((!DHT11)&&U8FLAG++);
  346.                 Delay_10us();
  347.                 Delay_10us();
  348.                 Delay_10us();
  349.                 U8temp=0;
  350.                 if(DHT11)U8temp=1;
  351.                 U8FLAG=2;
  352.                 while((DHT11)&&U8FLAG++);
  353.                 //超時則跳出for循環                  
  354.                 if(U8FLAG==1)break;
  355.                 //判斷數據位是0還是1         
  356.                 // 如果高電平高過預定0高電平值則數據位為 1
  357.                 U8comdata<<=1;
  358.                 U8comdata|=U8temp;        //
  359.         }
  360. }
  361. //--------------------------------
  362. //-----濕度讀取子程序 ------------
  363. //--------------------------------
  364. //----以下變量均為全局變量--------
  365. //----溫度高8位== U8T_data_H------
  366. //----溫度低8位== U8T_data_L------
  367. //----濕度高8位== U8RH_data_H-----
  368. //----濕度低8位== U8RH_data_L-----
  369. //----校驗 8位 == U8checkdata-----
  370. //----調用相關子程序如下----------
  371. //---- Delay();, Delay_10us();,COM();
  372. //--------------------------------

  373. void RH(void)
  374. {
  375.         //主機拉低18ms
  376.         DHT11=0;
  377.         Delay1(180);
  378.         ET0 = 0;//關閉定時器0中斷
  379.         DHT11=1;
  380.         //總線由上拉電阻拉高 主機延時20us
  381.         Delay_10us();
  382.         Delay_10us();
  383.         Delay_10us();
  384.         Delay_10us();
  385.         //主機設為輸入 判斷從機響應信號
  386.         DHT11=1;
  387.         //判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行         
  388.         if(!DHT11)                 //T !         
  389.         {
  390.                 U8FLAG=2;
  391.                 //判斷從機是否發出 80us 的低電平響應信號是否結束         
  392.                 while((!DHT11)&&U8FLAG++);
  393.                 U8FLAG=2;
  394.                 //判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態
  395.                 while((DHT11)&&U8FLAG++);
  396.                 //數據接收狀態                 
  397.                 COM();
  398.                 U8RH_data_H_temp=U8comdata;
  399.                 COM();
  400.                 U8RH_data_L_temp=U8comdata;
  401.                 COM();
  402.                 U8T_data_H_temp=U8comdata;
  403.                 COM();
  404.                 U8T_data_L_temp=U8comdata;
  405.                 COM();
  406.                 U8checkdata_temp=U8comdata;
  407.                 DHT11=1;
  408.                 ET0 = 1;//開啟定時器0中斷
  409.                 //數據校驗

  410.                 U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
  411.                 if(U8temp==U8checkdata_temp)
  412.                 {
  413.                         U8RH_data_H=U8RH_data_H_temp;
  414.                         U8RH_data_L=U8RH_data_L_temp;
  415.                         U8T_data_H=U8T_data_H_temp;
  416.                         U8T_data_L=U8T_data_L_temp;
  417.                         U8checkdata=U8checkdata_temp;
  418.                 }//
  419.         }//

  420. }
  421.         



  422. /*****主函數*****/
  423. void main()
  424. {
  425.         uint i=0;
  426.         Delay_Ms(100);//上電延時100ms,等待DHT11啟動
  427.         Init1602();                          //調用初始化顯示函數
  428.         U8T_data_H=30;
  429.         U8RH_data_H=60;
  430.         while(1)                          //進入循環
  431.         {

  432.                 Key();                                          //調用按鍵函數  掃描按鍵
  433.                 if(Mode==0)                  //只有當模式為0時才會執行以下的閥值判斷部分
  434.                 {
  435.                         if(i<1)
  436.                         {
  437.                                 i=10;
  438.                                 RH();//溫濕度檢測
  439.                         }
  440.                         i--;
  441.                         Display_1602(yushe_wendu,yushe_humi,yushe_wendu_L,yushe_humi_L,U8T_data_H,U8RH_data_H);  
  442.                               //顯示預設溫度上限值,預設濕度上限值,預設溫度下限值,預設濕度下限值,當前溫度值,當前濕度值
  443.                         if(U8RH_data_H>=yushe_humi)         //濕度值大于等于預設上限值時
  444.                         {
  445.                                 LED_humi=0;                          //濕度上限繼電器
  446.                                 baojing=0;                          //蜂鳴器報警
  447.                         }
  448.                         else if(U8RH_data_H<=yushe_humi_L)          //濕度值小于等于預設值下限值時
  449.                         {
  450.                                 LED_humi_L=0;                  //濕度下限繼電器
  451.                                 baojing=0;                          //蜂鳴器報警
  452.                         }
  453.                         else                                          //濕度值處于上限界限之間時
  454.                         {
  455.                                 LED_humi=1;                          //關掉濕度上限繼電器
  456.                                 LED_humi_L=1;                  //關掉濕度下限繼電器
  457.                         }
  458.                         if(U8T_data_H>=(yushe_wendu))          //溫度值大于等于預設上限值時
  459.                         {
  460.                                 baojing=0;                          //打開蜂鳴器報警
  461.                                 LED_wendu=0;                  //打開溫度上限繼電器
  462.                         }
  463.                         else if(U8T_data_H<=yushe_wendu_L)          //溫度值小于等于預設值下限值時
  464.                         {
  465.                                 LED_wendu_L=0;                  //溫度下限繼電器
  466.                                 baojing=0;                          //蜂鳴器報警
  467.                         }
  468.                         else                                          //溫度值處于上限界限之間時
  469.                         {
  470.                                 LED_wendu=1;                          //關閉溫度上限繼電器
  471.                                 LED_wendu_L=1;                  //關閉溫度下限繼電器
  472.                         }
  473.                         if(yushe_humi_L<U8RH_data_H&&U8RH_data_H<yushe_humi&&yushe_wendu_L<U8T_data_H&&U8T_data_H<yushe_wendu)         
  474.                    //當濕度和溫度都處于正常值時 (&&:邏輯與,左右兩邊的表達式都成立(都為真,也就是1)時,該if語句才成立)
  475.                         {
  476.                                 baojing=1;                          //停止報警
  477.                         }
  478.                 }
  479.                 else
  480.                 {
  481.                         ET0 = 1;//開啟定時器0中斷
  482.                 }
  483.         }
  484. }        
復制代碼



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

使用道具 舉報

沙發
ID:1 發表于 2018-6-6 18:39 | 只看該作者
樓主能分享原理圖嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美成人综合 | www.蜜桃av| 成人精品毛片 | 久久久一区二区 | 美女视频三区 | 国产精品久久久久国产a级 欧美日本韩国一区二区 | 国产成人精品一区二区三区在线观看 | 欧美日韩在线精品 | 一级黄色片免费在线观看 | 亚洲精品国产第一综合99久久 | 久久久噜噜噜久久中文字幕色伊伊 | 亚洲欧美在线一区 | 天堂一区在线 | 国产成人精品久久二区二区91 | 国产精品久久久久无码av | 久久国产精彩视频 | 色综合色综合色综合 | 国产视频一区在线 | 四虎成人在线播放 | 久久亚洲免费 | 欧美日韩国产中文 | 久久aⅴ乱码一区二区三区 亚洲欧美综合精品另类天天更新 | 亚洲欧美日韩在线 | 玖玖玖在线观看 | 日本成人免费网站 | 久久一区二区三区电影 | 国产福利在线 | 国产一区二区三区 | 日韩中文av在线 | 黄网免费| 久久99精品久久久97夜夜嗨 | 欧美a在线 | 一区视频 | 亚洲精品乱码久久久久久按摩观 | av在线成人 | 精品久久久久久久久久久下田 | 精品国产网 | 成人久久久 | 一级黄色影片在线观看 | 久久高清免费视频 | 久久精品—区二区三区 |