基于51单片机的温湿度测量仪课程设计学士学位论文.docx
《基于51单片机的温湿度测量仪课程设计学士学位论文.docx》由会员分享,可在线阅读,更多相关《基于51单片机的温湿度测量仪课程设计学士学位论文.docx(38页珍藏版)》请在冰豆网上搜索。
基于51单片机的温湿度测量仪课程设计学士学位论文
重庆邮电大学
单片机应用课程设计
2013-2014
(1)
课设题目:
基于单片机的简易温湿度测量仪
指导教师:
黄老师
序号
姓名
班级
学号
性别
工作量(%)
分数
1
夏恒发
0121101
2011210050
男
20
2
文翻
0121101
2011210009
女
20
3
罗春雪
0121101
2011210010
女
15
4
王琎
0121101
2011210043
男
15
5
刘艺
0121101
2011210069
女
15
6
李怡佳
0121101
2011210072
女
15
目录
第1章摘要………………………………………………………1
第2章设计任务分析及方案论证………………………………1
2.1设计要求……………………………………………1
2.2设计方案及其论证…………………………………1
2.3器件选定……………………………………………2
2.4AT89C51单片机……………………………………4
2.5显示部分……………………………………………5
第3章电路与程序设计…………………………………………6
3.1主控制电路和测温时控制电路……………………6
3.2主要模块的电路……………………………………7
3.2.1温湿度采集模块………………………………7
3.2.2报警模块………………………………………7
3.2.3显示模块………………………………………8
第4章测试方案与测试结果……………………………………10
4.1测试方案及测试条件……………………………10
4.2测试结果及其完整性………………………………10
4.3测试结果分析………………………………………10
结论………………………………………………………………11
心得体会…………………………………………………………12
参考文献…………………………………………………………12
附录………………………………………………………………13
摘要
本次设计是采用MSC-51系列单片机中的AT89C51和DHT11构成的低成本的温湿度的检测控制系统。
单片机AT89C51是一款低消耗、高性能的CMOS8位单片机,由于它强大的功能和低价位,因此在很多领域都是用它。
DHT11温湿度传感器是一款含有已校准数字输出的温湿度复合传感器,传感器包括一个电阻式感湿原件和一个NTC测温元件,该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。
设计主要包括硬件电路的设计和系统软件的设计。
硬件电路主要包括单片机、温湿度传感器、显示模块、报警器以及控制设备等5部分。
其中由DHT11温湿度传感器及1602字符型液晶模块构成系统显示模块;测温湿度控制电路由温湿度传感器和预设温度值比较报警电路组成;用户根据需要预先输入预设值,当实际测量的温湿度不符合预设的温湿度标准时,发出报警信号(蜂鸣器蜂鸣),启动相应控制。
关键词:
AT89C51;DHT11;温湿度传感器
第2章设计任务分析及方案论证
2.1设计要求
以MCS_51系列单片机AT89C51学习板作为本次实验的核心器件,外接报警电路,温湿度采集电路,组成一个温湿度采集报警系统。
基本要求温湿度采集使用DHT11芯片,报警电路用有源蜂鸣器作为报警器件;测量空气温湿度;通过数码管显示温度和湿度,显示位数精确到个位,要求观察时无闪烁;设置温度和湿度的上下限,通过蜂鸣器报警;将温度和湿度单位显示在数据后面,温度C或F、湿度%RH。
提升部分:
采用液晶显示,声音告警、闪烁显示告警项、按键设定上下限值,单位转换。
2.2设计方案及其论证
本设计要实现的功能是:
实时显示当前环境的温湿度,并且允许用户设定温湿度阀值,当环境温湿度超过或低于标准值时,系统会以蜂鸣器鸣响的方式进行报警提示。
用于用户设定温湿度准确值,1602用于数据显示,蜂鸣器用于提示用户。
按照系统的设计功能所要求的,温湿度监控系统原理图如下图2.2.1所示:
图2-2-1温湿度监控系统原理图
方案1:
利用DHT11与单片机上的数码管一起用来显示室内温湿度。
然后对当前的温湿度进行判断是否超出阈值。
若超出阈值,通过三极管放大作用使蜂鸣器报警。
方案2:
利用DHT11采集温湿度,然后传入单片机,通过扩展槽连接到LCD1602上,使用LCD1602显示温湿度,然后在温湿度后面显示阈值。
若温度或湿度超出阈值,通过三极管使蜂鸣器报警。
方案3:
利用DHT11采集温湿度,将数据传入单片机,通过扩展槽连接到LCD1602,并一起使用数码管显示温湿度。
阈值的显示在LCD1602上显示。
若温度或湿度超出阈值,通过三极管产生三种不同频率,使蜂鸣器发出不同的报警声音。
2.3器件选定
2.3.1测量部分:
温湿度传感器
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的温湿度传感和数字模块采集技术,具有很高的稳定性和可靠性,DHT11传感器内含一个NTC测温和一个电阻式感湿元件,并与一个8位的高性能单片机相连接,在精确的湿度校验室中DHT11传感器进行过校准,以程序的形式校准系数储存在0TP内存中,检测信号的时候,在处理过程中传感器内部要调用这些校准系数,采用单线制的串行接口,使系统集成可以有较低的功耗,而且更加简单快速,信号传输距离超过20米,作为一个数字温湿度传感器DHT11具有响应快速、抗干扰强、性价比高等优点,它的性能指标如下:
湿度测量范围为20%~90%RH;湿度测量精度为±5%RH;温度测量范围为0~50℃,温度测量精度为±2℃,工作电压3.0~5.5V,相应时间<5S,DHT1l采用4针单排引脚封装,传感器通电后,需要等待1s,这是因为要越过不稳定的状态,在此期间不需发送指令,电源引脚(VDD,GND)之间可增加一个100nF的电容,用以去耦滤波。
图2-3-1典型的应用电路
图2-3-1DHT11实物图
(1)DHT11温湿度传感器产品参数:
相对湿度
分辨率:
16Bit
重复性:
±1%RH
精度:
25°C±5%RH
迟滞:
<±0.3%RH
长期稳定性:
<±0.5%RH/yr
温度
分辨率:
16Bit
重复性:
±0.2°C
量程范围:
25°C±2°C
电气特征
供电:
DC3.5-5.5V
供电电流:
测量0.3mA待机60μA
采样周期:
次大于2秒
引脚说明
(1)VDD供电3.5-5.5V
(2)DATA串行数据,单总线
(3)NC空脚
(4)GND接地,电源负极
2.3.2串行接口(单线双向)
DATA用于微处理器与DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零.操作流程如下:
一次完整的数据传输为40bit,高位先出。
数据格式:
8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验和。
数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。
DHT11发送响应信号的时候总线为低电平,DHT11把总线拉高80us之前,必须等到响应信号发送,准备发送数据时,每一bit数据都以50us低电平时隙开始,数据位是0或1是由高电平的长或短来决定。
假如响应信号的读取为高电平,但是DHT11无响应响应,这时候说明路线可能连接不正常,当最后一bit数据传送结束后,DHT11把总线拉低50us,接着总线由上拉电阻拉高进入空闲状态。
2.3.3引脚说明
表2.3.5DHT11引脚说明
Pin
名称
注释
1
VDD
供电3-5.5V
2
DATA
串行数据,单总线
3
NC
空脚,悬空
4
GND
接地,电源负极
2.3.7封装信息
图2-3-6DHT11的封装信息:
2.4单片机资料简介
AT89C51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含4kbytes的可反复擦写的只读程序存储器(PEROM)和128bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大AT89C51单片机可为您提供许多高性价比的应用场合,可灵活应用于各种控制领域。
2.5显示部分:
LCD
显示部分是LCD1602液晶显示,
图2-8正常工作LCD1602显示
2.5.1引脚功能说明
1602液晶模块的读写操作,屏幕和光标的操作都是通过指令编程来实现的。
表2-8-3引脚接口说明表
LCD1602采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明
符号
引脚说明
1
VSS
地
2
VDD
正极
3
VL
液晶显示偏压
4
RS
寄存器选择
5
R/W
读/写选择
6
EN
使能信号
7
D0
数据
8
D1
数据
9
D2
数据
10
D3
数据
11
D4
数据
12
D5
数据
13
D6
数据
14
D7
数据
15
BLA
背光源正极
16
BLK
背光源负极
图2-8-3LCD1602的管脚图
图2-8-31602字符型液晶显示器实物图
第3章电路与程序设计
单片机是整个系统的控制中枢,它指挥外围器件协调工作,从而完成特定的功能,硬件实现上采用模块化设计,每一模块只实现一个特定功能,最后再将各个模块搭接在一起,这种设计方法可以降低系统设计的复杂性,本系统主要硬件设计包括电源电路、蜂鸣器电路、晶振电路,LCD显示电路以及温湿度传感器电路。
3.1主控制电路和测温时控制电路
本次硬件的核心就是AT89C511,其他的外围电路都是围绕它所设计的。
数字温湿度传感器的DHT11的DATA口连接单片机AT89C51的P1.7口。
显示电路就是把LCD1602和单片机的P2口分别相连,当温度或湿度高于预设值的时候蜂鸣器蜂鸣报警,代表控制系统的指示灯闪烁。
3.2主要模块的电路
3.2.1系统的蜂鸣器电路
图3-2-1蜂鸣器电路
报警电路流程图
voidwarning()//报警函数
{
uchari;
HXD=1;//蜂鸣器不报警
if((RHH||RHL)&&(HT||LT))
{
for(i=0;i<5;i++)
{
HXD=0;Delay(2000);
HXD=1;Delay(2000);
HXD=0;Delay(2000);
HXD=1;//温湿度都超标时,频率1报警
}}
报警模块子程序
3.2.2传感器电路
DHT11是数字型温湿度传感器,可直接以数字方式传输所采集的当前环境温湿度,DHT11采用的是单总线通信,因此只需将单片机的一个I/O端口与DHT11的通信接口连接就可以实现数据的采集和传送,相对于其他电路来说比较简单。
如图3.4所示:
图3-2-5传感器电路
3.2.3显示电路
显示模块选用1602字符型液晶模块,它是目前工控系统中使用最广泛的液晶屏之一,由于它显示的质量高,电路图如图3.4所示,1602字符型液晶模块是点阵型液晶,驱动方便,经过编程后显示内容多样化。
图3-2-4显示电路
数码管显示流程图
LCD显示流程图
voiddisplay()//数码管显示函数
{
uintj=0;
P0=0XFF;Digce=1;Digce=0;
P0=Seg_Tab[10];Segce=1;Segce=0;
P0=Dig_Tab[4];Digce=1;Digce=0;for(j=0;j<500;j++);
P0=0XFF;Digce=1;Digce=0;
P0=Seg_Tab[11];Segce=1;Segce=0;
P0=Dig_Tab[0];Digce=1;Digce=0;for(j=0;j<500;j++);
P0=0XFF;Digce=1;Digce=0;
P0=Seg_Tab[12];Segce=1;Segce=0;
P0=Dig_Tab[1];Digce=1;Digce=0;for(j=0;j<500;j++);
P0=0XFF;Digce=1;Digce=0;
P0=Seg_Tab[d4];Segce=1;Segce=0;
P0=Dig_Tab[2];Digce=1;Digce=0;for(j=0;j<500;j++);
P0=Seg_Tab[d3];Segce=1;Segce=0;}
//**************LCD液晶屏函数部分*************
voidLCD_write_command(uchardat)//写指令
{
LCD_DB=dat;
LCD_RS=0;//指令
LCD_RW=0;//写入
LCD_E=1;//允许
delay_n40us
(1);
LCD_E=0;
delay_n40us
(1);
}
显示模块子程序
第4章测试方案与测试结果
4.1测试方案及测试条件
Ø软件调试
将整个硬件电路通过学习板上的接口与电脑上的软件KeiluVision4连接,运行程序,此时学习板上的数码管显示的为测量的当前温湿度值(室温)。
Ø改变测量温湿度值
用手握住DHT11,人为改变芯片所处环境温度,观察数码管上显示的温度值是否有改变。
超出初始设定温度上下限时,蜂鸣器发出响声报警;
对着DHT11哈气,改变湿度,观察数码管上显示的湿度度值是否有改变。
超出初始设定湿度上下限时,蜂鸣器发出响声报警
Ø软件设定报警温湿度上下限值
在KeiluVision4中直接改变初始设定的报警温湿度值,运行程序,观察显示效果。
超出新设的报警温湿度,蜂鸣器发出响声报警。
4.2测试结果及其完整性
Ø能正常显示DHT11测量到的温湿度。
显示无闪烁,有效值精确到小数点后一位;
Ø超出设定的报警温湿度值,蜂鸣器发出不同频率响声报警;
Ø当显示温度值在设定温度值之内时,蜂鸣器不发出声音;
Ø多次改变报警温度上下限值,蜂鸣器能在每次显示温度值超出设定报警值时发出声音报警。
4.3测试结果分析
Ø稳定无闪烁显示当前环境温湿度值,有效值精确到小数点后一位。
改变环境温湿度,显示改变;
Ø蜂鸣器在显示温湿度超出设定的上下限值时发出响声报警,显示温湿度在设定范围之内时,不发出声音;
Ø多次改变报警温度上下限值,改变DHT11所处环境温度,每次超出新设报警温度值时,蜂鸣器都可以准确发出声音报警。
根据温湿度监控系统功能,系统软件流程图如图4-1所示:
图4-1系统流程图
结论
本文设计的是粮库的温湿度监测报警、控制系统。
由高性价比单片机对数字温湿度传感器控制,通过温、湿度传感器,实现对温湿度数据采集,并对数据处理、LCD1602显示屏显示即时温、湿度值。
当温湿度数据超出设定温、湿度值时,由单片机驱动报警装置,实现现场报警功能,控制系统自行启动,调节不在范围内的温、湿度,使其恢复正常。
首先,介绍了设计的核心组成部分单片机AT89S51的的基本构成和原理,简要的说明了单片机的最小系统,中断系统,复位电路和时钟电路。
然后介绍了显示部分LCD1602的各个引脚和指令说明,为下面的编程做准备。
其次,介绍了本次设计的传感器:
DHT11温湿度传感器。
然后给出了主要模块电路的结构,在硬件连接以后,初步的硬件运行结果,以实物图的形式进行了说明。
介绍了控制温、湿度的设备,在根据不同环境下的应用和选择。
最后,说明了用到的软件,给出了总体的原理图和流程图和Proteus运行结果,以便更好的理解。
最后程序检查正常,焊接成品,硬件运行正常,满足了初步设计要求,达到了粮库温、湿度控制的目的。
在设计中还有不足的部分,在现场控制时,保证传感器不受条件因素的影响是很重要的,由于研究时间和条件的限制,粮库温、湿度还有许多地方需要深入研究。
心得体会
这次的课程设计是要求做一个DHT11的温湿度传感器,才拿到这个任务的时候,看着上面的要求,觉得好像是一个挺大的工程的,当时感觉还是比较迷茫的。
于是我们从找资料到买器材就花了一周的时间,这期间对于DHT11的一些性能有了初步的了解,也对一些实际的电路器材有了认识,但毕竟都是第一次做这种项目,所以光是完全确认原理电路和元件清单就用了很久,不过还好最后基本上准备齐全了。
做项目的第一步,我们组是在一起讨论了一个比较完善的焊接电路图,因为只是51板的一个外拓模块,且元器件也不是很多,所以留给我们的设计空间很大,最后我们决定了一个充分利用板子大小的方案来作为最终的方案。
然后第二步,我们则是焊电路和编程一块进行的。
在焊电路过程中,因为有设计图做参考,所以比较顺利,而在程序编写过程中,则遇到了一些困难。
比如DHT11的数据传输有严格的时间标准,但是我们设计的延时程序总是与传输标准存在误差,导致无法正确接收数据。
还有数据处理上面,因为没有进行字符型转化,所以一开始在LCD液晶屏上显示的是乱码。
再就是对于按键设置上面,一开始是准备添加按键功能的,然后在编程过程中发现对于单一的温度或者湿度的按键调整比较好编,但是模式转换和将两者结合在一起的地方感觉思路很混乱,最终因为其他模块还亟待改善,就放弃了这个模块的添加。
最后在全部设计完了以后做硬件调试时还发现了蜂鸣器一直会叫,检查了几遍也没发现错误,结果后来换了一个端口就没事了,一开始用的是P0口,后来是把LED灯的端口用来做蜂鸣器端口,发现鸣叫正常了,而且LED灯也会亮起报警,是意料之外的惊喜。
最后,这一次的课程设计真的让我们学到了很多,从一开始的资料查找,到购买原件,再到设计电路和编写程序,让我们切实的感受到了一个项目的完成需要做很多的准备和付出很多的精力。
不过在这同时我们收获的也很多,总之这次课程设计让我们对单片机这一块有了很大的提高,很有意义。
参考文献
[1]电子发烧友网.
[2]谭浩强.C语言程序设计(第三版) 清华大学出版社.
[3]胡汉才.单片机原来及其接口技术(第三版)清华大学出版社.
[4]XX文库:
最全面的DHT11中文资料
[5]XX文库 :
单片机驱动蜂鸣器原理与设计
[6]XX文库 :
DHT11数据手册
附录
附录A 硬件原理图
附录B代码
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineLCD_DBP2
ucharSeg_Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x39,0x76,0x77,0x63};
//ucharSeg1_Tab[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
ucharDig_Tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchartemp_H,temp_L,humi_H,humi_L;
ucharvalue,check,bt,sum,bt_temp,keynum,flag;
uchartH,tL,hH,hL,RHH,RHL,HT,LT;
ucharwarning_RHHL[2]={65,20};
ucharwarning_THL[2]={25,16};
ucharm,n,d1,d2,d3,d4,d5,d6;
ucharTD=0;
uchars1[5];
uchars2[5];
sbitSegce=P1^0;
sbitDigce=P1^1;
sbitKeyce=P1^3;
sbitLCD_RS=P1^4;
sbitLCD_RW=P1^5;
sbitLCD_E=P1^6;
sbitDHT11=P1^7;
sbitHXD=P1^2;
//******************延时函数部分****************
voidDelay(uintj)//(j/10)ms
{
uchari;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
voidDelay_10us(void)//10us
{
uchari;
i--;
i--;
i--;
i--;
i--;
i--;
}
voiddelay_n40us(uintn)
{
uinti;
ucharj;
for(i=n;i>0;i--)
for(j=0;j<2;j++);
}
//***************DHT11数据接收处理与数码管显示部分*************
voidinter_init()//初始化函数
{
P0=0;
P1=0x0c;
TMOD=0x01;
TH0=-50000/256;
TL0=-50000%256;
EA=1;
ET0=1;
}
voidCOM(void)//DHT11的bit读取
{
uchari;
for(i=0;i<8;i++)
{
flag=2;
while((!
DHT11)&&flag++);
Delay_10us();
Delay_10us();
Delay_10us();
bt=0;
if(DHT11)bt=1;
flag=2;
while((DHT11)&&flag++);
//超时则跳出for循环
if(flag==1)break;
//判断数据位是0还是1
//如果高电平高过预定0高电平值则数据位为1
value<<=1;//DHT11数据是从高位开始传的,于是用左移,进行数据处理
value|=bt;
}
}
voidRH(void)//DHT11的数据读取
{
//主机拉低18ms
D