数字温湿度计的设计.docx
《数字温湿度计的设计.docx》由会员分享,可在线阅读,更多相关《数字温湿度计的设计.docx(29页珍藏版)》请在冰豆网上搜索。
![数字温湿度计的设计.docx](https://file1.bdocx.com/fileroot1/2022-11/27/35954721-0873-48f2-91e3-2b1dd80e1c02/35954721-0873-48f2-91e3-2b1dd80e1c021.gif)
数字温湿度计的设计
智能仪器仪表
课程设计
题目SHT10数字温湿度计的设计
学院(部)机械工程学院
专业测控技术与仪器
学生姓名刘娅丽
学号201210114122年级2012级
指导教师莫莉职称讲师
2015年6月8日
摘要
温湿度是一种最基本的环境参数,温湿度的测量方法和装置对现在的生活、生产具有重要的意义。
此温湿度测量系统是基于温湿度传感器SHT10、单片机STC89C52对温度湿度分别测量并通过液晶1602显示屏经行显示。
使用新式智能的温湿度传感器STH10来实现对温度、湿度的监测,该传感器包括一个电容性聚合体测湿敏感元件、一个用能隙材料制成的测温元件,并在同一芯片上,与14位的A/D 转换器以及串行接口电路实现无缝连接。
因此,该产品具有品质卓越、响应迅速、抗干扰能力强、性价比高,本系统具有可读性高,稳定性高,反应速度快,测量值准确的特点。
关键词:
单片机;SHT10温湿度传感器;LCD1602显示
目录
第一章绪论1
1.1课题的研究背景1
1.2课题的研究内容及目标1
第二章系统方案设计2
2.1设计目的及要求2
2.2器件选择2
第三章系统的硬件设计与实现4
3.1单片机部分4
3.1.1AT89C52单片机概况4
3.1.2最小系统原理图4
3.2传感器部分4
3.2.1SHT10产品概述4
3.2.2管脚说明5
3.2.3传感器模块电路图5
3.3显示模块6
3.3.11602LCD的基本参数及引脚功能6
3.3.21602LCD主要技术参数:
6
3.3.3引脚功能说明6
3.3.41602LCD的指令说明7
第四章软件设计8
4.1主程序流程图8
4.2SHT10传感器程序设计9
4.2.1启动传输9
4.2.2连接复位9
4.3液晶程序设计12
总结13
参考文献14
附录一电路图15
附录二程序代码16
第一章绪论
1.1课题的研究背景
温度与湿度与人们的生活息息相关。
尤其是在工农业生产、气象、国防、科研等部门,必须经常、精确的对环境温度进行监测和控制。
此外,在制药,造纸准及温湿度测量,食品加工和其他行业是必要的。
比较传统的温度计使用水银制作显示,构造简单、价格低廉,缺憾是精确度不高,不宜读数。
传统的干湿球温度计的显示方法,不仅复杂,测量精度不高。
而选用单片机对温湿度实施监控和测量,不单单具有节制便利,单一灵活的特点,而且可以大大提高温度控制的灵活性的优点。
用LED数码管显示温度和湿度值,看起来更直观。
测量温度和湿度最重要的就是传感器。
温度和湿度的测量过去是分离的。
传感器的成长历经了三个阶段:
传统的分立式温度传感器、模拟集成温度传感器、智能集成温度传感器。
目前,从模拟到数字温度传感器的模型的方向,从集成化向智能化,网络化的发展。
温度传感器也经历过这样的阶段走向数字化、智能化。
1.2课题的研究内容及目标
温度和湿度探测器是以AT89C52单片机为核心控制芯片,该芯片具有良好的抗干扰能力,快速响应。
使用此单片机构成的温湿度检测仪能够定时、无误的监测周围的温度和相对湿度。
使用高灵敏度收集湿敏电阻阻值变化,然后经由单片机从而得到相应湿度,这就是本检测仪的硬件部份的设计;DHT11数字温度传感器对温度的实时采集和直接控制监测。
并用LCD显示屏作为显示设备的硬件设计方案。
软件部分选用模块化的方式分成几个个体,一个个进行程序设计,最后连接各部分一起协调工作,从而实现实时监测周围温湿度的目的。
第二章系统方案设计
2.1设计目的及要求
温度、湿度是工业和农业生产的主要环境参数。
是否能够及时、准确地测量很重要。
如果单片机来对温度进行控制,利用高精度的温度,湿度控制,强湿功能,体积小,价格低,简单灵活,很好的满足工艺要求。
要求如下:
1、实现温度和湿度的测量;
2、按电源键进行测量;
3、温度测量要求:
,具有8路模拟输入通道,每一通道每秒检测100次
4、温度的测量范围、精度:
0℃~200℃,测量精度为±1℃。
系统测量环境温度为20℃。
5、湿度测量要求:
具有8路模拟输入通道,每一通道每秒检测100次
6、湿度测量范围、精度:
0~100%RH,测量精度为±1%RH。
系统测量环境温度为20℃。
7、在LCD显示屏上显示数据和结果;
2.2器件选择
2.2.1传感器选择
使用数字温湿度传感器SHT10。
湿度测量范围:
0%~100%RH;温度测量范围:
40~+85℃;湿度测量精度:
±2%相对湿度±0.2℃温度测量精度。
该传感器价格很便宜。
温度和湿度都达到或超过了标题的精度要求,属于低功率传感器。
2.2.2显示器选择
使用LCD1602液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。
它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用。
它具有体积小、低功耗、显示丰富等优点。
电路连接简单,价格也便宜。
2.2,3单片机选择
采用AT89C52单片机,AT89C52是一个低电压,高性能CMOS 8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。
AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89C52可以按照常规方法进行编程,也可以在线编程。
其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
它既经济又有较大的内存,能很好的达到设计要求。
2.3系统总体方案
1方案一
用湿敏传感器和温度传感器采集环境温湿度数据,经放大滤波、A/D转换后,数据送入单片机进行处理,再用数码管显示。
此方案电路较复杂,也不便于调试。
2方案二
采用数字温湿度传感器SHT10采集温湿度信号,AT89C52单片机作为处理器,温度、湿度显示在LCD1602上。
此方案电路简单,易于调试,抗干扰能力强。
综合考虑,选择方案二作为系统总体方案。
图2-1系统结构框图
第三章系统的硬件设计与实现
3.1单片机部分
3.1.1AT89C52单片机概况
AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89C52可以按照常规方法进行编程,也可以在线编程。
其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
3.1.2最小系统原理图
图3-1单片机最小系统
3.2传感器部分
3.2.1SHT10产品概述
SHT10数字温湿度传感器是一种复合传感器,它包含已校准数字信号输出。
通过特殊的数字模块采集技术和温湿度传感技术,以确保产品拥有相当高的可靠性和卓越的长期稳定性。
传感器由一个电阻式感湿元件与一个NTC测温元件组成,跟一个高性能的8位单片机相连接。
因此,产品品质优良,响应速度快,抗干扰能力强,性价比很高。
而且它的每次校准都在及其标准的温湿度实验室中进行。
将所测的校准系数用程序存储在OTP内存中,当需要处理检测到的信号时,传感器会自动调用这些标准系数。
单线串行接口,很容易和快速的系统集成。
它的优点是体积小、低功耗、最高20米以上的远距离信号传递,使它能够在最为严格的场合使用。
3.2.2管脚说明
1:
电源负极,电源引脚(VDD,GND)之间可增加一个100nF的电容,用以去耦滤波。
2:
串行数据,DATA三态门用于数据的读取。
DATA在SCK时钟下降沿之后改变状态,并仅在SCK时钟上升沿有效。
数据传输期间,在SCK时钟高电平时,DATA必须保持稳定。
为避免信号冲突,微处理器应驱动DATA在低电平。
需要一个外部的上拉电阻(例如:
10kΩ)将信号提拉至高电平(参见图2)。
上拉电阻通常已包含在微处理器的I/O电路中。
3:
串行时钟输入,SCK用于微处理器与SHTxx之间的通讯同步。
由于接口包含了完全静态逻辑,因此不存在最小SCK频率。
4:
SHTxx的供电电压为2.4~5.5V。
传感器上电后,要等待11ms以越过“休眠”状态。
在此期间无需发送任何指令。
3.2.3传感器模块电路图
图3-2传感器电路图
3.3显示模块
3.3.11602LCD的基本参数及引脚功能
1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图4-5所示:
图3-3LCD尺寸图
3.3.21602LCD主要技术参数:
★显示容量:
16×2个字符
★芯片工作电压:
4.5—5.5V
★工作电流:
2.0mA(5.0V)
★模块最佳工作电压:
5.0V
★字符尺寸:
2.95×4.35(W×H)mm
3.3.3引脚功能说明
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表3-1所示:
表3-1引脚功能
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
数据
2
VDD
电源正极
10
D3
数据
3
VL
液晶显示偏压
11
D4
数据
4
RS
数据/命令选择
12
D5
数据
5
R/W
读/写选择
13
D6
数据
6
E
使能信号
14
D7
数据
7
D0
数据
15
BLA
背光源正极
8
D1
数据
16
BLK
背光源负极
3.3.41602LCD的指令说明
1602液晶模块内部的控制器共有11条控制指令,如表3-2所示:
表3-2指令说明
序号
指令
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
1
清显示
0
0
0
0
0
0
0
0
0
1
2
光标返回
0
0
0
0
0
0
0
0
1
*
3
置输入模式
0
0
0
0
0
0
0
1
I/D
S
4
显示开/关控制
0
0
0
0
0
0
1
D
C
B
5
光标或字符移位
0
0
0
0
0
1
S/C
R/L
*
*
6
置功能
0
0
0
0
1
DL
N
F
*
*
7
置字符发生存贮器地址
0
0
0
1
字符发生存贮器地址
8
置数据存贮器地址
0
0
1
显示数据存贮器地址
9
读忙标志或地址
0
1
BF
计数器地址
10
写数到CGRAM或DDRAM)
1
0
要写的数据内容
11
从CGRAM或DDRAM读数
1
1
读出的数据内容
第四章软件设计
4.1主程序流程图
N
Y
温湿度修正
显示
图4-1程序流程图
4.2SHT10传感器程序设计
4.2.1启动传输
图4-2启动传输时序
程序:
DATA=1;SCK=0;
_nop_();SCK=1;
_nop_();DATA=0;
_nop_();SCK=0;
_nop_();_nop_();_nop_();SCK=1;
_nop_();DATA=1;
_nop_();SCK=0;
4.2.2连接复位
图4-3连接复位时序
程序:
unsignedchari;
DATA=1;SCK=0;
for(i=0;i<9;i++)
{
SCK=1;
SCK=0;
}
s_transstart();//开始传输函数
4.2.3读写函数
写函数:
chars_write_byte(unsignedcharvalue)
{
unsignedchari,error=0;
for(i=0x80;i>0;i/=2)
{
if(i&value)DATA=1;
elseDATA=0;
SCK=1;_nop_();_nop_();_nop_();
SCK=0;
}
DATA=1;SCK=1;error=DATA;
_nop_();_nop_();_nop_();
SCK=0;DATA=1;
returnerror;//返回:
0成功,1失败
}
读函数:
chars_read_byte(unsignedcharack)
{
unsignedchari,val=0;
DATA=1;
for(i=0x80;i>0;i/=2)
{
SCK=1;
if(DATA)val=(val|i);
_nop_();_nop_();_nop_();SCK=0;
}
if(ack==1)DATA=0;
elseDATA=1;
_nop_();_nop_();_nop_();SCK=1;
_nop_();_nop_();_nop_();SCK=0;
_nop_();_nop_();_nop_();DATA=1;
returnval;
}
4.3液晶程序设计
4.3.1LCD1602部分时序说明
表4-1液晶时序说明
读状态
输入
RS=L,R/W=H,E=H
输出
D0—D7=状态字
写指令
输入
RS=L,R/W=L,D0—D7=指令码,E=高脉冲
输出
无
读数据
输入
RS=H,R/W=H,E=H
输出
D0—D7=数据
写数据
输入
RS=H,R/W=L,D0—D7=数据,E=高脉冲
输出
无
4.3.21602LCD的一般初始化(复位)过程
★写指令38H:
显示模式设置
★写指令08H:
显示关闭
★写指令01H:
显示清屏
★写指令06H:
显示光标移动设置
★写指令0CH:
显示开及光标设置
总结
此次课程设计中,难点在于SHT10温湿度传感器的使用,即对它的时序控制、初始化以及字节读写方法,任何一个环节出错或是时序控制不到位的话就不能得到正确的数据。
一旦学会了正确的使用方法,就能感觉到它带来的便利是热电偶不能比拟的,以后再次使用的话就能很快上手了。
利用温度传感器获取被控对象指标,通过温度传感器将需要测量的温度信号转化为数字电信号,再经单片机转换成显示器可以识别的信息,最后显示输出。
起初,我制订了合理的规划,绘制了与课题相关的硬件原理图,分析了单片机的各I/O端口。
然后进行程序设计的分析,设计绘制流程图,并按照流程图,进行程序段的编写。
接下来把所有的程序段组合在一起综合分析,最后烧录到单片机上进行硬件调试。
在这整个过程当中,我遇到了重重困难。
如程序里括号及分号的错误;编程中共用体的语句的使用;18B20上电温度误判;由于没有合理的考虑到字节的长度的问题导致一系列的错误等问题。
通过多次分析和调试,查阅互联网资料最终成功解决。
单片机不是只要学好怎样写程序就够了,还要对硬件有所了解,要把软件与硬件相结合才,期间还要经过多次的失败,需要相当的耐心和细致的思考来排除一切困难,一步一步地解决问题。
总的来说,自己从这次独立的课程设计中收获了一些知识与经验,一些从书本中学之不来的东西,不是说理论无用,而这恰恰是在理论的土壤中开出的花朵,是在理论的肩膀望见的更宽广的道路!
自主动手动脑实践,成功来之不易!
参考文献
[1]谢光忠、蒋亚东等.温湿度智能数据采集控制系统的研制:
传感器技术20004.
[2]丁元杰.单片微机原理及应用.北京:
机械工业出版社.1993.
[3]余永权.MCS-51系列单片机应用技术.北京:
北京航空航天出版社.2002.
[4] 刘勇.数字电路.北京电:
子工业出版社.2004.
[5] 王法能.单片机原理及应用(简明修订版).北京:
科学出版社.2001.
[6] 赵伟军.PROTEL99SE教程.北京:
人民邮电出版社.2004.
[7] 黄 强.模拟电子技术》北京:
科学出版社.2003.
[8] 陈晓文.电子电路课程设计.北京:
北京电子工业出版社.2004.
附录一电路图
图一电路仿真图
附录二程序代码
#include
#include
#include//Keillibrary
#include//Keillibrary
#defineLCD_DBP0
sbitLCD_RS=P2^0;
sbitLCD_RW=P2^1;
sbitLCD_E=P2^2;
sbitSCK=P2^6;//定义通讯时钟端口
SbitDATA=P2^7;//定义通讯数据端口
typedefunion
{unsignedinti;//定义了两个共用体
floatf;
}value;
enum{TEMP,HUMI};//TEMP=0,HUMI=1
#definenoACK0//用于判断是否结束通讯
#defineACK1//结束数据传输
#defineSTATUS_REG_W0x06//00000110
#defineSTATUS_REG_R0x07//00000111
#defineMEASURE_TEMP0x03//00000011
#defineMEASURE_HUMI0x05//00000101
#defineRESET0x1e//00011110
#defineucharunsignedchar
#defineuintunsignedint
voidLCD_init(void);//初始化函数
voidLCD_write_command(ucharcommand);//写指令函数
voidLCD_write_data(uchardat);//写数据函数
voidLCD_disp_char(ucharx,uchary,uchardat);//显示字符,X(0-15),y(1-2)
voidLCD_disp_str(ucharx,uchary,uchar*str);//LCD1602显示字符串函数
voiddelay_n10us(uintn);//延时函数
//初始化LCD1602
voidLCD_init(void)
{
delay_n10us(10);
LCD_write_command(0x38);
delay_n10us(10);
LCD_write_command(0x0c);
delay_n10us(10);
LCD_write_command(0x06);
delay_n10us(10);
LCD_write_command(0x01);
delay_n10us(100);
}
//LCD写指令
voidLCD_write_command(uchardat)
{
delay_n10us(10);
LCD_RS=0;//指令
LCD_RW=0;//写入
LCD_E=1;//允许
LCD_DB=dat;
delay_n10us(10);
LCD_E=0;
delay_n10us(10);
}
//LCD写数据
voidLCD_write_data(uchardat)
{
delay_n10us(10);
LCD_RS=1;//数据
LCD_RW=0;//写入
LCD_E=1;//允许
LCD_DB=dat;
delay_n10us(10);
LCD_E=0;
delay_n10us(10);
}
//LCD1602显示一个字符函数
voidLCD_disp_char(ucharx,uchary,uchardat)
{
ucharaddress;
if(y==1)
address=0x80+x;
else
address=0xc0+x;
LCD_write_command(address);
LCD_write_data(dat);
}
//LCD1602显示字符串函数
voidLCD_disp_str(ucharx,uchary,uchar*str)
{
ucharaddress;
if(y==1)
address=0x80+x;
else
address=0xc0+x;
LCD_write_command(address);
while(*str!
='\0')
{
LCD_write_data(*str);
str++;
}
}
voiddelay_n10us(uintn)
{
uinti;
for(i=n;i>0;i--)
{
_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();//延时10us@12M晶振
}
}
/****************定义函数****************/
voids_transstart(void);//启动传输函数
voids_connectionreset(void);//连接复位函数
chars_write_byte(unsignedcharvalue);//DHT90写函数
chars_read_byte(unsignedcharack);//DHT90读函数
chars_measure(unsignedchar*p_value,unsignedchar*p_checksum,unsignedcharmode);//测量温湿度函数
voidcalc_dht90(float*p_humidity,float*p_temperature);//温湿度补偿
//启动传输函数
voids_transstart(void)
//generatesatransmissionstart
//__