基于单片机的温湿度检测系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计控学院
College of computer and control engineering
Qiqihar university
电气工程课程设计报告题目:寝室温湿度检测装置的设计
系别电气工程系
适用班级电气12级
指导教师
时间
学生姓名
提交日期
摘要
随着人们生活水平的提高,人们对健康提出了更高的要求,空气中的湿度通过各种直接或间接途径影响了我们的舒适感,空气中的湿度过大或过小都会对人体健康不利。
在日常生活中,温湿度监控系统应用很广泛,例如:机房、档案馆、材料加工场等场所,乃至我们的寝室,温湿度与健康密切关联,都必须控制环境的温度和相对湿度,使其保持在一定的范围。
使用DHT11可以灵活的检测环境的温湿度,由用户设定一定的阈值,实时监测显示,并且可以根据用户要求设定报警装置,当温湿度超过一定的范围时,立即报警。
基于此,我设计了一款用51单片机控制的温湿度监控系统,操作简单,使用方便。
关键词:温湿度; 51单片机; DHDT11
目录
摘要 (I)
第1章绪论 (1)
1.1 本论文的背景和意义 (1)
1.2 本论文的基本内容 (1)
1.3 方案设计 (1)
1.3.1 温湿度监控系统满足的基本要求 (1)
1.3.2 系统功能原理图 (2)
第2章硬件设计 (3)
2.1 电路原理图 (3)
2.2 电路原理图介绍 (3)
2.3 蜂鸣器电路部分说明 (4)
2.4 晶振电路部分说明 (4)
2.5 1602模块电路说明 (4)
2.6 湿度传感器DHT11介绍 (5)
2.7 技术参数说明 (6)
第3章软件设计 (7)
3.1 软件设置实现的功能 (7)
3.2 软件流程图 (7)
第4章实验板测试 (8)
结论 (9)
参考文献 (10)
附录 (11)
第1章绪论
1.1 本论文的背景和意义
室内温湿监控系统的设计是一个对现实生活非常实用,本课题研究的主要内容是设计制作对室内温湿度的监督与控制,相当于简易空调的制作,了解空调系统,运用原理设计制作方案;运用物理知识制作控制温湿变化设备;传感器获取外界温湿度参数,51单片机编程控制,实现智能化设计;并用仿真软件对控制效果进行仿真研究。
随着科技的飞速发展和普及,高性能设备越来越多,各行各业对温湿度的要求也越来越高。
传统的温湿度监测模式是以人为基础,依靠人工轮流值班,人工巡回查看等方式来测量和记录环境状况信息。
在这种模式下,不仅效率低下不利于人才资源的充分利用,而且缺乏科学性,许多重大事故都是由人为因素造成的,人工维护缺乏完整的管理系统。
而问世监控系统就可以解决这样人才资源浪费,管理不及时的问题,这是由于它的智能化设计所决定的。
它的工作步骤如下:感应环境温湿度;单片机判断感应到的温湿度是否异常;若感应到的温湿度异常,实行措施进行调节;判断异常是否超过预设时间,若超过预设时间,则输出异常信号报警;判断异常是否处理完毕,若处理完毕,解除报警。
这样就可以利用控制器对机房温湿度进行监控,从而实现环境温湿度管理的实时性和有效性。
故本次设计对于类似项目还具有普遍意义。
1.2 本论文的基本内容
本设计完成的是温室的温湿度监测系统,利用单片机设一个温湿度检测系统,对给定的温湿度进行测试并实时显示,并怕不断当时的温度或湿度是否在规定的范围内,若不是,测启动报警系统。
1.3 方案设计
1.3.1 温湿度监控系统满足的基本要求
a.温度检测范围0-50度,相对湿度20%-90%;
b.可以根据实际用途设定温湿度报警值;
c.监测数据可以通过模块显示;
1.3.2 系统功能原理图
根据设计要求确定了系统的总体方案,整个方案由单片机、湿温度传感器、显示模块、报警器等五部分组成。
系统功能原理图如图1所示。
图1-1 系统功能原理图
第2章 硬件设计
2.1 电路原理图
单片机是整个系统的控制中枢,它指挥外围器件协调工作,从而完成特定功能。
硬件实现上采用模块化设计,每个模块只实现一个功能,最好将各个模块连接在一起。
这种设计比较简单的就可以实现,电路原理图如图2-1所示:
.
.
..
图2-1 电路原理图
2.2 电路原理图介绍
本系统主要硬件有电源电路、温湿度传感器、蜂鸣器、晶振电路、复位电路、LCD 显示电路、且控制电路的核心器件是由STC 红晶科技公司生产的STC11F04E 单片机,属于MCS-51列,STC11F04E 是一种低功耗、高性能的CMOS8位微控制器,具有8K 在系统可编程FLASH 存储器;相比传统的51系列速度更快,且在本设计中充
分利用了该单片机的资源不浪费I/O口。
片上Flash允许程序存储器在线编程。
这些优点使得STC11F04E为众多嵌入式控制应用系统提供高灵活、超有效的解决方案,价格低廉,性能可靠,抗干扰强,因此广泛应用在工业控制和嵌入式中。
系统的蜂鸣器电路、晶振电路、复位电路如图2-1、图2-2 、图2-3所示:
图2-2 蜂鸣器电路图2-3 晶振电路图2-4复位电路
2.3 蜂鸣器电路部分说明
蜂鸣器额定电流小于30mA,其中使用三极管驱动工作,为了减少功耗本实验采用9012晶体管。
2.4 晶振电路部分说明
晶振电路采用11.095MHz的无源晶振,微调电容大小取30PF。
2.5 1602模块电路说明
显示模块选用1602字符型液晶模块,是目前应用比较广泛的液晶屏之一,电路如图2-5所示。
.
16PIN.
图2-5 1602液晶显示电路
2.6 湿度传感器DHT11介绍
DHT11数字温湿度传感器是一款含有已校准熟悉信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。
传感器包括一个电阻式感湿元件和一个NTC 测温元件,并与一个高性能8位单片机相连接。
因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。
每个DHT11传感器都在即为精确的湿度校验室中进行校准。
校准系数以程序的形式存在OTP内存中,传感器内部在检测型号的处理过程中要调用这些校准系数。
单线制串行接口,使系统集成变得简易快捷。
超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为给类应用甚至最为苛刻的应用场合的最佳选择。
产品为4针单排引脚封装,连接方便。
DHT11应用电路如图2-6:
图2-6 DHT11应用电路
2.7 技术参数说明
a.供电电压: 3.3~5.5V DC;
b.输出:单总线数字信号;
c.测量范围:湿度20-90%RH,温度0~50℃;
d.测量精度:湿度+-5%RH,温度+-2℃;
e.分辨率:湿度1%RH,温度1℃;
f.互换性:可完全互换;
g.长期稳定性:<±1%RH/年;
第3章软件设计
3.1 软件设置实现的功能
系统单片机代码采用C语言编写,以Kei uVision4为开发环境。
系统软件实现的功能:
a.通过LCD显示温湿度值;
b.比较检测到的温湿度值和报警值,发现超限蜂鸣器立即报警;
3.2 软件流程图
根据这些功能,系统软件流程图如图3-1所示:
图 3-1 系统软件流程图
第4章实验板测试
通过测试实验板,已基本达到预定目的,测评如下:
1. 预先设置温度阈值是30摄氏度,湿度阈值是30%TH;
2. 温度测试:通电后,温度显示室内值,用手捂住DHT11,使显示器达到30,此时蜂鸣器立即报警;
3. 湿度测试:紧接着温度测试,用嘴吹气增加DHT11的湿度,使其达到阈值30,蜂鸣器立即报警;
通过测试,实验板基本完成预定的目标,即完成了温湿度的检测,且能在设定的阈值范围内报警,达到了预期的效果。
结论
由于采用的是高效单片机作为核心,DHT11可以灵活的检测环境的温湿度,由用户设定一定的阈值,实时监测显示;此温湿度控制仪具有精度高、成本低、体积小、接口简单等优点,还具有良好抗干扰能力。
加上优化程序,使得本系统具有很高的实用性。
单片机的应用如今已经在工业、电子等方方面面展示出了它的优越性,利用单片机在设计电路逐渐成了趋势,它与外围的简单电路再加上优化程序就可以构建任意的产品,使得本设计成为现实。
随着单片机的日益发展,它必将在未来显示出更大的活力,为电子设计增加更多精彩。
在设计过程中,由于时间和本人能力的限制,设计中存在一些需要改进和优化的地方。
测量精度有待进一步提高,软件设计也存在不合理之处。
但从设计过程中,对于单片机有更进一步的认识,对用于单片机仿真的软件操作能力也明显提高,也对温湿度检测系统有了更深刻的理解,对protel99se和Altium designer 仿真软件有了更明确的认识,通过此设计,对在实验板在制作过程中出现的各种问题的解答提高了自己的思考能力和动力能力。
端正了做事的心态,不能有半点马虎,细节决定成败,做事应该滴水不漏,认认真真,踏踏实实,对以后的日常生活和工作都受益匪浅。
参考文献
[1] 谢自美. 电子线路设计*实验*测试[M].华中科技大学出版社.
[2] 张友德等. 单片微型机原理、应用和实验[M].电子工业出版社.
[3] 吴经国等.单片机应用技术[M]. 中国电力出版社.
[4] 李群芳.单片机微型计算机与接口技术[M].电子工业出版社.
[5] 闫石.数字电子技术基础[M].高等教育出版社.
[6] 黄智伟.全国大学生电子设计竞赛训练教程[M].电子工业出版社.
[7] 周立功.单片机实验与实践[M].北京航空航天大学出版社.
[8] XU Yi - min .The Design for Stepping Motor of SCM Control System[J]. Heilongjiang Science and Technology Institute.2005.1
附录
附录1
程序源代码
/********************************************************************** *********/
//DHT11温湿度测试程序
//P0作为LCD的数据控制口,P2.0 作为DHT11data总线,P2.1作为状态显示//用三根杜邦线连到开发板
/********************************************************************** **********/
#include <reg52.h>
#include <intrins.h>
typedef unsigned char unint8;
typedef unsigned char unint16;
unsigned char str1[]={" "};
unsigned char str2[]={" "};
unsigned char code dis1[] = {"2-# H: "};
unsigned char code dis2[] = {"618 T: "};
sbit TRH = P3^7;//温湿度传感器DHT11数据接入
sbit ST = P3^1;//状态显示,是为了方便调试,具体使用的时候可以不要
sbit SF = P3^2;
sbit LCD_RS = P3^3;
sbit LCD_RW = P3^4;
sbit LCD_EN = P3^5;
unint8 TH_data,TL_data,RH_data,RL_data,CK_data;
unint8 TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;
unint8 com_data,untemp,temp;
unint8 respond;
/********************************************************************** ***********/
void delayNOP()
{
_NOP_();
_NOP_();
_NOP_();
_NOP_();
_NOP_();
_NOP_();
_NOP_();
_NOP_();
_NOP_();
_NOP_();
_NOP_();
_NOP_();
}
/********************************************************************** ***********/
/********************************************************************** ***********/
// 毫秒级延时子程序
/********************************************************************** ***********/
void delay_ms(unsigned char ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i< 150; i++)
{
_NOP_();
_NOP_();
_NOP_();
_NOP_();_NOP_();
_NOP_();
_NOP_();
_NOP_();
}
}
}
/********************************************************************** ***********/
/********************************************************************** ***********/
//5us级延时程序
/********************************************************************** ***********/
void delay_us()
{
unint8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
/********************************************************************** **********/
/********************************************************************** **********/
// 测试LCD忙碌状态
//lcd_busy()为1时,忙,等待。
lcd_busy()为0时,闲,可写指令与数据。
/********************************************************************** **********/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P1&0x80);
LCD_EN = 0;
return(result);
}
/********************************************************************** *********/
/********************************************************************** *********/
// 写入指令数据到LCD
/********************************************************************** *********/
void lcd_wcmd(unsigned char cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_NOP_();
_NOP_();
P1 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/********************************************************************** *******/
/********************************************************************** *******/
//写显示数据到LCD
//RS=高电平,RW=低电平,E=高脉冲,D0-D7=数据。
/********************************************************************** *******/
void lcd_wdata(unsigned char dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P1 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/********************************************************************** ******/
/********************************************************************** ******/
//LCD初始化设定
/********************************************************************** ******/
void lcd_init()
{
delay_ms(15);
lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
delay_ms(5);
lcd_wcmd(0x38);
delay_ms(5);
lcd_wcmd(0x38);
delay_ms(5);
lcd_wcmd(0x0c); //显示开,关光标
delay_ms(5);
lcd_wcmd(0x06); //移动光标
delay_ms(5);
//lcd_wcmd(0x01); //清除LCD的显示内容,如果屏幕过暗,可将这俩句删除
//delay_ms(5);
}
/********************************************************************** ******/
/********************************************************************** ******/
//设定LCD显示位置
/********************************************************************** ******/
void lcd_dis_pos(unsigned char pos)
{
lcd_wcmd(pos | 0x80); //数据指针=80+地址变量
}
/********************************************************************** ******/
/********************************************************************** ******/
//收发信号检测,数据读取
/********************************************************************** ******/
char receive()
{
unint8 i;
ST=0;
com_data=0;
for(i=0;i<=7;i++)
{
respond=2;
while((!TRH)&&respond++);
delay_us();
delay_us();
delay_us();
delay_us();
delay_us();
delay_us();
delay_us();
delay_us();
delay_us();
if(TRH)
{
temp=1;
respond=2;
while((TRH)&&respond++);
}
else
temp=0;
com_data<<=1;
com_data|=temp;
}
return(com_data);
}
/********************************************************************** ******/
/********************************************************************** ******/
//湿度读取子程序
//温度高8位== TL_data
//温度低8位== TH_data
//湿度高8位== RH_data
//湿度低8位== RH_data
//校验 8位 == CK_data
//调用的程序有 delay();, Delay_5us();,RECEIVE();
/********************************************************************** *****/
void read_TRH()
{
//主机拉低18ms
TRH=0;
delay_ms(36);
TRH=1;
//DATA总线由上拉电阻拉高主机延时20us
delay_us();
delay_us();
delay_us();
delay_us();
delay_us();
delay_us();
delay_us();
//delay_us();
//delay_us();delay_us();delay_us();delay_us();
//主机设为输入判断从机响应信号
TRH=1;
//判断DHT11是否有低电平响应信号如不响应则跳出,响应则向下运行
if(!TRH)
{
respond=2;
//判断DHT11发出 80us 的低电平响应信号是否结束
while((!TRH)&& respond++);
respond=2;
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
while(TRH && respond++);
//数据接收状态
RH_temp = receive();
RL_temp = receive();
TH_temp = receive();
TL_temp = receive();
CK_temp = receive();
TRH=1;ST=1;
//数据校验
untemp=(RH_temp+RL_temp+TH_temp+TL_temp);
if(untemp==CK_temp)
{
RH_data = RH_temp;
RL_data = RL_temp;
TH_data = TH_temp;
TL_data = TL_temp;
CK_data = CK_temp;
}
}
//湿度整数部分
if(((RH_data/10>2||TH_data/10>2))||((TH_data%10<5&&TH_data/10<2))) {
SF=0;
delay_ms(50);
SF=1;
}
else
SF=1;
str1[0] = (char)(0X30+RH_data/10);
str1[1] = (char)(0X30+RH_data%10);
str1[2] = 0x2e; //小数点
//湿度小数部分
str1[3] = (char)(0X30+RL_data/10);
str1[5] = 0X25; //"%"
str1[6] = 0X52; //"R"
str1[7] = 0X48; //"H"
//温度整数部分
str2[0] = (char)(0X30+TH_data/10);
str2[1] = (char)(0X30+TH_data%10);
str2[2] = 0x2e; //小数点
//温度小数部分
str2[3] = (char)(0X30+TL_data/10);
str2[5] = 0XDF; //"'"
str2[6] = 0X43; //"C"
}
/********************************************************************** ******/
//主函数
//TH,TL,RH,RL分别代表温湿度的整数和小数部分
/********************************************************************** ******/
void main()
{
unsigned char i,n=0x40,m;
lcd_init();
delay_us();
while(1)
{
read_TRH();
//写字符
for(i=0;i<=7;i++)
{ delay_ms(5) ;
lcd_dis_pos(i); //显示字符
delay_ms(5) ;
lcd_wdata(dis1[i]);
delay_ms(5) ;
lcd_dis_pos(n+i); //显示字符
delay_ms(5) ;
lcd_wdata(dis2[i]);
}
//写湿度数据
m=0x08;
for(i=0;i<=7;i++)
{
lcd_dis_pos(m);
delay_ms(5) ;
lcd_wdata(str1[i]);
delay_ms(5) ;
m++;
}
//写温度数据
m=0x48;
for(i=0;i<=7;i++)
{
lcd_dis_pos(m);
delay_ms(5) ;
lcd_wdata(str2[i]);
delay_ms(5) ;
m++;
}
//延时
delay_ms(1000) ;
}
}。