最近设计了一个项目基于单片机的温湿度控制系统,与大家分享一下:

一、基本介绍

项目名:温湿度控制
单片机类型:STC89C52、、STM32F103C8T6
具体功能:
1、通过DHT11测量环境温湿度,当温湿度不在设定的上下限值之内时,进行相应的加热制冷加湿除湿,并进行声光报警
2、通过按键设置温湿度上下限值,可以手动控制加热制冷加湿除湿、切换模式
3、通过显示屏显示数据
扩展功能:通过蓝牙模块将测量数据发送到手机端,手机端可以设置温湿度上下限,并可以远程控制加热制冷加湿除湿、切换模式

二、51实物图

单片机型号:STC89C52

板子为绿色PCB板,两层板,厚度1.2,上下覆铜接地。元器件基本上为插针式,个别降压芯片会使用贴片式。

供电接口:TYPE-C

三、51仿真图

仿真软件版本:proteus8.9

电路连线方式:网络标号连线方式

注意:部分实物元器件仿真中没有,仿真中会用其他工作原理相似的元件代替,这样可能导致实物程序和仿真程序不一样

四、32实物图

单片机型号:STM32F103C8T6

板子为绿色PCB板,两层板,厚度1.2,上下覆铜接地。元器件基本上为插针式,个别降压芯片会使用贴片式。

供电接口:TYPE-C

五、原理图

软件版本:AD2013

电路连线方式:网络标号连线方式

注意:原理图只是画出了模块的引脚图,而并不是模块的内部结构原理图

六、PCB图

由原理图导出,封装很大一部分都是作者自己绘制,不提供封装库,只提供连接好的源文件。中间有一个项目编号,隐藏在单片机底座下,插入单片机后不会看到。

两层板,上下覆铜接地。

七、系统框图

本设计以STC89C52单片机为核心控制器,加上其他的模块一起组成室内环境温湿度检测系统的设计与研究的整个系统,其中包含中控部分、输入部分和输出部分。中控部分采用了STC89C52单片机,其主要作用是获取输入部分数据,经过内部处理,控制输出部分。输入由三部分组成,第一部分是DHT11温湿度检测模块,通过该模块可检测当前的温湿度值;第二部分是独立按键,通过三个独立按键切换界面和设置温湿度阈值;第三部分是供电电路,给整个系统进行供电。输出由六部分组成,第一部分是LCD1602显示模块, 通过该模块可以显示当前温度、湿度、设置的温湿度阈值等;第二部分是继电器控制加热片,当温度小于设置最小值时,加热继电器闭合,加热片工作,进行加热;第三部分是继电器控制制冷片,当温度大于设置最大值时,制冷继电器闭合,制冷片工作,进行制冷;第四部分是继电器控制加湿器,当湿度小于设置的最小值时,加湿继电器闭合,加湿器工作,进行加湿;第五部分是继电器控制风扇,当湿度大于设置的最大值时,除湿继电器闭合,风扇工作,进行除湿;第六部分是声光报警,温湿度不在设置的阈值之内时,进行声光报警提醒,第六部分为蓝牙连接手机模块,用户通过蓝牙和手机进行连接,将检测的温湿度传输到液晶显示屏上,及其当前设计的温湿度值和模式,用户也可以通过手机远程控制加热制冷、加湿除湿继电器的工作及其模式的切换。

八、软件设计流程

系统的主流程图如图所示。在主程序中:首先对各个模块进行初始化,随后进入while主循环,在主循环中,首先进入第一个函数按键函数,该函数主要分为两部分,第一部分为调用按键扫描函数获取按键键值,第二部分通过键值进行相应的处理操作,包括切换界面、设置阈值等;紧接着进入第二个函数监测函数,该函数主要通过调用相应的驱动函数获取测量值,并通过蓝牙模块将监测的数据传输到手机端,用户也可以通过手机端发送指令,设备根据用户发送的指令执行对应的处理;紧接着进入第三个函数显示函数,该函数显示监测值及阈值;最后进入第四个函数处理函数,该函数主要判断当前温湿度是否在设置的阈值之内,如果温度大于设置的最大值,则声光报警,并且打开制冷继电器进行降温,如果温度小于设置的最小值,则声光报警,并且打开加热继电器进行加热,如果湿度大于设置的最大值,则声光报警,并且打开除湿继电器进行除湿,如果湿度小于设置的最小值,则声光报警,并且打开加湿继电器进行加湿,如果温度和湿度在设置的阈值之内,则取消声光报警,并关闭加热和制冷以及加湿和除湿继电器。

