【Proteus仿真】【32单片机】温湿度控制系统设计
目录
一、主要功能
二、使用步骤
三、硬件资源
四、软件设计
五、实验现象
一、主要功能
1、温度检测与LCD显示
 2、超上限温度降温模块启动
 3、低下限升温模块启动
 4、温度阈值设置
 5、超限报警
二、使用步骤
系统运行后,LCD1602显示当前温湿度值,可通过设置键进入温湿度上限和下限阈值设置,并且LCD1602显示设置的值。通过加一和减一键进行阈值调整,设定好后设置退出。当检测温湿度值高于或低于上下限值时,控制声光报警,加热或降温湿模块工作。
三、硬件资源
1、32单片机核心模块
 2、按键模块
 3、DS18B20温湿度传感器模块
 4、蜂鸣器模块
 5、继电器模块
 6、LCD1602显示模块
四、软件设计
主要代码
//外部中断
 void EXTI15_10_IRQHandler(void)
 {
     delay_ms(50);
     if(KEY1 == 0)
     {
         Set_num++;//设置位增加
         TIM_ITConfig( TIM2,TIM_IT_Update,DISABLE );//关闭定时器2
         if(Set_num>2)
         {
             LcdWriteCom(0x0C);//取消光标闪烁    
             TIM_ITConfig( TIM2,TIM_IT_Update,ENABLE );//打开定时器2    
             Set_num=0;
         }
         while(KEY1 == 0);
     }
     if(KEY2 == 0)
     {
         if(Set_num==1)//设置阈值L
         {
             if(TL<TH-1)
                 TL++;
             LcdWriteCom(0x80+0x40+3); //第二行
             LcdWriteData(TL/10+0x30);    
             LcdWriteData(TL%10+0x30);
             LcdWriteCom(0x80+0x40+4); //第二行
             LcdWriteCom(0x0f);                                    // 光标闪烁
         }
         else if(Set_num==2)//设置阈值H
         {
             if(TH<99)
                 TH++;
             LcdWriteCom(0x80+0x40+13); //第二行
             LcdWriteData(TH/10+0x30);    
             LcdWriteData(TH%10+0x30);    
             LcdWriteCom(0x80+0x40+14); //第二行
             LcdWriteCom(0x0f);                                    // 光标闪烁
         }
         
         
         while(KEY2 == 0);
     }
     if(KEY3 == 0)
     {
         if(Set_num==1)//设置阈值L
         {
             if(TL>0)
                 TL--;
             LcdWriteCom(0x80+0x40+3); //第二行
             LcdWriteData(TL/10+0x30);    
             LcdWriteData(TL%10+0x30);    
             LcdWriteCom(0x80+0x40+4); //第二行
             LcdWriteCom(0x0f);                                    // 光标闪烁
         }
         else if(Set_num==2)//设置阈值H
         {
             if(TH>TL+1)
                 TH--;
             LcdWriteCom(0x80+0x40+13); //第二行
             LcdWriteData(TH/10+0x30);    
             LcdWriteData(TH%10+0x30);
             LcdWriteCom(0x80+0x40+14); //第二行
             LcdWriteCom(0x0f);                                    // 光标闪烁
         }
         
         while(KEY3 == 0);
     }
     if(EXTI_GetITStatus(EXTI_Line13) != RESET)//判断中断标志线是否13
     {                
         EXTI_ClearITPendingBit(EXTI_Line13); //清除LINE13上的中断标志位
     }
   if(EXTI_GetITStatus(EXTI_Line14) != RESET)//判断中断标志线是否14
     {                
         EXTI_ClearITPendingBit(EXTI_Line14); //清除LINE14上的中断标志位
     }        
   if(EXTI_GetITStatus(EXTI_Line15) != RESET)//判断中断标志线是否15
     {    
         EXTI_ClearITPendingBit(EXTI_Line15); //清除LINE15上的中断标志位
     }
      
 }
int main()
 {    
     delay_init();             //延时函数初始化
     LCD1602_Init();      //lcd函数初始化
     NVIC_Configuration();      //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 
     EXTIX_Init();//外部中断初始化 
     DS18B20_Init();    
     temperature=DS18B20_Get_Temp();//获取温度
     display_value();     //阈值函数初始化
     TOOL_Init();         //工具初始化
     Delay(1000000);
     Delay(1000000);
     while(1) 
     {        
         temperature=DS18B20_Get_Temp();//获取温度
         switch(Set_num)
         {
             case 0:display_data();Alarm();//警报函数        
                 break;
             case 1:
                     BEEP=1;MOT1=1;MOT2=1;//设置阈值关闭警报
                     LcdWriteCom(0xc0+4); //第二行
                   LcdWriteCom(0x0f);  // 光标闪烁                
                 break;//阈值L
             case 2:
                     LcdWriteCom(0xc0+14); //第二行
                   LcdWriteCom(0x0f);  // 光标闪烁                
                 break;//阈值H
             
         }
     }      
 }
五、实验现象
演示视频:
基于STM32单片机DS18B20温度检测系统



