温湿度检测仪的设计报告.docx

上传人:b****2 文档编号:11522017 上传时间:2023-06-01 格式:DOCX 页数:23 大小:809.51KB
下载 相关 举报
温湿度检测仪的设计报告.docx_第1页
第1页 / 共23页
温湿度检测仪的设计报告.docx_第2页
第2页 / 共23页
温湿度检测仪的设计报告.docx_第3页
第3页 / 共23页
温湿度检测仪的设计报告.docx_第4页
第4页 / 共23页
温湿度检测仪的设计报告.docx_第5页
第5页 / 共23页
温湿度检测仪的设计报告.docx_第6页
第6页 / 共23页
温湿度检测仪的设计报告.docx_第7页
第7页 / 共23页
温湿度检测仪的设计报告.docx_第8页
第8页 / 共23页
温湿度检测仪的设计报告.docx_第9页
第9页 / 共23页
温湿度检测仪的设计报告.docx_第10页
第10页 / 共23页
温湿度检测仪的设计报告.docx_第11页
第11页 / 共23页
温湿度检测仪的设计报告.docx_第12页
第12页 / 共23页
温湿度检测仪的设计报告.docx_第13页
第13页 / 共23页
温湿度检测仪的设计报告.docx_第14页
第14页 / 共23页
温湿度检测仪的设计报告.docx_第15页
第15页 / 共23页
温湿度检测仪的设计报告.docx_第16页
第16页 / 共23页
温湿度检测仪的设计报告.docx_第17页
第17页 / 共23页
温湿度检测仪的设计报告.docx_第18页
第18页 / 共23页
温湿度检测仪的设计报告.docx_第19页
第19页 / 共23页
温湿度检测仪的设计报告.docx_第20页
第20页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

温湿度检测仪的设计报告.docx

《温湿度检测仪的设计报告.docx》由会员分享,可在线阅读,更多相关《温湿度检测仪的设计报告.docx(23页珍藏版)》请在冰点文库上搜索。

温湿度检测仪的设计报告.docx

温湿度检测仪的设计报告

电子电路综合实验设计报告

设计题目:

温湿度检测仪的设计

学生姓名:

学号:

专业年级:

指导教师:

起止日期:

2016年5月—2016年6月

电气与信息工程学院

2016年6月19日

 

3.2方案二------------------------------------------------------------------------------------------2

 

1目的与意义

温湿检测在仓库管理、生产制造、气象观测、科学研究、国防军事以及日常生活中有广泛的应用,传统的模拟式温湿度传感器一般都要设计信号调理电路并需要经过复杂的校准和标定过程,因此测量精度难以保证,且在线性度、重复度、互换性、一致性等方面往往不尽人意。

由于温湿度传感器及其控制系统是20世纪90年代才兴起的行业,因此利用温湿度传感器设计一款将度高、稳定性好、成本低的温湿度检测器有一定的市场前景。

此单片机课程设计采用具有高精度,防干扰等优点的传感器,结合单片机技术,设计完成的温湿度检测器具有易携带、低功率等特点。

克服了传统温湿度检测器需要校准的过程和精度较低的缺点。

2设计要求

(1)模拟单总线协议与DTH11进行通信;

(2)LCD1602第一行显示检测的温度值:

Temperature22℃

(3)LCD1602第二行显示检测的湿度值:

Humidity75%RH

3方案设计

温湿度检测器的组成部分:

图3.1组成模块

3.1方案一

主控芯片采用STC89C52RC,温度传感器采用DTH11。

选择该方案的原因:

(1)单片机软件编程可简单地实现多数功能,自由度大,结构清晰,便于调试和维护,可读性和移植性强。

并且具有体积小,搭建简单等优点。

(2)STC89C52RC的应用十分广泛,相关技术的使用都很熟练,开发难度小。

(3)DTH11温湿度传感器是一款含有己校准数字信号书序的温湿度复合传感器。

它应用的数字采集技术和温湿度传感技术,可确保产品具有极高的可靠性与卓越的长期稳定性。

(4)传感器包括一个电阻感湿与元件和一个NTC测温元件,因此DTH11品质卓越、响应速度快、抗干扰能力强。

(5)DTH11进行温湿度检测时,在0℃-50℃内最高精度为5%左右,精度较高。

(6)DTH11是将温度和湿度一起测量,具有搭建电路简单、体积小、编程容易的有点。

3.2方案二

主控芯片采用MSP430F149,温度传感器采用DS18B20和一个湿度传感器相结合。

选择该方案的原因:

