找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7550|回复: 9
收起左侧

基于51单片机的蔬菜大棚温湿度智能控制系统程序设计

  [复制链接]
ID:395590 发表于 2019-11-25 19:02 | 显示全部楼层 |阅读模式
基于51单片机的蔬菜大棚温湿度智能控制系统设计模块使用:使用dht11、74hc595数码管模块、继电器模块
任务
1)根据检测到的温湿度信息控制通风与加热;
2)采用MCU、温湿度传感器、继电器、按键、数码管等;
3)通过按键设定大棚温湿度报警值;
4)上传信息到PC机;
5)当温度或适度超限时用继电器控制小灯状态模拟相应动作的发生。

230204B72FC083DD0A1F32DEA2FF975A.jpg 51.png

单片机源程序如下:
  1. ////////////////////////////////////////////////////10.3            17:58////////////////////////////////////////////////////////
  2. #include <reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  3. #include <intrins.h>
  4. #include <math.h>
  5. #define uchar unsigned char
  6. #define uint unsigned int       
  7. sbit RS = P1^0;   //定义端口
  8. sbit RW = P1^1;
  9. sbit EN = P2^5;
  10. sbit DU = P2^0;
  11. sbit WE = P2^1;
  12. sbit Data = P3^6;//定义数据线


  13. uchar rec_dat[19];   //用于显示的接收数据数组

  14. #define RS_CLR RS=0
  15. #define RS_SET RS=1

  16. #define RW_CLR RW=0
  17. #define RW_SET RW=1

  18. #define EN_CLR EN=0
  19. #define EN_SET EN=1

  20. #define DataPort P0


  21. void cmg88()//关数码管,点阵函数
  22. {
  23. DU=1;  
  24. P0=0X00;
  25. DU=0;
  26. }
  27. /*------------------------------------------------
  28. uS延时函数,含有输入参数 unsigned char t,无返回值
  29. unsigned char 是定义无符号字符变量,其值的范围是
  30. 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
  31. 长度如下 T=tx2+5 uS
  32. ------------------------------------------------*/
  33. void DelayUs2x(unsigned char t)
  34. {   
  35. while(--t);
  36. }
  37. /*------------------------------------------------
  38. mS延时函数,含有输入参数 unsigned char t,无返回值
  39. unsigned char 是定义无符号字符变量,其值的范围是
  40. 0~255 这里使用晶振12M,精确延时请使用汇编
  41. ------------------------------------------------*/
  42. void DelayMs(unsigned char t)
  43. {
  44.      
  45. while(t--)
  46. {
  47.      //大致延时1mS
  48.      DelayUs2x(245);
  49.          DelayUs2x(245);
  50. }
  51. }

  52. //              判忙函数
  53. bit LCD_Check_Busy(void)
  54. {
  55. DataPort= 0xFF;
  56. RS_CLR;
  57. RW_SET;
  58. EN_CLR;
  59. _nop_();
  60. EN_SET;
  61. return (bit)(DataPort & 0x80);
  62. }
  63. //             写入命令函数
  64. void LCD_Write_Com(unsigned char com)
  65. {  
  66. while(LCD_Check_Busy()); //忙则等待
  67. RS_CLR;
  68. RW_CLR;
  69. EN_SET;
  70. DataPort= com;
  71. _nop_();
  72. EN_CLR;
  73. }
  74. //             写入数据函数
  75. void LCD_Write_Data(unsigned char Data)
  76. {
  77. while(LCD_Check_Busy()); //忙则等待
  78. RS_SET;
  79. RW_CLR;
  80. EN_SET;
  81. DataPort= Data;
  82. _nop_();
  83. EN_CLR;
  84. }

  85. //               清屏函数
  86. void LCD_Clear(void)
  87. {
  88. LCD_Write_Com(0x01);
  89. DelayMs(5);
  90. }
  91. //             写入字符串函数
  92. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
  93. {     
  94. if (y == 0)
  95.         {     
  96.          LCD_Write_Com(0x80 + x);     //表示第一行
  97.         }
  98. else
  99.         {      
  100.         LCD_Write_Com(0xC0 + x);      //表示第二行
  101.         }        
  102. while (*s)
  103.         {     
  104. LCD_Write_Data( *s);     
  105. s ++;     
  106.         }
  107. }
  108.    //           写入字符函数
  109. void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
  110. {     
  111. if (y == 0)
  112.         {     
  113.         LCD_Write_Com(0x80 + x);     
  114.         }   
  115. else
  116.         {     
  117.         LCD_Write_Com(0xC0 + x);     
  118.         }        
  119. LCD_Write_Data( Data);  
  120. }
  121. //             初始化函数
  122. void LCD_Init(void)
  123. {
  124.    LCD_Write_Com(0x38);    /*显示模式设置*/
  125.    DelayMs(5);
  126.    LCD_Write_Com(0x38);
  127.    DelayMs(5);
  128.    LCD_Write_Com(0x38);
  129.    DelayMs(5);
  130.    LCD_Write_Com(0x38);  
  131.    LCD_Write_Com(0x08);    /*显示关闭*/
  132.    LCD_Write_Com(0x01);    /*显示清屏*/
  133.    LCD_Write_Com(0x06);    /*显示光标移动设置*/
  134.    DelayMs(5);
  135.    LCD_Write_Com(0x0C);    /*显示开及光标设置*/
  136.    }
  137.    

  138. /*------------------------------------------------
  139.               DHT11延时函数
  140. ------------------------------------------------*/
  141. void DHT11_delay_us(uchar n)
  142. {
  143.     while(--n);
  144. }

  145. void DHT11_delay_ms(uint z)
  146. {
  147.    uint i,j;
  148.    for(i=z;i>0;i--)
  149.       for(j=110;j>0;j--);
  150. }
  151. /*------------------------------------------------
  152.               DHT11开始信号
  153. ------------------------------------------------*/
  154. void DHT11_start()
  155. {
  156.    Data=1;
  157.    DHT11_delay_us(2);
  158.    Data=0;
  159.    DHT11_delay_ms(20);   //延时18ms以上
  160.    Data=1;
  161.    DHT11_delay_us(30);
  162. }
  163. //             接收八位二进制
  164. uchar DHT11_rec_byte()      //接收一个字节
  165. {
  166.    uchar i,dat=0;
  167.   for(i=0;i<8;i++)    //从高到低依次接收8位数据
  168.    {         
  169.       while(!Data);   ////等待50us低电平过去
  170.       DHT11_delay_us(8);     //延时60us,如果还为高则数据为1,否则为0
  171.       dat<<=1;           //移位使正确接收8位数据,数据为0时直接移位
  172.       if(Data==1)    //数据为1时,使dat加1来接收数据1
  173.          dat+=1;
  174.       while(Data);  //等待数据线拉低   
  175.     }  
  176.     return dat;
  177. }
  178. //              接收40bit数据

  179. void DHT11_receive()      //接收40位的数据
  180. {
  181.     uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
  182.     DHT11_start();

  183.     if(Data==0)
  184.     {
  185.        
  186.         while(Data==0);   //等待拉高     
  187.                
  188.         DHT11_delay_us(40);  //拉高后延时80us
  189.         R_H=DHT11_rec_byte();    //接收湿度高八位  
  190.         R_L=DHT11_rec_byte();    //接收湿度低八位  
  191.         T_H=DHT11_rec_byte();    //接收温度高八位  
  192.         T_L=DHT11_rec_byte();    //接收温度低八位
  193.         revise=DHT11_rec_byte(); //接收校正位
  194.                          
  195.         DHT11_delay_us(25);    //结束

  196.         if((R_H+R_L+T_H+T_L)==revise)      //校正
  197.         {
  198.             RH=R_H;
  199.             RL=R_L;
  200.             TH=T_H;
  201.             TL=T_L;
  202.         }
  203.         /*数据处理,方便显示*/
  204.         rec_dat[0]='0'+(RH/10);
  205.         rec_dat[1]='0'+(RH%10);
  206.                 rec_dat[2] =' ';
  207.                 rec_dat[3] = 'R' ;
  208.                 rec_dat[4] = 'H';
  209.         rec_dat[5]=' ';
  210.         rec_dat[6]=' ';
  211.         rec_dat[7]=' ';
  212.         rec_dat[8]=' ';
  213.         rec_dat[9]='0'+(TH/10);
  214.         rec_dat[10]='0'+(TH%10);
  215.                 rec_dat[11] =' ';
  216.                 rec_dat[12] = 'C';
  217.                 rec_dat[13] = ' ' ;
  218.         rec_dat[14]=' ';
  219.                 rec_dat[15] =(RH/10);
  220.                 rec_dat[16] =(RH%10);
  221.                 rec_dat[17] =(TH/10) ;
  222.         rec_dat[18]=(TH%10);
  223.     }
  224. }
  225. /////////////////数码管///////////////////////////////////////////////

  226.   
  227. unsigned char code fseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  228. unsigned char code segbit[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
  229. unsigned char  disbuf[8]={0,0,0,0,0,0,0,0};
  230. unsigned char code LED_0F[];                // LED字模表

  231. sbit DIO = P1^0;                                //串行数据输入
  232. sbit rclck  = P1^1;                                //时钟脉冲信号——上升沿有效
  233. sbit SCLK = P1^2;                                //打入信号————上升沿有效

  234. //-----------------------------------------------------------------------------
  235. // 全局变量
  236. uchar LED[8];        //用于LED的8位显示缓存
  237.   


  238. unsigned char code LED_0F[] =
  239. {// 0         1          2           3        4         5          6           7        8         9          A           b        C    d          E    F    -
  240.         0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8C,0xBF,0xC6,0xA1,0x86,0xFF,0xbf
  241. };

  242. void LED_OUT(uchar X)
  243. {
  244.         uchar i;
  245.         for(i=8;i>=1;i--)
  246.         {
  247.                 if (X&0x80) DIO=1; else DIO=0;
  248.                 X<<=1;
  249.                 SCLK = 0;
  250.                 SCLK = 1;
  251.         }
  252. }  

  253. void LED8_Display (void)
  254. {
  255.         unsigned char code *led_table;          // 查表指针
  256.         uchar i;
  257.         //显示第1位
  258.         led_table = LED_0F + LED[0];
  259.         i = *led_table;

  260.         LED_OUT(i);                       
  261.         LED_OUT(0x01);               

  262.         rclck = 0;
  263.         rclck = 1;
  264.         //显示第2位
  265.         led_table = LED_0F + LED[1];
  266.         i = *led_table;

  267.         LED_OUT(i);               
  268.         LED_OUT(0x02);               

  269.         rclck = 0;
  270.         rclck = 1;
  271.         //显示第3位
  272.         led_table = LED_0F + LED[2];
  273.         i = *led_table;

  274.         LED_OUT(i);                       
  275.         LED_OUT(0x04);       

  276.         rclck = 0;
  277.         rclck = 1;
  278.         //显示第4位
  279.         led_table = LED_0F + LED[3];
  280.         i = *led_table;

  281.         LED_OUT(i);                       
  282.         LED_OUT(0x08);               

  283.         rclck = 0;
  284.         rclck = 1;
  285.                 led_table = LED_0F + LED[4];
  286.         i = *led_table;
  287.         LED_OUT(i);                       
  288.         LED_OUT(0x10);       
  289.         rclck = 0;
  290.         rclck = 1;         
  291.                  
  292.                 //显示第6位
  293.         led_table = LED_0F + LED[5];
  294.         i = *led_table;

  295.         LED_OUT(i);                       
  296.         LED_OUT(0x20);       

  297.         rclck = 0;
  298.         rclck = 1;
  299.                  //显示第7位
  300.         led_table = LED_0F + LED[6];
  301.         i = *led_table;

  302.         LED_OUT(i);                       
  303.         LED_OUT(0x40);       

  304.         rclck = 0;
  305.         rclck = 1;         
  306.                          //显示第8位
  307.         led_table = LED_0F + LED[7];
  308.         i = *led_table;

  309.         LED_OUT(i);               
  310.         LED_OUT(0x80);       

  311.         rclck = 0;
  312.         rclck = 1;
  313.         }


  314. void LED2_Display (uchar *wei)
  315. {
  316.         unsigned char code *led_table;          // 查表指针
  317.         uchar i;
  318. if(wei==1)
  319. {
  320.         //显示第1位
  321.         led_table = LED_0F + LED[0];
  322.         i = *led_table;

  323.         LED_OUT(i);                       
  324.         LED_OUT(0x01);               

  325.         rclck = 0;
  326.         rclck = 1;
  327.         //显示第2位
  328.         led_table = LED_0F + LED[1];
  329.         i = *led_table;

  330.         LED_OUT(i);               
  331.         LED_OUT(0x02);               

  332.         rclck = 0;
  333.         rclck = 1;
  334. }
  335. if(wei==2)
  336. {
  337.         //显示第3位
  338.         led_table = LED_0F + LED[2];
  339.         i = *led_table;

  340.         LED_OUT(i);                       
  341.         LED_OUT(0x04);       

  342.         rclck = 0;
  343.         rclck = 1;
  344.         //显示第4位
  345.         led_table = LED_0F + LED[3];
  346.         i = *led_table;

  347.         LED_OUT(i);                       
  348.         LED_OUT(0x08);               

  349.         rclck = 0;
  350.         rclck = 1;
  351. }
  352. if(wei==3)
  353. {
  354.         led_table = LED_0F + LED[4];
  355.         i = *led_table;
  356.         LED_OUT(i);                       
  357.         LED_OUT(0x10);       
  358.         rclck = 0;
  359.         rclck = 1;         
  360.                  
  361.                 //显示第6位
  362.         led_table = LED_0F + LED[5];
  363.         i = *led_table;

  364.         LED_OUT(i);                       
  365.         LED_OUT(0x20);       

  366.         rclck = 0;
  367.         rclck = 1;
  368. }
  369.         if(wei==4)
  370. {
  371.                  //显示第7位
  372.         led_table = LED_0F + LED[6];
  373.         i = *led_table;

  374.         LED_OUT(i);                       
  375.         LED_OUT(0x40);       

  376.         rclck = 0;
  377.         rclck = 1;         
  378.                          //显示第8位
  379.         led_table = LED_0F + LED[7];
  380.         i = *led_table;

  381.         LED_OUT(i);               
  382.         LED_OUT(0x80);       

  383.         rclck = 0;
  384.         rclck = 1;
  385. }
  386. }
  387. uchar wendu;
  388.   uchar shidu;
  389.   void shumaguan_show(void)
  390. {
  391.            LED[1]=rec_dat[15];
  392.           LED[0]=rec_dat[16];
  393.          shidu=rec_dat[15]*10+rec_dat[16];
  394.         LED[7]=rec_dat[17];
  395.         LED[6]=rec_dat[18];
  396.          wendu=rec_dat[17]*10+rec_dat[18];
  397.         LED[2]=16;
  398.         LED[3]=16;
  399.         LED[4]=16;
  400.         LED[5]=16;
  401.         LED8_Display ();
  402.   
  403. }
  404.     //////////////////////////////////////////////////////////////////////////
  405. sbit Beep=P2^2;                   //设置蜂鸣器引脚

  406. sbit K1=P2^3;
  407. sbit K2=P2^4;
  408. sbit K3=P2^5;
  409. sbit K4=P2^6;
  410. sbit K5=P2^7;
  411. void key_init(void)
  412. {
  413. K1=1;
  414. K2=1;
  415. K3=1;
  416. K4=1;
  417. }
  418. uchar an=0;
  419. uchar move=0;
  420.   void caidan(void)
  421.   {
  422.            if(K1==0&&an==0)
  423.         {
  424.                  DelayMs(10);                                                  // 去除按键按下的抖动
  425.                 while(!K1);                                         // 等待按键释放
  426.                 DelayMs(10);                                                  // 去除按键松开的抖动
  427.                 an=1;
  428.        
  429.         }
  430.                    if(K1==0&&an==1)
  431.         {
  432.                  DelayMs(10);                                                  // 去除按键按下的抖动
  433.                 while(!K1);                                         // 等待按键释放
  434.                 DelayMs(10);                                                  // 去除按键松开的抖动
  435.                 an=0;

  436.         }       
  437.   }
  438.   void move_2(void)
  439.   {
  440.              if(K2==0&&move==0)
  441.         {
  442.                  DelayMs(10);                                                  // 去除按键按下的抖动
  443.                 while(!K2);                                         // 等待按键释放
  444.                 DelayMs(10);                                                  // 去除按键松开的抖动
  445.                 move=1;
  446.         }
  447.   
  448.                      if(K2==0&&move==1)
  449.         {
  450.                  DelayMs(10);                                                  // 去除按键按下的抖动
  451.                 while(!K2);                                         // 等待按键释放
  452.                 DelayMs(10);                                                  // 去除按键松开的抖动
  453.                 move=2;
  454.         }

  455.                    if(K2==0&&move==2)
  456.         {
  457.                  DelayMs(10);                                                  // 去除按键按下的抖动
  458.                 while(!K2);                                         // 等待按键释放
  459.                 DelayMs(10);                                                  // 去除按键松开的抖动
  460.                 move=3;
  461.         }
  462.                    if(K2==0&&move==3)
  463.         {
  464.                  DelayMs(10);                                                  // 去除按键按下的抖动
  465.                 while(!K2);                                         // 等待按键释放
  466.                 DelayMs(10);                                                  // 去除按键松开的抖动
  467.                 move=0;
  468.         }
  469.   
  470.   }

  471. uchar AlarmTL;                        // 温度下限报警值
  472. uchar AlarmTH;                        // 温度上限报警值
  473. uchar AlarmHL;                        // 湿度下限报警值
  474. uchar AlarmHH;                        // 湿度上限报警值
  475. void up_down(void)
  476. {
  477. ///////////////////////////////////////////////////////////////////////////////////////////////////////
  478.           if(K4==0&&move==0)
  479.         {
  480.                  DelayMs(10);                                                  // 去除按键按下的抖动
  481.                 while(!K4);                                         // 等待按键释放
  482.                 DelayMs(10);                                                  // 去除按键松开的抖动
  483.                         if(AlarmTL>0)                                  // 只有当湿度上限值大于0时,才能减1
  484.                                 {
  485.                                         AlarmTL--;         
  486.                        
  487.                        
  488.                                         }
  489.         }
  490.                         if(K3==0&&move==0)                         // 判断 “加按键“ 是否被按下
  491.                         {
  492.                                 DelayMs(10);                                                  // 去除按键按下的抖动
  493.                        while(!K3);                                         // 等待按键释放
  494.                        DelayMs(10);
  495.                                 if(AlarmTL<99)                                // 只有当湿度上限值小于99时,才能加1
  496.                                         AlarmTL++;
  497.                    

  498.                         }       
  499.                         ///////////////////////////////////////////////////////////////////////////////////////////////////////
  500.           if(K4==0&&move==1)
  501.         {
  502.                  DelayMs(10);                                                  // 去除按键按下的抖动
  503.                 while(!K4);                                         // 等待按键释放
  504.                 DelayMs(10);                                                  // 去除按键松开的抖动
  505.                         if(AlarmTH>0)                                  // 只有当湿度上限值大于0时,才能减1
  506.                                 {
  507.                                         AlarmTH--;         
  508.                        
  509.                        
  510.                                         }
  511.         }
  512.                         if(K3==0&&move==1)                         // 判断 “加按键“ 是否被按下
  513.                         {
  514.                                 DelayMs(10);                                                  // 去除按键按下的抖动
  515.                        while(!K3);                                         // 等待按键释放
  516.                        DelayMs(10);
  517.                                 if(AlarmTH<99)                                // 只有当湿度上限值小于99时,才能加1
  518.                                         AlarmTH++;
  519.                    

  520.                         }       
  521. ///////////////////////////////////////////////////////////////////////////////////////////////////////
  522.           if(K4==0&&move==2)
  523.         {
  524.                  DelayMs(10);                                                  // 去除按键按下的抖动
  525.                 while(!K4);                                         // 等待按键释放
  526.                 DelayMs(10);                                                  // 去除按键松开的抖动
  527.                         if(AlarmHL>0)                                  // 只有当湿度上限值大于0时,才能减1
  528.                                 {
  529.                                         AlarmHL--;         
  530.                        
  531.                        
  532.                                         }
  533.         }
  534.                         if(K3==0&&move==2)                         // 判断 “加按键“ 是否被按下
  535.                         {
  536.                                 DelayMs(10);                                                  // 去除按键按下的抖动
  537.                        while(!K3);                                         // 等待按键释放
  538.                        DelayMs(10);
  539.                                 if(AlarmHL<99)                                // 只有当湿度上限值小于99时,才能加1
  540.                                         AlarmHL++;
  541.                    

  542.                         }       
  543. ///////////////////////////////////////////////////////////////////////////////////////////
  544.                    if(K4==0&&move==3)
  545.         {
  546.                  DelayMs(10);                                                  // 去除按键按下的抖动
  547.                 while(!K4);                                         // 等待按键释放
  548.                 DelayMs(10);                                                  // 去除按键松开的抖动
  549.                         if(AlarmHH>0)                                  // 只有当湿度上限值大于0时,才能减1
  550.                                 {
  551.                                         AlarmHH--;         
  552.                        
  553.                        
  554.                                         }
  555.         }
  556.                         if(K3==0&&move==3)                         // 判断 “加按键“ 是否被按下
  557.                         {
  558.                                 DelayMs(10);                                                  // 去除按键按下的抖动
  559.                        while(!K3);                                         // 等待按键释放
  560.                        DelayMs(10);
  561.                                 if(AlarmHH<99)                                // 只有当湿度上限值小于99时,才能加1
  562.                                         AlarmHH++;
  563.                    

  564.                         }
  565. /////////////////////////////////////////////////////////////////////////////////////////////////////       
  566. }

  567. uchar TAB[8]={0x00,0x00,0x00,0x00,0x00};
  568. void send(uchar dat)
  569. {
  570. SBUF=dat;
  571. while(TI==0);
  572. TI=0;
  573. }
  574. sbit LED1=P0^6;
  575. sbit LED2=P0^7;
  576. sbit LED3=P0^4;
  577. sbit LED4=P0^5;

  578. void panduan(void)
  579. {
  580.         if(wendu<AlarmTL)
  581.          {
  582.            LED1=0;
  583.            Beep=0;
  584.            DelayMs(2);
  585.            Beep=1;
  586.          }
  587.                  if(wendu>AlarmTL)
  588.          {
  589.            LED1=1;
  590.            Beep=1;
  591.          }
  592.                  if(wendu>AlarmTH)
  593.          {
  594.            LED2=0;
  595.            Beep=0;
  596.            DelayMs(2);
  597.            Beep=1;
  598.          }
  599.                    if(wendu<AlarmTH)
  600.          {
  601.            LED2=1;
  602.            Beep=1;
  603.          }
  604.                   if(shidu<AlarmHL)
  605.          {
  606.            LED3=0;
  607.            Beep=0;
  608.            DelayMs(2);
  609.            Beep=1;
  610.          }
  611.                            if(shidu>AlarmHL)
  612.          {
  613.            LED3=1;
  614.            Beep=1;
  615.          }
  616.                    if(shidu>AlarmHH)
  617.          {
  618.            LED4=0;
  619.            Beep=0;
  620.            DelayMs(2);
  621.            Beep=1;
  622.          }
  623.                    if(shidu<AlarmHH)
  624.          {
  625.            LED4=1;
  626.            Beep=1;
  627.          }
  628. }
  629.   //////////////////////////////////////////////////////////////////////////
  630. /*------------------------------------------------
  631.                     主函数
  632. ------------------------------------------------*/
  633. void main(void)
  634. {
  635. uchar i;
  636. TMOD=0X20;
  637. SCON=0X40;
  638. PCON=0X00;
  639. TH1=0xfd;
  640. TL1=0xfd;
  641. TR1=1;
  642.     key_init();
  643.         AlarmTL=15;
  644.         AlarmTH=50;
  645.         AlarmHL=15;
  646.         AlarmHH=50;
  647.         DHT11_delay_ms(1000);    //DHT11上电后要等待1S以越过不稳定状态在此期间不能发送任何指令  
  648.         P0=0xff;
  649.         while (1)
  650.         {
  651.          caidan();
  652.                  if(an==0)
  653.                  {
  654.                       DHT11_receive();
  655.                     shumaguan_show();
  656.                         panduan();
  657.                  }
  658.                                   if(an==1)
  659.                          {
  660.                                 Beep=1;
  661.                                         DelayMs(10);
  662.                                 move_2();        //2位右移
  663.                                 up_down();
  664.                                 LED[1]=AlarmHH/10;// 湿度上限报警
  665.                                   LED[0]=AlarmHH%10;
  666.                                 LED[2]=AlarmHL%10; // 湿度下限报警
  667.                                 LED[3]=AlarmHL/10;
  668.                                 LED[7]=AlarmTL/10; // 温度下限报警
  669.                                 LED[6]=AlarmTL%10;
  670.                                 LED[4]=AlarmTH%10;// 温度上限报警
  671.                                 LED[5]=AlarmTH/10;
  672.                
  673.                                 if(move==0)  LED2_Display (4);
  674.                             if(move==1)  LED2_Display (3);
  675.                                 if(move==2)  LED2_Display (2);
  676.                                 if(move==3)  LED2_Display (1);   
  677.                         }
  678.                                                 if(K5==0)       
  679.                                                 {
  680.                                                          DelayMs(10);                                                  // 去除按键按下的抖动
  681.                                                                 while(!K5);                                         // 等待按键释放
  682.                                                                 DelayMs(10);
  683.                                                                 TAB[0]=rec_dat[15];
  684.                                                                    TAB[1]=rec_dat[16];
  685.                                                             TAB[2]=rec_dat[17];
  686.                                                                    TAB[3]=rec_dat[18];
  687.                                                             TAB[4]=0x00;
  688.                                                    for(i=0;i<4;i++)
  689.                                                  {
  690.                                                          send(TAB[i]);
  691.                                                                 DelayMs(200);
  692.                                                  }
  693.                                                  }       
  694.                                                                    
  695.         }
  696. }
复制代码

所有资料51hei提供下载:
基于单片机的蔬菜大棚温湿度智能控制系统设计.rar (708.89 KB, 下载次数: 275)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:725749 发表于 2020-4-9 19:55 | 显示全部楼层
原理图用什么软件看呀
回复

使用道具 举报

ID:755012 发表于 2020-5-19 10:10 | 显示全部楼层
好帖,lz牛逼
回复

使用道具 举报

ID:758682 发表于 2020-5-22 20:36 | 显示全部楼层
好帖子很有用
回复

使用道具 举报

ID:165117 发表于 2020-5-29 15:14 | 显示全部楼层
好帖子谢谢分享  学习学习!
回复

使用道具 举报

ID:808396 发表于 2020-8-22 05:47 | 显示全部楼层
程序里有lcd,但是程序里有lcd,而且数码管小数点连接标的不明确,程序复杂而且有很多多余
回复

使用道具 举报

ID:802167 发表于 2020-8-27 21:55 | 显示全部楼层
913261927 发表于 2020-4-9 19:55
原理图用什么软件看呀

proteus
回复

使用道具 举报

ID:306996 发表于 2020-9-9 08:44 | 显示全部楼层
913261927 发表于 2020-4-9 19:55
原理图用什么软件看呀

ad就可以看
回复

使用道具 举报

ID:937091 发表于 2021-6-20 19:02 | 显示全部楼层
“要求当前温湿度数据可以记录、存储、并通过穿行口上传到上位机以备查询。”
                                                                                                                                                      
请问加了这个条件,需要怎样实现呢,是只用在.c程序里写出来吗?该怎么写呢。                                                                       您分享的文件的原理图还用改变吗 ?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表