单片机课程设计——基于51单片机温湿度检测系统的设计与实现
本文主要介绍了怎么使用51单片机最小系统板和温湿度传感器制作一个温湿度检测系统。
本次设计主要涉及了温湿度的测量、显示以及实现简单控制。硬件方面有五个模块,即STC89C52单片机主控模块、传感器模块、LCD1602液晶显示模块、继电器模块以及阈值设置模块。整体框架如下图所示。
传感器模块使用的是DHT11数字温湿度传感器。通过DHT11检测出当前环境下的温湿度,将所测数据交给AT单片机进行分析和处理,并分别存入不同数组以便显示时候用。其中,为了显示稳定,本系统每间隔2s采集一次数据送入单片机。
本系统采用的是继电器驱动负载,因此无论温度还是湿度超出范围继电器均可以驱动负载工作,及时启用降温风扇以及抽湿风扇来有效的调整粮仓等应用场所内的温湿度。
硬件设计
该系统主要由五个大的模块构成,分别是主控模块、传感器模块、LCD液晶显示模块、继电器模块以及阈值设置模块。其中主控模块是此次毕业设计的核心模块,主要是指STC89C52芯片,它控制整个系统的运行,利用其各个口分别控制其他模块,使其他模块能够成为一个整体,实现功能的需要,从DHT11温湿度传感器中读入温度和湿度,在液晶屏上即时显示。液晶屏上同时显示温湿度上限值,该上限值保存外外部EEPROM存储器中,掉电不失,并且可以通过四只按键上调或下调。当温度或湿度值超过上限值时,报警信号点亮相应报警灯。该报警信号可以通过三极管驱动继电器,以控制外部风机或制冷器。
软件设计
软件流程图如下所示。
系统总体电路图如下所示:
主函数代码如下:(如果有需要在后面的网盘链接中下载完整程序)
1 #include <reg52.h> 2 #include "1602.h" 3 #include "dht.h" 4 #include "2402.h" 5 6 //¶¨ÒåÈý¸öLEDµÆ 7 sbit Led_qushi=P1^6; //ȥʪµÆ 8 sbit Led_jiangwen=P1^5; //½µÎ嵮 9 sbit Led_shengwen=P1^4; //ÉýÎ嵮 10 sbit Key_TH1 = P3^2; 11 sbit Key_TH2 = P3^3; 12 sbit Key_HH1 = P3^4; 13 sbit Key_HH2 = P3^5; 14 15 //¶¨Òå±êʶ 16 volatile bit FlagStartRH = 0; //¿ªÊ¼ÎÂʪ¶Èת»»±êÖ¾ 17 volatile bit FlagKeyPress = 0; //Óмü°´Ï 18 19 20 //¶¨ÒåÎÂʪ¶È´«¸ÐÆ÷ÓÃÍⲿ±äÁ¿ 21 extern U8 U8FLAG,k; 22 extern U8 U8count,U8temp; 23 extern U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata; 24 extern U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp; 25 extern U8 U8comdata; 26 extern U8 count, count_r; 27 28 U16 temp; 29 S16 temperature, humidity; 30 S16 idata TH, HH; //ζÈÉÏÏÞºÍʪ¶ÈÉÏÏÞ 31 char * pSave; 32 U8 keyvalue, keyTH1, keyTH2, keyHH1, keyHH2; 33 34 //¶¨Òå±äÁ¿ 35 U16 RHCounter; 36 37 38 //Êý¾Ý³õʼ»¯ 39 void Data_Init() 40 { 41 RHCounter = 0; 42 Led_qushi = 1; 43 Led_jiangwen = 1; 44 Led_shengwen = 1; 45 TH = 40; 46 HH = 85; 47 keyvalue = 0; 48 keyTH1 = 1; 49 keyTH2 = 1; 50 keyHH1 = 1; 51 keyHH2 = 1; 52 53 } 54 55 //¶¨Ê±Æ÷0³õʼ»¯ 56 void Timer0_Init() 57 { 58 ET0 = 1; //ÔÊÐí¶¨Ê±Æ÷0ÖÐ¶Ï 59 TMOD = 1; //¶¨Ê±Æ÷¹¤×÷·½Ê½Ñ¡Ôñ 60 TL0 = 0x06; 61 TH0 = 0xf8; //¶¨Ê±Æ÷¸³Óè³õÖµ 62 TR0 = 1; //Æô¶¯¶¨Ê±Æ÷ 63 } 64 65 //¶¨Ê±Æ÷0ÖÐ¶Ï 66 void Timer0_ISR (void) interrupt 1 using 0 67 { 68 TL0 = 0x06; 69 TH0 = 0xf8; //¶¨Ê±Æ÷¸³Óè³õÖµ 70 71 //ÿ2ÃëÖÓÆô¶¯Ò»´ÎÎÂʪ¶Èת»» 72 RHCounter ++; 73 if (RHCounter >= 1000) 74 { 75 FlagStartRH = 1; 76 RHCounter = 0; 77 } 78 } 79 80 //´æÈëÉ趨ֵ¡¢ 81 void Save_Setting() 82 { 83 pSave = (char *)&TH; //µØÖ·µÍλ¶ÔÓ¦µÍ8룬¸ßλ¶ÔÓ¦¸ß8λ 84 wrteeprom(0, *pSave); //´æζÈÉÏÏÞÖµTHµÍ8λ 85 DELAY(500); 86 pSave ++; 87 wrteeprom(1, *pSave); //´æζÈÉÏÏÞÖµTH¸ß8λ 88 DELAY(500); 89 pSave = (char *)&HH; 90 wrteeprom(2, *pSave); //´æʪ¶ÈÉÏÏÞÖµRHµÍ8λ 91 DELAY(500); 92 pSave ++; 93 wrteeprom(3, *pSave); //´æʪ¶ÈÉÏÏÞÖµRH¸ß8λ 94 DELAY(500); 95 } 96 97 //ÔØÈëÉ趨ֵ¡¢ 98 void Load_Setting() 99 { 100 pSave = (char *)&TH; 101 *pSave++ = rdeeprom(0); 102 *pSave = rdeeprom(1); 103 pSave = (char *)&HH; 104 *pSave++ = rdeeprom(2); 105 *pSave = rdeeprom(3); 106 if ((TH>99)||(TH<0)) TH = 40; 107 if ((HH>99)||(HH<0)) HH = 85; 108 } 109 110 void KeyProcess(uint num) 111 { 112 switch (num) 113 { 114 case 1: 115 if (TH<99) TH++; 116 L1602_char(1, 15, TH/10+48); 117 L1602_char(1, 16, TH%10+48); 118 break; 119 case 2: 120 if (TH>1) TH--; 121 L1602_char(1, 15, TH/10+48); 122 L1602_char(1, 16, TH%10+48); 123 break; 124 case 3: 125 if (HH<99) HH++; 126 L1602_char(2, 15, HH/10+48); 127 L1602_char(2, 16, HH%10+48); 128 break; 129 case 4: 130 if (HH>1) HH--; 131 L1602_char(2, 15, HH/10+48); 132 L1602_char(2, 16, HH%10+48); 133 break; 134 default: 135 break; 136 } 137 Save_Setting(); 138 } 139 140 /******************************************************************** 141 * Ãû³Æ : Main() 142 * ¹¦ÄÜ : Ö÷º¯Êý 143 ***********************************************************************/ 144 void main() 145 { 146 U16 i, j, testnum; 147 148 EA = 0; 149 150 Timer0_Init(); //¶¨Ê±Æ÷0³õʼ»¯ 151 152 Data_Init(); 153 EA = 1; 154 155 L1602_init(); 156 L1602_string(1,1," Welcome to T&H "); 157 L1602_string(2,1," Control System! "); 158 //ÑÓʱ 159 for (i=0;i<500;i++) 160 for (j=0;j<1000;j++) 161 {;} 162 //ÇåÆÁ 163 L1602_string(1,1," "); 164 L1602_string(2,1," "); 165 L1602_string(1,1,"Tem: C TH:"); 166 L1602_string(2,1,"Hum: % HH:"); 167 168 //ÔØÈëζÈÉÏÏÞºÍʪ¶ÈÉÏÏÞÉ趨ֵ 169 Load_Setting(); 170 L1602_char(1, 15, TH/10+48); 171 L1602_char(1, 16, TH%10+48); 172 L1602_char(2, 15, HH/10+48); 173 L1602_char(2, 16, HH%10+48); 174 175 176 while(1) 177 { 178 //ÎÂʪ¶Èת»»±êÖ¾¼ì²é 179 if (FlagStartRH == 1) 180 { 181 TR0 = 0; 182 testnum = RH(); 183 FlagStartRH = 0; 184 TR0 = 1; 185 //¶Á³öÎÂʪ¶È£¬Ö»È¡ÕûÊý²¿·Ö 186 humidity = U8RH_data_H; 187 temperature = U8T_data_H; 188 //ÏÔʾÎÂʪ¶È 189 L1602_int(1,5,temperature); 190 L1602_int(2,5,humidity); 191 } 192 //ÎÂʪ¶È¿ØÖÆ 193 if (temperature > TH) Led_jiangwen = 0; 194 else Led_jiangwen = 1; //½µÎ 195 if (humidity > HH) Led_qushi = 0; 196 else Led_qushi = 1; //ȥʪ 197 198 //¼üÅ̲éѯ£¬ÔÚµ¯ÆðʱÏìÓ¦ 199 if ((Key_TH1)&&(keyTH1==0)) {FlagKeyPress = 1; keyvalue = 1;} 200 else if ((Key_TH2)&&(keyTH2==0)) {FlagKeyPress = 1; keyvalue = 2;} 201 else if ((Key_HH1)&&(keyHH1==0)) {FlagKeyPress = 1; keyvalue = 3;} 202 else if ((Key_HH2)&&(keyHH2==0)) {FlagKeyPress = 1; keyvalue = 4;} 203 if (FlagKeyPress == 1) 204 { 205 KeyProcess(keyvalue); 206 FlagKeyPress = 0; 207 } 208 if (!Key_TH1) keyTH1 = 0; 209 else keyTH1 = 1; 210 if (!Key_TH2) keyTH2 = 0; 211 else keyTH2 = 1; 212 if (!Key_HH1) keyHH1 = 0; 213 else keyHH1 = 1; 214 if (!Key_HH2) keyHH2 = 0; 215 else keyHH2 = 1; 216 } 217 }
View Code
最有如果有小伙伴需要的话,可以在网盘链接中下载,提取码yu30。
转载于:https://www.cnblogs.com/wenzhixin/p/10798748.html
单片机课程设计——基于51单片机温湿度检测系统的设计与实现相关推荐
- 单片机数字定时闹钟设计c语言,电子设计 基于51单片机的定时闹钟设计.doc
电子设计 基于51单片机的定时闹钟设计 课件之家精心整理资料--欢迎你的欣赏 课件之家精心整理资料--欢迎你的欣赏 摘 要 单片计体积小.能耗低.成本低.功能强,广泛应用于智能产品和工业自动化上.本次 ...
- 51单片机五层电梯控制器 基于51单片机的五层电梯控制系统
51单片机五层电梯控制器 基于51单片机的五层电梯控制系统 包括源代码和proteus仿真 系统硬件由51单片机最小系统.蜂鸣器电路.指示灯电路.内部按键电路.外部按键电路.直流电机.内部显示电路.外 ...
- 基于电容传感器的压力检测系统的设计
基于电容传感器的压力检测系统的设计 本系统以电容式传感器为压力感应元件,将压力信号转换为相应的电信号,经ADC0809模数转化芯片将电信号转化为数学信号再经单片机在输出端显示电感式传感器所受到的压力值 ...
- 实物设计|基于51单片机的温湿度检测报警系统
目录 具体实现功能: 设计介绍 51单片机简介 设计方案 资料内容 原理图和PCB(AD19) 仿真实现(protues8.7) 程序(Keil5) 全部资料(压缩文件) 具体实现功能: 由STC89 ...
- 基于51单片机的光照强度检测c语言程序,智能仪器课程设计-基于51单片机的光照强度检测报告.doc...
该设计论文已经通过各大高校老师审核认可并通过答辩,.欢迎大家下载学习交流.如有疑问可随时联系店主,竭诚为您解答!! 课程设计报告 课程名称: 智能仪器课程设计 题 目: 基于51单片机的光照强度 摘要 ...
- 单片机四路抢答器课程C语言设计,基于51单片机四路抢答器设计
内容简介: 毕业设计 基于51单片机四路抢答器设计 共25页,9905字 随着经济水平的不断提高,人们在物质文明得到满足的同时更注重精神文明的追求,各种娱乐节目不断涌现,提高节目的质量尤为重要..本次 ...
- 51单片机八位抢答器c语言设计,基于51单片机八路抢答器的设计
基于51单片机八路抢答器的设计 毕业设计(论文)题 目:基于 51 单片机八路抢答器的设计 系 部: 专 业: 学 号: 学生姓名: 指导教师姓名: 指导教师职称: 2013 年 xx 月 xx 日X ...
- 基于微型计算机系统的实时时钟设计,基于51单片机的实时时钟设计报告.doc
基于51单片机的实时时钟设计报告 PAGE PAGE 24 课程设计(论文)任务书 信息工程 学 院 信息工程 专 业 (2) 班 一.课程设计(论文)题目 嵌入式课程设计 二.课程设计(论文)工作自 ...
- 51单片机计算器_基于51单片机的倒计时温度检测报警器
基于51单片机的倒计时温度检测报警器 学习单片机断断续续半年了,在学长学姐的教学帮助下,完成了51单片机的入门学习,开始实践做项目,在一周时间内设计和制作出个人项目.起初,我设计和选择的是12864显 ...
最新文章
- 数据结构树的基本操作_《数据结构》树的基本操作.doc
- 初学者学python好还是c-入门是不是应该选择C而不是直接学Python?
- 16. Leetcode 845. 数组中的最长山脉 (数组-同向双指针-快慢指针)
- 安装 | MatlabR2021bMac链接及Matlabx运行图基本运行代码与图像
- 读书笔记2014年第1本:《赤裸裸的统计学》
- LA 2402 (枚举) Fishnet
- 整合百度UEditor上传图片到阿里云OSS
- Unix 下的 vim 如何使用系统剪贴板
- Windows监听进程的两个函数
- 一元三次方程重根判别式_一元四次方程的常规解法
- 搜集70个国外搜索引擎网站,供大家学习参考
- 设置android模拟器屏幕自动旋转
- 关于 SQL Server Reporting Services 匿名登录的解决方案
- C++刷题知识点总结2
- JS生成随机颜色(rgb)
- 关于网易云验证码的服务介绍
- 企业数字化转型思考系列文章(一)何为数字化转型?
- 《Google软件工程》读书笔记
- BTree和B+Tree区别
- css:图片显示太大怎么办?