(1)MSP430F149功耗低,内部集成高速12位ADC性能强大。

(2)DS18B20是数字信号输出,易于单片机处理和控制,消除了传统测量方法的许多外围电路。

(3)DS18B20在0℃-100℃最大线性误差小于1℃。

(4)DS18B20的单总线数据传输方式有利于提高信号的稳定性和精度。

从两种方案的综合情况来考虑,选择方案一较符合实际情况。

因为本设计比较简单,不需要MSP430F149如此功能强大的单片机,并且MSP430F149成本高,是TPFQ贴片封装,必须采用PCB制版,增加了开发周期。

而且使用DS18B20和一个湿度传感器来测量温湿度具有电路搭建复杂,体积大,编程困难等缺点。

4系统硬件设计

STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8k 在系统可编程Flash存储器。

STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。

在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

具有以下标准功能:

8k字节Flash,512字节RAM,32位I/O口线,看门狗定时器,内置4KBEEPROM,MAX810复位电路,3个16位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。

另外STC89X52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。

空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。

掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。

最高运作频率35MHz,6T/12T可选。

STC89C52RC的引脚图如下:

图4.1STC89C52RC引脚图

 

根据设计要求写出设计的系统硬件框图,给出如下所示的硬件结构框图:

图4.2硬件结构图

4.1STC89C52主控电路

单片机控制模块由STC89C52RC最小系统组成,其中包括单片机、晶振电路和复位电路。

晶振电路由18,19引脚接入2个30pf的电容和一个11.059MHz的晶振组合而成。

最小系统如图4.3所示。

图4.3单片机最小系统

4.2DTH11温湿度检测电路

DTH11具有品质卓越、超快响应、抗干扰能力强、精度高、性价比极高等优点。

采用单总线串行通信方式,供电电压范围为3.0V至5.5V,测量温度范围为0℃至50℃,湿度为20%至90%。

DHT11芯片封装和管脚如图4.4所示。

图4.4DTH11封装图和引脚图

DTH11引脚说明,如表4.1

表4.1DTH11引脚说明

DTH11的硬件设计,如图4.5所示。

图4.5DTH11硬件连接图

4.3LCD1602液晶屏显示电路

1602采用标准的16脚接口,如图4.6所示,其中:

1脚:

GND为电源地

2脚:

VCC接5V电源正极

3脚:

V0为液晶显示器对比调整端

4脚:

RS为寄存器选择端

5脚:

RW为读写信号线

6脚:

EN为使能端

7~14脚:

与单片机双向通信的8位数据端

15~16脚:

空脚或背灯电源

 

图4.61206硬件连接图

5系统软件设计

硬件设计是基于多个电路组合而成的整体,所以系统的程序设计思想也是面向各个硬件电路而设置的子程序(或者是面向各个子功能而设置的子程序),通过主程序按照一定的逻辑关系去调用它们,从而实现整个系统的功能。

这样可以避免主程序代码过长,方便出错调试分析。

5.1主程序程序流程图

主函数主要是对系统所有硬件进行初始化让整个系统能够正常工作,具体程序执行过程见图5.1主函数流程图。

图5.1主函数流程图

实现主程序的关键代码如下:

voidmain()

{

tem=0;

hum=0;

delay_ms(1000);//DTH11开始一秒有错误输出

InitLcd1602();

while

(1)

{

DTH11_DUSHU();

Display_DTH11();

delay_ms(1000);

}

}

5.2温湿度检测程序

温湿度检测软件设计遵循单总线协议,MCU通过时序来写入和读出DTH11中的诗句。

DTH11通过如下步骤完成操作:

复位、接受应答、读取ROM序列号、启动温湿度转化、等待操作完成、保持数据。

流程图如5.2所示。

图5.2温湿度检测软件流程图

实现温湿度检测的程序如下

//**************************初始化DTH11

bitInit_DTH11()

{

bitflag;

ucharnum;

DQ=0;

delay_ms(19);//>18ms

DQ=1;

for(num=0;num<11;num++);//20-40us34.7us

flag=DQ;

for(num=0;num<27;num++);

for(num=0;num<27;num++);

returnflag;

}

//****************************读DTH11数据

ucharDTH11_RD_CHAR()

{

ucharbyte=0;

ucharnum;

ucharnum1;

while(DQ==1);

for(num1=0;num1<8;num1++)

{

while(DQ==0);

byte<<=1;//¸ßλÔÚÇ°

for(num=0;DQ==1;num++);

if(num<10)

byte|=0;

else

byte|=1;

}

returnbyte;

}

//******************************读取DTH11温度和湿度