九、部分程序展示

软件版本:keil5

逻辑程序和驱动程序分开,分布于main.c和其他.c文件

/**********************************
作者:单片机俱乐部
网站:https://www.mcuclub.cn/
**********************************//**********************************
包含头文件
**********************************/
#include "main.h"
#include "lcd1602.h"
#include "key.h"
#include "uart.h"
#include "dht11.h"/**********************************
变量定义
**********************************/
uchar key_num = 0;                                         //按键扫描标志位
uchar flag_display = 0;                                    //显示界面标志位
uint time_num = 0;                                         //10ms计时变量
bit flag_mode = 0;                      //模式标志位bit flag_alarm_t = 0;                   //温度声光报警标志位
uint temp_value = 0;                                       //温度值
uint temp_max = 30;                                          //温度最大值
uint temp_min = 20;                                          //温度最小值
uchar temp_ctrl = 0;                                       //手动控制温度标志bit flag_alarm_h = 0;                   //湿度度声光报警标志位
uint humi_value = 0;                                     //湿度值
uint humi_max = 60;                                          //湿度最大值
uint humi_min = 30;                                          //湿度最小值
uchar humi_ctrl = 0;                                       //手动控制湿度标志uchar uart_buf[16];                     //串口发送缓存区/**********************************
函数声明
**********************************/
void Delay_function(uint x);                        //延时函数(ms)
void Key_function(void);                                //按键函数
void Monitor_function(void);                        //监测函数
void Display_function(void);                        //显示函数
void Manage_function(void);                         //处理函数/****
******* 主函数
*****/
void main(void)
{Lcd1602_Init();                                                //LCD1602初始化Delay_function(50);                                     //延时50mslcd1602_clean();                                            //清屏Delay_function(50);                                     //延时50mswhile(DHT11_Init());                  //DHT11初始化Delay_function(50);                                     //延时50msUart_Init();                                                //串口初始化函数Delay_function(50);                                        //延时50mswhile(1){Key_function();                                            //按键函数Monitor_function();                                   //监测函数Display_function();                                   //显示函数Manage_function();                                    //处理函数Delay_function(10);                                   //延时10mstime_num++;                                                   //计时变量+1if(time_num == 5000){time_num = 0;}}
}/****
******* 延时 x ms函数
*****/
void Delay_function(uint x)
{uint m,n;for(m=x;m>0;m--)for(n=110;n>0;n--);
}/****
*******按键函数
*****/
void Key_function(void)
{key_num = Chiclet_Keyboard_Scan(0);       //按键扫描if(key_num != 0)                                         //有按键按下{switch(key_num){case 1:                                                     //按键1,切换设置界面flag_display++;if(flag_display >= 5)flag_display = 0;lcd1602_clean();                             //清屏break;case 2:                                                       //按键2switch(flag_display){case 0:                                                           //界面0:切换手动模式控制温度flag_mode = 1;temp_ctrl++;flag_alarm_t = 0;break;case 1:                                                         //界面1:温度最大值+1if(temp_max < 99)temp_max++;break;case 2:                                                         //界面2:温度最小值+1if(temp_min < temp_max-1)temp_min++;break;case 3:                                                         //界面3:湿度最大值+1if(humi_max < 99)humi_max++;break;case 4:                                                         //界面4:湿度最小值+1if(humi_min < humi_max-1)humi_min++;break; default:break;}break;case 3:                                                       //按键3switch(flag_display){case 0:                                                           //界面0:切换手动模式控制湿度flag_mode = 1;humi_ctrl++;flag_alarm_h = 0;break;case 1:                                                         //界面1:温度最大值-1if(temp_max > temp_min+1)temp_max--;break;case 2:                                                           //界面2:温度最小值-1if(temp_min > 0)temp_min--;break;case 3:                                                         //界面3:湿度最大值-1if(humi_max > humi_min+1)humi_max--;break;case 4:                                                           //界面4:湿度最小值-1if(humi_min > 0)humi_min--;break;default:break;}break;case 4:                                                                    //切换自动模式if(flag_display == 0){flag_mode = 0;humi_ctrl = 0;temp_ctrl = 0;}break;default:break;}}
}/****
*******监测函数
*****/
void Monitor_function(void)
{if(time_num % 10 == 0)                               //100ms检测一次{Dht11_Get_Temp_Humi_Value(&temp_value,&humi_value); //获取温湿度if(time_num % 300 == 0)             //发送温湿度值、模式{sprintf(uart_buf,"\r\nTemp:%d.%dC\r\n",temp_value/10,temp_value%10);Uart_Sent_Str(uart_buf);sprintf(uart_buf,"Humi:%d.%d%%\r\n",humi_value/10,humi_value%10);Uart_Sent_Str(uart_buf);if(flag_mode == 0)Uart_Sent_Str("Mode:Auto\r\n");elseUart_Sent_Str("Mode:Manu\r\n");}}
}/****
*******显示函数
*****/
void Display_function(void)
{switch(flag_display)                                   //根据不同的显示模式标志位,显示不同的界面{case 0:                                                           //界面0:显示lcd1602_display_str(1,0,"Temp:");                              //显示温度lcd1602_display_temp(1,5,temp_value);lcd1602_display_str(2,0,"Humi:");                              //显示湿度lcd1602_display_humi(2,5,humi_value);if(flag_mode == 0)                              //显示当前模式lcd1602_display_str(2,12,"Auto");elselcd1602_display_str(2,12,"Manu");break;case 1:                                                            //界面1:显示设置温度最大值lcd1602_display_str(1,2,"Set Temp Max");if(time_num % 20 == 0){lcd1602_display_num(2,7,temp_max);}if(time_num % 40 == 0){lcd1602_display_str(2,7,"    ");}break;case 2:                                                           //界面2:显示设置温度最小值lcd1602_display_str(1,2,"Set Temp Min");if(time_num % 20 == 0){lcd1602_display_num(2,7,temp_min);}if(time_num % 40 == 0){lcd1602_display_str(2,7,"    ");}break;case 3:                                                                                       //界面3:显示设置湿度最大值lcd1602_display_str(1,2,"Set Humi Max");if(time_num % 20 == 0){lcd1602_display_num(2,7,humi_max);}if(time_num % 40 == 0){lcd1602_display_str(2,7,"    ");}break;case 4:                                                                                       //界面4:显示设置湿度最小值lcd1602_display_str(1,2,"Set Humi Min");if(time_num % 20 == 0){lcd1602_display_num(2,7,humi_min);}if(time_num % 40 == 0){lcd1602_display_str(2,7,"    ");}break;default:break;}
}/****
*******处理函数
*****/
void Manage_function(void)
{if(flag_display == 0)                                    //测量界面{if(flag_mode == 0)                  //如果处于自动模式{if(temp_value > temp_max*10)                                                 //温度大于设置最大值,制冷继电器闭合,开启报警{RELAY_ZL = 0;RELAY_JR = 1;flag_alarm_t = 1;}else if(temp_value < temp_min*10)                                          //温度小于设置最小值,加热继电器闭合,开启报警{RELAY_ZL = 1;RELAY_JR = 0;flag_alarm_t = 1;}else                                                                                                  //温度处于设置的上下限值之间,两个继电器断开,关闭报警{RELAY_ZL = 1;RELAY_JR = 1;flag_alarm_t = 0;}if(humi_value > humi_max*10)                                                   //湿度大于设置最大值,除湿继电器闭合{RELAY_CS = 0;RELAY_JS = 1;flag_alarm_h = 1;}else if(humi_value < humi_min*10)                                          //湿度小于设置最小值,加湿继电器闭合{RELAY_CS = 1;RELAY_JS = 0;flag_alarm_h = 1;}else                                                                                                  //湿度处于设置的上下限值之间,两个继电器断开{RELAY_CS = 1;RELAY_JS = 1;flag_alarm_h = 0;}}else                  //手动模式下,关闭声光报警、根据按键按下控制继电器{flag_alarm_h = 0;flag_alarm_t = 0;if(temp_ctrl == 1){RELAY_JR = 0;RELAY_ZL = 1;}else if(temp_ctrl == 2){RELAY_JR = 1;RELAY_ZL = 0;}else{temp_ctrl = 0;RELAY_JR = 1;RELAY_ZL = 1;}if(humi_ctrl == 1){RELAY_JS = 0;RELAY_CS = 1;}else if(humi_ctrl == 2){RELAY_JS = 1;RELAY_CS = 0;}else{humi_ctrl = 0;RELAY_JS = 1;RELAY_CS = 1;}}if(flag_alarm_h == 1 || flag_alarm_t == 1)            //温度或湿度过高或过低,声光报警{if(time_num % 40 == 0){LED = ~LED;BEEP = ~BEEP;}}else{LED = 1;BEEP = 1;}}else                                                                  //设置界面,关闭所有继电器及声光报警{LED = 1;BEEP = 1;RELAY_CS = 1;RELAY_JS = 1;RELAY_ZL = 1;RELAY_JR = 1;}
}

