SHT11温湿度传感器的工作原理探析
2019-09-10徐锦钢鄢妍
徐锦钢 鄢妍
摘 要:本文论述了SHT11温湿度传感器的工作原理,使用Proteus仿真软件设计了SHT11的湿度测量电路图,并通过1602液晶显示SHT11测得的湿度值,验证了湿度测量电路及其程序编写的正确性。
关键词:SHT11温湿度传感器;工作原理;程序编写
中图分类号:TP274 文献标识码:A 文章编号:1003-5168(2019)28-0070-03
Analysis on the Working Principle of SHT11
Temperature and Humidity Sensor
XU Jin’gang1 YAN Yan2
(1.College of Science and Technology, Jiangxi Normal University,Nanchang Jiangxi 330032;2.Jiangxi Institute of Mechanical and Electrical Technology,Nanchang Jiangxi 330032)
Abstract: This paper discussed the working principle of SHT11 temperature and humidity sensor, designed the circuit diagram of SHT11 humidity measurement using proteus simulation software, and verified the correctness of the humidity measurement circuit and its programming by 1602 liquid crystal display SHT11 measured humidity value.
Keywords: SHT11 temperature and humidity sensor;working principle;programming
1 SHT11温湿度传感器简介
SHT11是瑞士Sensirion公司生产的一种温湿度传感器芯片,具有精度高、体积小、可自校准、体积小等优点。该芯片内部还集成有放大器、RAM、冗余校验寄存器、加热器、A/D模数转换器等部件,通过二线制串行接口和单片机通信[1]。
2 硬件连接
SHT11温湿度传感器的硬件连接如图1所示。SHT11温湿度传感器主要包括AT89C52单片机、SHT11和1个1602液晶屏。SHT11构成的温湿度测量系统电路简单,只需要2个接口即可实现SHT11数据的读和写操作。图中SHT11的第2脚(DATA)为数据端,接至单片机的P3.1口,传输温湿度数据信号;SHT11的第3腳(SCK)为时钟端,接至单片机的P3.0口,为数据传输提供时钟脉冲;SHT11的第1脚(GND)接地;第4脚(VCC)接+5V电源。1602液晶屏数据端(D7-D0)接至单片机P0口,控制端(EN、RW、RS)分别接至单片机P2.2、P2.1、P2.0口。
3 SHT11内部构造
SHT11温湿度传感器将温度测量、湿度测量、信号转换、A/D模数转换和加热等功能集成在一个芯片里,其内部结构如图2所示。
该芯片包含一个用能隙材料制成的温度传感器和一个用电容性聚合体制成的湿度传感器。这两个传感器分别将湿度和温度转换成电信号,电信号进入运算放大器做放大处理;之后进入A/D模数转换器;最后经过二线串行数字接口将数字信号输出。在出厂前,SHT11会在恒湿或恒温环境中进行校准,并且将校准系数存放在校准寄存器中;校准时,校准系数会自动校准来自SHT11的信号。另外,SHT11内部还集成了一个加热单元,加热单元接通后可以将SHT11的温度提升5℃,但功耗也会相应增加。安装加热单元主要是为了比较加热前后的温度和湿度值,以此来综合验证两个传感器元件的性能。在高湿(湿度>95%时)环境中,加热功能可防止传感器结露,同时可缩短传感器响应时间,从而提高测量精度[2]。
4 SHT11温湿度传感器程序设计
4.1 SHT11湿度测量时序及其步骤介绍
SHT11湿度测量时序如图3所示。通信时,单片机作为主机,SHT11作为从机。通信协议规定,DATA线上的数据只有在SCK=0时才可以更新。首先单片机发出起始信号,然后向SHT11发送地址位和相应的命令字,SHT11接收后向单片机返回ACK响应信号。接着,SHT11开始测量湿度值,然后将测得的高位数据先发出去,等待单片机返回的ACK响应信号,接着将测得的低位数据发出去,等待单片机返回的ACK响应信号。之后进行CRC数据校验,至此完成一次湿度值得测量。
4.1.1 启动。SHT11启动时序如图4所示。SHT11的启动方式是当SCK为高电平时,单片机控制DATA线电平由高变为低。经过1个SCK周期后,电平再从低变为高。之后,SHT11开始正常工作。否则,SHT11将一直处于休眠状态,以节省功耗。
4.1.2 向SHT11写入控制字。启动之后,单片机控制DATA数据线对SHT11发出8位测量命令字。测量命令字中的前3位为地址位,固定为000,后5位表示命令代码位。
在发送8位数据之后,SHT11在第9个时钟脉冲上升沿到来之前将DATA线电平拉低,表示SHT11已经接收到了测量命令。在第9个时钟过去之后,SHT11开始测量,测量时间视具体情况而定。对于8位、12位、14位测量分辨率,所需测量时间分别为20、80ms和320ms。本设计采用默认测量分辨率。
4.1.3 读出测量结果。在测量结束后,SHT11会将DATA线电平拉低,接着向单片机发送2字节的测量数据和1字节的CRC奇偶校验码。每读到1个字节,单片机需要将DATA线电平下拉,表示成功接收到该字节。所有数据都从MSB开始,右值有效。比如,对于测量湿度默认的12位分辨率方式,前4位为无用数据,从第5个SCK时钟开始算作MSB,而对于8位分辨率测量方式,首字节则无意义。
如若不需要校验,可以在第2个字节之后的应答时钟前将DATA线电平拉高,以结束本次通信。随后SHT11进入休眠状态,以节省功耗。
4.1.4 温湿度数据计算及温度补偿。本设计以默认12位分辨率测量时的湿度测量计算方法为例进行说明。当环境温度为25℃时,如果单片机读取的12位数字结果为RH_Val,则其对应的湿度数据可根据以公式(1)进行拟合:
RH%=-4.0+0.040 5×RH_Val-RH_Val2×2.8×10-6 (1)
比如:测量RH_Val=2 353,代入式(1)计算得到湿度值为75.79%。
当环境温度为[T]时,需要对拟合公式做温度修正,修正公式如下:
RH%=RH%+([T]-25)×(0.01+0.000 08×RH_Val) (2)
4.2 程序设计
本文编写了一个完整的SHT11测量湿度程序,主要包括SHT11启动函数、SHT11读字节函数、向SHT11写命令字函数、显示测量结果函数等。下面给出相应代码,并作出注释。
4.2.1 SHT11启动函数。SHT11启动函数的相应代码和注释如下。
void start()
{
DATA=1;
SCK=0;//状态初始化
delay(4);//延时4微秒
SCK=1;//SCK为1时,DATA翻转为低电平
delay(4);
DATA=0;
_nop_();//短暂延时
SCK=0;//接着SCK变为低电平
delay(4);
SCK=1;//在SCK重回高电平期间,DATA翻转为高电平,则启动SHT11
delay(4);
DATA=1;
delay(4);
SCK=0;
}
4.2.2 SHT11读字节函数。SHT11读字节函数的相应代码和注释如下。
char read_byte()//从SHT11读1个字节数据
{
uchar i;
uchar x=0;//存储读取的1个字节测量结果
DATA=1;//释放DATA,SHT11控制其数据变化
delay(4);
for(i=0;i<8;i++)//读8位数据
{
x<<=1;
SCK=1;
if(DATA==1)
{
x|=0x01;//从SHT11中读1
}
SCK=0;
}
DATA=0;//每读1个字节,需拉低DATA
delay(4);
SCK=1;//第9个时钟到来
delay(4);
SCK=0;
delay(4);
DATA=1;//释放DATA,为读下一字节做準备
return x;
}
4.2.3 向SHT11写命令字函数。向SHT11写命令字函数的相应代码和注释如下。
void write_com(uchar command)
{
uchar i;
start();
for(i=0;i<8;i++)//每个命令字包含8个数据位
{
if((command&0x80)==0x80)//先写命令字的高位
DATA=1;//通过数据总线向SHT11写'1'
else
DATA=0;//通过数据总线向SHT11写'0'
command<<=1;//命令字左移1位,
delay(4);//保持一段延时
SCK=1;
delay(4);
SCK=0;
delay(4);
}
DATA=1;//拉高DATA
delay(4);
SCK=1;//第9个时钟,等待应答ACK
while(DATA==1);//DATA=0,表示传感器成功收到写入命令
SCK=0;//第9个时钟下降沿,需将DATA释放(上拉为高电平)
DATA=1;
delay_ms(80);//12位测量需等待80ms以上
while(DATA==1);//等待DATA被传感器拉低(测量结束)
}
4.2.4 显示测量结果函数。显示测量结果函数的相应代码和注释如下。
void DisplayResult(float x)
{
uchar INT,DEC;
INT=x;
DEC=x*100-INT*100;
write_com(0x80+9);//指定显示地址
write_data(0x30+INT/10);//显示十位数字
write_data(0x30+INT%10);//显示个位数字
write_com(0x80+12);
write_data(0x30+DEC/10);//显示十分位
write_data(0x30+DEC%10);//显示百分位
}
5 电路功能测试
按图1连接好电路后,按下SHT11上的湿度增减按键,模拟外界湿度变化,单片机在读取湿度值后,将湿度值显示在1602液晶显示屏上。比如,图中测得湿度为80%时,液晶显示为82.52%,误差比较小(由计算和数值转换导致),说明该电路连接及程序编写均正确无误。
6 结语
本文采用单片机作为控制器,设计了基于SHT11的湿度测量电路,并论述了SHT11的工作原理,给出了部分程序代码并注解。通过测试,SHT11能正常测量湿度值,电路工作正常。
参考文献:
[1]百度文库.SHT11传感器特性及设定[DB/OL].(2018-07-01)[2019-08-20]. https://wenku.baidu.com/view/02e555086c85ec3a87c2c5df.html.
[2]杨欣.实例解读51单片机完全学习与应用[M].北京:电子工业出版社,2010.