voidDTH11_DUSHU()

{

ucharnum;

if(Init_DTH11()==0)

{

hum=DTH11_RD_CHAR();

DTH11_RD_CHAR();

tem=DTH11_RD_CHAR();

DTH11_RD_CHAR();

DTH11_RD_CHAR();

for(num=0;num<17;num++);

DQ=1;

}

}

5.3LCD1206显示程序

图5.3LCD1206显示流程图

LCD1206显示程序如下:

1206初始化程序省略。

voidLcdSetCursor(unsignedcharx,unsignedchary)//坐标显示

{

unsignedcharaddr;

if(y==0)

addr=0x00+x;

else

addr=0x40+x;

Write_Cmd(addr|0x80);

}

voidDisplayOneChar(ucharX,ucharY,ucharDData)//显示字符

{

if(Y)X|=0X40;//Y=1,显示第二行,Y=0显示第一行

X|=0X80;

Write_Cmd(X);//X用来显示哪一位

Write_Data(DData);//Ddata用来写数据

}

voidLcdShowStr(unsignedcharx,unsignedchary,unsignedchar*str)//显示字符串

{

LcdSetCursor(x,y);//当前字符的坐标

while(*str!

='\0')

{Write_Data(*str++)}

}

display0[2]={0,0};//显示第一行的00位置的数据

display1[2]={0,0};//显示第二行的00位置的数据

voidDisplay_DTH11()

{

display0[1]=tem/10%10;

display0[0]=tem%10;

LcdShowStr(0,0,table0);

DisplayOneChar(12,0,ASCII[display0[1]]);

DisplayOneChar(13,0,ASCII[display0[0]]);

DisplayOneChar(14,0,0xdf);

DisplayOneChar(15,0,0x43);//显示温度

display1[1]=hum/10%10;

display1[0]=hum%10;

LcdShowStr(0,1,table1);

DisplayOneChar(9,1,ASCII[display1[1]]);

DisplayOneChar(10,1,ASCII[display1[0]]);

DisplayOneChar(11,1,ASCII[10]);

DisplayOneChar(12,1,0x52);

DisplayOneChar(13,1,0x48);//显示湿度

}

6系统测试结果与分析

6.1系统测试结果

测试地点:

室内,测试结果如表6.1所示。

标准温度

测试温度

标准湿度

测试湿度

26℃

27℃

65%

63%

表6.1测试结果

6.2系统结果分析

测量结果和标准温湿度有一定的误差,但是在误差范围内。

证实了理论的科学性和可行性。

系统可改进之处:

进一步严格和完善DTH11的时序,可提高测量精度。

7总结

通过这次设计我真的学到了很多东西。

不仅了解了单片机的原理级应用,温湿度传感器方面的知识。

另外也使我体会了一般的设计过程。

也让我觉得单片机没有我想象中的那么难。

上课的时候一直觉得单片机是一科很难的课程,需要极强的逻辑思维能力,能把自己的思维用程序表达出来。

我觉得这就是单片机编程的最大困难。

而我也是一开始就被这个拦路虎吓住了。

没有努力过就放弃了。

这门课对我来说怎么可能不难呢。

虽然在此次设计过程中遇到了很多问题,但是在老师和同学的帮助下我顺利完成了这次温湿度检测器的设计。

参考文献

[1].黄友锐.单片机原理及应用.合肥:

合肥工业大学出版社,2006.11 

[2].黄智伟.无线发射与接收电路设计[M]. 北京:

北京航空航天大学出版社,2004.

[3].陈杰,黄鸿.传感器与检测技术.北京:

高等教育出版社,2002.8 

[4].荚荚庆,王代华,张志杰.基于nRF905的无线数据传输系统[J].国外电子元器件.2008

(1):

29-31. 

[5].李建设.低功耗低成本温湿度测量仪的设计[J].节能,2006,(05)

[6].谭浩强. C 程序设计.北京:

清华大学出版社,1991.7 

[7].孟臣,李敏.数字式温湿度传感器原理与应用[J].世界电子元器件,2003 (8):

66268. 

[8].Cotter W.塞尔.无线通信设备与系统设计大全[M]. 张之超等译.北京:

人民邮电出版社,2004 

附录

附录A系统实物图

附录B系统主程序

#include

#include

//****************************************************

//***********************定义区***********************

//****************************************************

#defineucharunsignedchar

#defineuintunsignedint

#defineLCD1602_DBP2

sbitDQ=P3^7;

sbitLCD1602_RS=P0^7;

sbitLCD1602_RW=P0^6;