【单片机毕业设计】【mcuclub-hj-003】基于单片机的温湿度控制的设计相关推荐

  1. 【分享】基于单片机嵌入式的家用智能节水淋浴控制器的设计-基于单片机的电子贺卡控制系统设计-基于单片机的倒计时牌控制系统设计-基于单片机的彩灯控制器系统设计-多模式彩灯-单片机的八路路数字电压表控制设计

    1334基于单片机嵌入式的家用智能节水淋浴控制器的设计-全套毕设课设设计资料 三个ds18b20分别采集进水口热水  冷水 和温水的水温,然后分别显示出来,按下开始按键,系统初始化,自动设置出水温度为 ...

  2. 单片机声光电子琴程序流程图_基于单片机的智能家居控制系统毕业设计

    次毕业设计主要包括硬件端和软件端,硬件端功能如下: 使用 DS1302 模块产生时钟数据并实现时间和日历实时显示: 使用 DS18B20 模块检测周围环境温度并实时显示: 使用烟雾和光敏传感器模块对房 ...

  3. 【设计方案分享】基于单片机温度监测监控报警系统设计-基于单片机钞票自动智能识别系统设计-基于单片机乒乓球游戏机控制系统设计-基于单片机温度监测监控报警系统设计-基于单片机矩阵键盘的电子密码锁设计

    820基于单片机温度监测监控报警系统设计-设计资料 温度监测器功能描述: 1.主控芯片用的是51单片机(STC89C51). 2.使用温度传感器DS18b20采集温度. 3.用1602液晶显示显示温度 ...

  4. 基于单片机乒乓球游戏机控制系统设计-基于单片机矩阵键盘的电子密码锁设计-基于单片机温度监测监控报警系统设计-基于单片机钞票自动智能识别系统设计-设计资料【转发分享】

    819基于单片机乒乓球游戏机控制系统设计-设计资料下载 乒乓球游戏机设计任务为: (1)使用乒乓游戏机的甲乙双方各在不同的位置发球或击球. (2)乒乓球的位置和移动方向由灯亮及依次点燃的方向决定,球移 ...

  5. 基于单片机c语言的豆浆机,基于单片机的智能豆浆机控制系统设计(附实物图,电路原理图,程序)...

    基于单片机的智能豆浆机控制系统设计(附实物图,电路原理图,程序)(任务书,开题报告,中期检查表,毕业论文11800字) 摘要 由于市面上的豆浆机不具有长时间保温的功能,打浆完成后残渣很多,而且打浆用时 ...

  6. 【电路方案】基于单片机智能市电温度控制系统设计-基于单片机RGB颜色智能识别系统设计-基于单片机四路红外遥控开关电路设计-基于单片机自行车自动防盗报警系统设计-基于单片机智能无线病床呼叫系统设计

    822基于单片机智能无线病床呼叫系统设计-设计资料下载 硬件构成:单片机+最小系统+LCD1602液晶显示模块+无线收发模块+蜂鸣器模块+LED指示灯模块+按键模块 本设计基于STC89C51/52( ...

  7. 单片机蜂鸣器编程音乐_基于单片机的智能鱼缸温控系统设计

    曹益豪 聊城大学东昌学院机电工程系 山东 聊城 252000 摘  要:为满足热带鱼的饲养要求,设计了一种基于AT89C52单片机的小型智能温控鱼缸系统.该系统利用DS18B20传感器检测水温,并通过 ...

  8. 基于单片机步进电机ppt答辩_基于单片机的步进电机式汽车仪表的设计(含电路原理图,程序)...

    基于单片机的步进电机式汽车仪表的设计(含电路原理图,程序)(课题申报表,任务书,开题报告,中期检查表,外文翻译,论文21000字,程序,答辩PPT) 摘 要 汽车仪表是驾驶者和汽车的交互界面,为驾驶员 ...

  9. diy 单片机 自动浇花_基于单片机的自动浇花系统

    摘要 很多家庭都种植有令人赏心悦目的花卉,但是当主人外出几天时,为避免这些花卉处于无人浇水的境地,所以设计一种自动浇花器十分必要的.本系统采用51单片机STC12C5A60S2作为核心控制器,用土壤湿 ...

  10. 基于单片机的TLC稳压电源系统设计-基于单片机大脑运算能力智力测试仪-基于单片机超声波测距系统仿真设计(报告 PCB 原理图)-基于单片机超高精度电参数测试设计-基于单片机变电站变压器运行参数监测仿真

    1316基于单片机的TLC稳压电源系统设计-毕设课设仿真资料 三极管射极电压是稳压电源的输出电压,可以接用电器或负载,这个电压值通过TLC549(A/D,同TLC548)数据转换后,送往单片机处理并显 ...

最新文章

  1. 查询提升200倍,ClickHouse你值得拥有!
  2. 计算机辅助审计学心得,审计学心得体会2000字
  3. 利用mycat实现mysql数据库读写分离
  4. 一个C/S结构的优秀例子: 延迟补偿在C/S架构游戏协议设计和优化中的应用
  5. 2345联盟通过流氓软件推广挖矿工具, 众多用户电脑沦为“肉鸡”
  6. 常见面试题整理--Python概念篇
  7. CentOS通过 liveCD 进入救援模式-重装 grub 修复损坏的
  8. AcWing 4247. 糖果(差分约束最短路)
  9. Windows Mobile 6.1开发笔记
  10. 身份证(省市)编码表
  11. IPv4向IPv6转换的几种技术分析
  12. ps图片放大模糊怎么变清晰?
  13. java POST接口报错417
  14. 百度竞价软件测试面试,【百度SEM基础试题】百度推广竞价专员基础知识测试
  15. 算法策略 | MACD跨周期短线交易策略开发(股指+商品双版)
  16. SDR HDR 动态范围
  17. mbit职业测试软件,MBTI职业性格测试(自动计算版)-
  18. dockerfile以alpine为基础镜像构建nginx镜像
  19. 【机器学习】显卡、GPU、NVIDIA、CUDA、cuDNN
  20. 5年,你知道我这5年怎么过的吗?路过东方明珠的测试人,心死了

热门文章

  1. 51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码
  2. K.int_shape函数
  3. “国字号”高校,异地布局,即将开学!
  4. solidworks正版软件价格是多少呢?2020年获得solidworks正版软件报价的方法
  5. 单模光电转换器怎么接_光纤收发器怎么连接 光纤收发器连接方法【详解】
  6. 51单片机之按键(独立按键矩阵按键)
  7. 生日蛋糕烟花动画CSS3js特效
  8. pubwin2009三秒钟快速破解无需开卡登录
  9. 我眼中的 Nginx(一):Nginx 和位运算
  10. 42、【斯纳克图书馆管理系统】编目流程 [ 打印编号]