完整word版单片机温湿度传感器课程设计Word文档格式.docx
《完整word版单片机温湿度传感器课程设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《完整word版单片机温湿度传感器课程设计Word文档格式.docx(26页珍藏版)》请在冰豆网上搜索。
本次毕业设计介绍和实现了一种单片机与自动化温湿度传感器互相结合,它们两就组成了一种简单的温湿度检测器系统。
这种检测系统具有以下的特点:
易操作、制作成本低、准确性较高、持续时间长、较为稳定。
2.2系统设计选题的背景
2.2.1国内外研究现状
关于我国国内温湿度研究的时间相对于国外还是比较晚的,毕竟我国对于温湿度检测技术的研究才刚刚起步。
初期我国只运用了相对落后的温湿度的微机控制测量技术,而这门技术还是在参考当时国外发展国家的检测技术的基础上,这门技术局限于测量单方面环境因素,不支持复杂、多项的环境控制。
我国关于温湿度检测技术从对国外发达技术的学习,经过慢慢时间的不断地实验,现已经发展到微测量计算机应用的层次上。
目前,国内用的技术基本上包括单片机,这种技术是利用单片机控制的温湿度检测的系统,过程与步骤都比较简单,还不能实现多参数多回路的温湿度控制系统,相对于那些发达的国家,技术还是比较落后。
我国的温湿度测量存在着下列问题:
实现功能少、产量水平低,操作检修步骤繁琐。
2.2.2国外外研究现状
关于国外温湿度研究的时间相对于国内来说还是较早。
国外初期首先设计出通过组合的形式的模拟式器件,运用了就地取材的方法,将其收集的信号进行一系列的指示并加以记录。
近阶段世界各国都在研究与开发基于计算机的控制温湿度系统,此系统受多因子的控制,其主要特点为精确性高、稳定性强。
以后温湿度发展趋势向着无人操作化、精度稳定化发展。
2.3系统的分类
水汽压型:
测出大气中对某一装置的总压力,然后再测出大气中的水汽对同一装置的压力,将测出的两个压力进行百分比的对比压力,即可以得出温湿度的大小值。
电阻式湿度片:
通过外界温湿度变化与电阻值的关系的来设计出的测量仪器。
当外界的温湿度改变时,与其用电路连接的电阻也随之改变。
温湿度片就是这里的核心器件,它可以感应到外界温湿度的变化。
干湿球温度表:
通过两只完全相同的温度表,使他们并列在一起,其中用一只温度表测量气温,另外一支温度表表头需要缠绕着浸透过纯蒸馏水的脱脂纱布,这两种温度表结合起来就是干湿球温度表。
2.4系统设计的内容与要求
对某一特定环境下用温室度传感器感受到温度和湿度变化,把这种变化转化为电信号输入到单片机中,然后进行各端口的控制使其数据显示在LCD显示屏上,完成了对仓库额的温室与湿度的测量。
要求误差在上下10%之内。
3数据采集部分
3.1温度传感器
采用热电阻温度传感器。
热电阻是利用导体的电阻随温度变化的特性制成的测温元件。
现应用较多的有铂、铜、镍等热电阻。
其主要的特点为精度高、测量范围大、便于远距离测量。
铂的物理、化学性能极稳定,耐氧化能力强,易提纯,复制性好,工业性好,电阻率较高,因此,铂电阻用于工业检测中高精密测温和温度标准。
缺点是价格贵,温度系数小,受到磁场影响大,在还原介质中易被玷污变脆。
按IEC标准测温范围-200~650℃,XX电阻比W(100)=1.3850时,R0为100Ω和10Ω,其允许的测量误差A级为±
(0.15℃+0.002|t|),B级为±
(0.3℃+0.005|t|)。
铜电阻的温度系数比铂电阻大,价格低,也易于提纯和加工;
但其电阻率小,在腐蚀性介质中使用稳定性差。
在工业中用于-50~180℃测温。
3.2湿度传感器测量空气湿度的方式很多,其原理是根据某种物质从其周围的空气吸收水分后引起的物理或化学性质的变化,间接地获得该物质的吸水量及周围空气的湿度。
电容式、电阻式和湿涨式湿敏原件分别是根据其高分子材料吸湿后的介电常数、电阻率和体积随之发生变化而进行湿度测量的。
采用HS1100/HS1101湿度传感器。
HS1100/HS1101电容传感器,在电路构成中等效于一个电容器件,其电容量随着所测空气湿度的增大而增大。
不需校准的完全互换性,高可靠性和长期稳定性,快速响应时间,专利设计的固态聚合物结构,由顶端接触(HS1100)和侧面接触(HS1101)两种封装产品,适用于线性电压输出和频率输出两种电路,适宜于制造流水线上的自动插件和自动装配过程等。
相对湿度在1%—100%RH范围内;
电容量由16pF变到200pF,其误差不大于±
2%RH;
响应时间小于5s;
温度系数为0.04pF/℃。
3.3采用的传感器
大连北方测控工程有限公司生产的温湿度传感器DHT90,将两者的功能集成在一起,并且输出的是数字信号,不需要再进行A/D转换,其温度测量的范围为-40℃~123.8℃,分辨率为0.01℃;
测湿范围为0~100%RH,分辨率为0.03%RH。
综合上面各种设计的技术要求和传感器的特性,考虑到设计简约化,选择使用传感器DHT90,输出的是数字信号,不需要进行A/D转换,简化了系统设计。
4系统设计方案
4.1系统框架图
本系统由单片机主控电路,DHT11温湿度采集模块,1602液晶显示模块3部分组成,下图为框架图。
4.2.1方案一:
采用温湿度一体化的传感器DHT11采集温湿度数据,DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。
它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。
传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。
因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。
DHT11原理图DHT11实物图
4.2.2方案二:
由于本实验proteus库中无dht11模块,使用sht11代替。
为了营造无人看守状态,本次设计中还应用了远程通信系统。
方案一中系统的控制核心是AT89C52单片机,它的主要作用是读取温湿度传感器工作时的内部参数,测试的结果可以显示在LCD上面。
4.3系统功能模块设计
4.3.1中央控制单元
本次温湿度检测系统设计中,由单片机组成的中央控制单元有十分重要的作用。
这是整个系统的大脑,它发出操作命令指挥系统工作。
该单片机不仅可以控制LCD显示屏幕的工作状态,还可以时时刻刻管理着监测着外部环境的温湿度的变化的温湿度传感器的工作状态。
依照所需设计的要求和控制的目的,本次毕业设计选择了AT89C52芯片,该芯片里面包含4kBytesISP的能多次烧入的Flash器件,是一类简单高效率的CMOS8位芯片。
AT89C52芯片是使用了ATMEL公司厂家中的较为先进高级的控制与制作技术做为支持动力。
AT89C52芯片还包括MCS-52系统的操作命令与89C52管脚的排列,其中较重要的8位CPU和ISPFlash存储单元是它的核心部件。
AT89C52芯片的系统功能具有巨大的优势,它可以满足设计中系统稳定运行的基本要求。
AT89C52芯片具16位可编程定时计数器3个,有引脚40个,全双工串行通信口2个,外部双向输入/输出(I/O)端口32个,外中断口2个,读写口线2个,AT89C52芯片的管脚结构如下图所示:
单片机
4.3.2晶振电路模块与复位电路模块
晶振电路模块:
单片机的工作条件是要在时钟驱动的作用下才可以稳定的进行工作,所需的电容大小通常为30PF。
单片机工作时需要一个信号脉冲,晶振的作用就是提供这个信号脉冲。
在时钟驱动作用下,晶振电路所提供的信号脉冲就是单片机的工作速度。
举个例子来说明,一个频率为12MHZ的晶振电路芯片,它的工作速度是12MHZ每秒的运行速度,和我们使用的电脑手机的CPU一个道理。
就于多大的频率才能使单片机更好的更稳点的工作的问题,一般情况下其工作时所需要的频率在24MHZ左右,超过这个值,系统工作就不稳定了。
单片机系统的工作速度取决于时钟信号,其内部镶有时钟振荡电路,在单片机的外部接通一个振荡源就可以工作了。
复位电路模块:
复位电路在设计的系统中起着重要的作用,它保障了设计的系统可以在稳定的环境下工作,复位电路的主要作用功能就是上电复位。
当复位信号消除的时候,系统微机电路才可以稳定高效的工作,消除复位信号的条件是VCC的电压在4.7V与5.2V之间,只有在提供稳定无误差的时钟信号才能实现本次的设计。
下图为其仿真图:
晶振电路和复位电路
4.3.3显示模块
LCD显示电路是本系统的功能具体体现的重要模块,实现了对温湿度检测的液晶屏控制的功能。
温湿度显示电路的组成有SHT10温湿度传感器、LCD液晶显示屏幕。
其显示模块先接受来自单片机处理后的信号,再将其结果显示在液晶屏幕。
STC89C52的P2口接1602的8位数据线,通过输出数据控制1602显示不同的提示字符。
1602本身内置各种字符,还可以自定义显示字符。
本设计中根据不同场合1602会显示各种提示字符。
P0.0~P0.2接1602控制端,其中P0.0接使能端E,写操作时,使能端下降沿有效。
P0.1接读写控制端R/W,R/W=0,读操作;
R/W=1,写操作。
P0.2接寄存器选择端RS,RS=0,写操作时指向指令寄存器,读操作时指向地址寄存器;
RS=1,无论读操作还是写操作都指向数据寄存器。
LCD1602的VSS为电源地,需接地;
VDD为电源电压;
V0为LCD驱动电压,接电位器,通过调节电位器控制显示的亮度,使LCD显示清晰而无黑影。
背光电源线LCD正负两端分别接电源和地即可。
。
显示模块
4.3.4温湿度传感器
利用型号为SHT10的温湿度传感器来测试仓库的温度和湿度。
温湿度传感器
仿真图上三个按键:
↑↓↔来控制操作。
当↔打到左边时为湿度的调节,当↔打到右边的时候为温度的调节;
↑是增大按键,↓是减小按键。
5系统的仿真与调试
5.1Proteus对系统仿真
根据设计要求,从Proteus元件库中找到所需要用到的元件,画好电路图并且检查有无错误。
最后通过keiluVision软件编写的C语言程序,转换成HEX文件下载到画好的的电路上进行调试。
以下是系统的仿真电路图:
系统运行图
5.2LCD的仿真
Lcd运行图
5.3硬件运行结果
运行结果图
实物运行图
6总结
历经两周的课设,又懂得了很多的知识,在这两周的时间里,感受良多吧可以算是。
因为我们做的课设里面因为proteus库中没有DHT11元件,导致我们做了将近一个星期的课设全部推翻。
无奈的对着那一堆程序没日没夜的改着。
从一开始的不了解,觉得很复杂,有传感器、单片机和1602,最麻烦的是还要编程序;
到最后的完成,对各个模块都有了更深认知。
本设计综合利用单片机技术、传感器技术、数字电子技术和LCD显示等科学知识,完成了单片机控制的温度、湿度和显示装置的设计,比较系统地介绍了硬件的组成及设计方法并利用单片机C语言完成了系统软件的设计。
1.把传感器技术应用到单片机控制系统中,实现了对环境温度和湿度的数据采集和读取。
2.利用LCD液晶的显示技术完成了环境温度、湿度及显示电路的设计。
3.在本设计的基础上皆有继电器模块,可以外接调温调湿电器,把功能扩展延伸为实现对环境温湿度的控制。
4.整个系统软硬件搭配合理,设计、开发、维护方便,性价比高
原理图的绘制使我从新学习了一次proteus,对软件种元器件更加熟悉,画仿真图时更为流畅。
在进行设计之前有着很多要解决的问题,比如元器件的选择问题、各个模块的设计和主程序的编程。
通过这次设计,我从到图书馆的网站查找相应的资料应用到对应电路参与设计的思考。
每个模块都要经过多次的设计,不断的试验,让我对之前在学校所学的书本上的理论知识有了更为深刻的了解。
在完成毕业设计的过程是一次难得的理论与实际相结合的过程,在这段时间我更为深刻的理解和掌握了大学期间所学的一些知识,例如C语言的编程、数字模拟电路、单片机的简单应用、proteus和keil软件的使用与设计。
在设计过程中,由于时间和本人能力的限制,设计中存在一些需要改进和优化的地方。
测量精度有待进一步提高,软件设计也存在不合理之处。
但从设计过程中,对于单片机有更进一步的认识,对用于单片机仿真的软件操作能力也明显提高,通过此设计,本人受益颇丰。
参考文献
[1]李全利等编著.《单片机原理及应用》.北京:
清华大学出版社,2006.02:
14~36.
[2]杨西明,朱骐主编.《单片机编程与应用入门》.北京:
机械工业出版社,2004.06:
24~38.
[3]先锋工作室编著.《单片机程序设计实例》.北京:
清华大学出版社,2003.01:
68~78.
[4]谢宜仁主编.《单片机实用技术问答》.北京:
人民邮电出版社,2003.02:
11~20.[5]孙江宏,李良玉等编著.《Protel99电路设计与应用》.北京:
机械工业出版社,2004.07.
[6]房小翠,王金凤编著.《单片机实用系统设计技术》.北京:
国防工业出版社,1999.06.[7]南建辉等编著.《MCS-51单片机原理及其应用实例》.北京:
清华大学出版社,2004.03.
[8]何宏主编.《单片机原理与接口技术》.北京:
国防工业出版社,2006.07:
15~30
[9]叶健斌.《基于单片机嵌入式系统的GPS应用》.电子质量,2008:
(7)16~24.
[10]王静.《通用库房温湿度测控系统》.青岛:
中国海洋大学,2009.05:
30~33.
[11]刘宝元,张玉虹.《基于单片机的温湿度监控系统设计》.国外电子测量技术,2009.12.
[12]陈汝全.《实用微机与单片机控制技术》.成都:
电子科技大学出版,2005.06:
16~17.
附录1:
DHT11程序
//湿度20-90温度0-50采样间隔1S
#include<
intrins.h>
#include"
lcd.h"
sbitDQ=P3^7;
//DTH11
ucharcodeASCII[]="
0123456789%c"
;
ucharcodetable0[]="
Hum:
00"
ucharcodetable1[]="
Tem:
uchartem;
ucharhum;
display0[2]={0,0};
display1[2]={0,0};
//**************************延时函数
voiddelay_ms(uintz)
{
uintx,y;
for(x=z;
x>
0;
x--)
for(y=114;
y>
y--);
}
//**************************初始化DTH11
bitInit_DTH11()
bitflag;
ucharnum;
DQ=0;
delay_ms(19);
//>
18ms
DQ=1;
for(num=0;
num<
10;
num++);
//20-40us34.7us
12;
flag=DQ;
11;
//DTH响应80us
24;
//DTH拉高80us
returnflag;
//****************************读DTH11数据
ucharDTH11_RD_CHAR()
ucharbyte=0;
ucharnum1;
while(DQ==1);
for(num1=0;
num1<
8;
num1++)
{
while(DQ==0);
byte<
<
=1;
//高位在前
DQ==1;
if(num<
10)
byte|=0x00;
else
byte|=0x01;
}
returnbyte;
//******************************读取DTH11温度和湿度
voidDTH11_DUSHU()
if(Init_DTH11()==0)
{
hum=DTH11_RD_CHAR();
//比正常值高7度左右
DTH11_RD_CHAR();
tem=DTH11_RD_CHAR();
17;
//最后BIT输出后拉低总线50us
//***********************************显示函数
voidDisplay_DTH11()
display0[1]=hum/10%10;
display0[0]=hum%10;
LcdShowStr(0,0,table0);
DisplayOneChar(8,0,ASCII[display0[1]]);
DisplayOneChar(9,0,ASCII[display0[0]]);
DisplayOneChar(10,0,ASCII[10]);
//显示湿度
display1[1]=tem/10%10;
display1[0]=tem%10;
LcdShowStr(0,1,table1);
DisplayOneChar(8,1,ASCII[display1[1]]);
DisplayOneChar(9,1,ASCII[display1[0]]);
DisplayOneChar(10,1,0xdf);
DisplayOneChar(11,1,ASCII[11]);
//显示温度
}
//*******************************主函数
main()
tem=0;
hum=0;
delay_ms(1000);
//DTH11开始1s有错误输出
InitLcd1602();
while
(1)
DTH11_DUSHU();
Display_DTH11();
delay_ms(2000);
附录2:
SHT10程序
#include<
reg51.h>
#defineucharunsignedchar
#definenoACK0//继续传输数据,用于判断是否结束通讯
#defineACK1//结束数据传输;
//地址命令读/写
#defineSTATUS_REG_W0x06//00000110
#defineSTATUS_REG_R0x07//00000111
#defineMEASURE_TEMP0x03//00000011
#defineMEASURE_HUMI0x05//00000101
#defineRESET0x1e//00011110
enum{TEMP,HUMI};
sbitDATA=P2^5;
sbitSCK=P2^4;
sbitRS=P2^0;
sbitRW=P2^1;
sbitE=P2^2;
sfrDBPort=0x80;
//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
/********DS1602函数声明********/
voidLCD_Initial();
voidGotoXY(unsignedcharx,unsignedchary);
voidPrint(unsignedchar*str);
voidLCD_Write(bitstyle,unsignedcharinput);
/********SHT10函数声明********/
voids_connectionreset(void);
chars_measure(unsignedchar*p_value,unsignedchar*p_checksum,unsignedcharmode);
voidcalc_sth10(float*p_humidity,float*p_temperature);
//floatcalc_dewpoint(floath,floatt);
/****************************************************************/
//写字节程序
chars_write_byte(unsignedcharvalue)
{
unsignedchari,error=0;
for(i=0x80;
i>
>
=1)//高位为1,循环右移
if(i&
value)DATA=1;
//和要发送的数相与,结果为发送的位
elseDATA=0;
SCK=1;
_nop_();
_nop_();
//延时3us
SCK=0;
DATA=1;
//释放数据线
SCK=1;
error=DATA;
//检查应答信号,确认通讯正常
_nop_();
SCK=0;
returnerror;
//error=1通讯错误
//读字节程