sbitLCD1602_EN=P0^5;

 

voidLcd1602_Delay1ms(uintc);

voidRead_Busy();

voidWrite_Cmd(unsignedcharcmd);

voidWrite_Data(unsignedchardat);

voidLcdSetCursor(unsignedcharx,unsignedchary);

voidDisplayOneChar(ucharX,ucharY,ucharDData);

voidLcdShowStr(unsignedcharx,unsignedchary,unsignedchar*str);

voidInitLcd1602();

//****************************************************

//******************1602显示初始化****************

//****************************************************

ucharcodeASCII[]="0123456789%c";

ucharcodetable0[]="Temperature:

00";

ucharcodetable1[]="Humidity:

00";

uchartem;

ucharhum;

voidInitLcd1602()

{

Write_Cmd(0x38);

Write_Cmd(0x0c);

Write_Cmd(0x06);

Write_Cmd(0x01);

}

voidRead_Busy()

unsignedcharsta;

LCD1602_DB=0xff;

LCD1602_RS=0;

LCD1602_RW=1;

do

{

LCD1602_EN=1;

sta=LCD1602_DB;

LCD1602_EN=0;

}

while(sta&0x80);

}

voidWrite_Cmd(ucharcmd)//写命令

{

Read_Busy();

LCD1602_RS=0;

LCD1602_RW=0;

LCD1602_DB=cmd;

LCD1602_EN=1;

LCD1602_EN=0;

}

voidWrite_Data(uchardat)//读数据

Read_Busy();

LCD1602_RS=1;

LCD1602_RW=0;

LCD1602_DB=dat;

LCD1602_EN=1;

LCD1602_EN=0;

}

 

//*****************************************************

//*********************定义显示函数********************

//*****************************************************

voidLcdSetCursor(unsignedcharx,unsignedchary)

{

unsignedcharaddr;

if(y==0)

addr=0x00+x;

else

addr=0x40+x;

Write_Cmd(addr|0x80);

}

voidDisplayOneChar(ucharX,ucharY,ucharDData)//显示字符

{

if(Y)X|=0X40;//Y=1显示第一行,Y=0显示第二行

X|=0X80;

Write_Cmd(X);//X用来选择哪一位

Write_Data(DData);//Ddata用来写数据

}

voidLcdShowStr(unsignedcharx,unsignedchary,unsignedchar*str)//显示字符串

{

LcdSetCursor(x,y);//当前字符坐标

while(*str!

='\0')

{

Write_Data(*str++);

}

}

 

//************************************************

//**********************延时函数******************

//*************************************************

voiddelay_ms(uintz)

{

uintx,y;

for(x=z;x>0;x--)

for(y=114;y>0;y--);

}

//*******************************************************

//*************************DTH11模块*********************

//*******************************************************

//**************************初始化DTH11

bitInit_DTH11()

{

bitflag;

ucharnum;

DQ=0;

delay_ms(19);//>18ms

DQ=1;

for(num=0;num<11;num++);//20-40us34.7us

flag=DQ;

for(num=0;num<27;num++);

for(num=0;num<27;num++);

returnflag;

}

//****************************读DTH11数据

ucharDTH11_RD_CHAR()

{

ucharbyte=0;

ucharnum;

ucharnum1;

while(DQ==1);

for(num1=0;num1<8;num1++)

{

while(DQ==0);

byte<<=1;//¸ßλÔÚÇ°

for(num=0;DQ==1;num++);

if(num<10)

byte|=0;

else

byte|=1;

}

returnbyte;

}

//******************************读取DTH11温度和湿度

voidDTH11_DUSHU()

{

ucharnum;

if(Init_DTH11()==0)

{

hum=DTH11_RD_CHAR();

DTH11_RD_CHAR();

tem=DTH11_RD_CHAR();

DTH11_RD_CHAR();

DTH11_RD_CHAR();

for(num=0;num<17;num++);

DQ=1;

}

}

 

//****************************************************

//***************将检测到的数据显示模块***************

//****************************************************

display0[2]={0,0};

display1[2]={0,0};

voidDisplay_DTH11()

{

display0[1]=tem/10%10;

display0[0]=tem%10;

LcdShowStr(0,0,table0);

DisplayOneChar(12,0,ASCII[display0[1]]);

DisplayOneChar(13,0,ASCII[display0[0]]);

DisplayOneChar(14,0,0xdf);

DisplayOneChar(15,0,0x43);

display1[1]=hum/10%10;

display1[0]=hum%10;

LcdShowStr(0,1,table1);

DisplayOneChar(

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2