资源描述
计 控 学 院
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所表示。
湿度传感器
温度传感器
单片机
蜂鸣器
LCD显示
图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所表示。
图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所表示:
1602初始化
延时
读取温湿度值
读取成功
1602显示数据
报警,发出信号
是否超限
Y
延时
N
图 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..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) ;
}
}
展开阅读全文