一看就懂!SHT11温湿度检测的使用

SHT11引脚介绍

一看就懂!SHT11温湿度检测的使用_第1张图片

引脚 名称 功能描述
1 GND 地线
2 DATA 串行数据,双向
3 SCK 串行时钟,输入口
4 VDD 电源(2.4~5.5V,建议3.3V)
NC NC 悬空

在电源引脚(VDD,GND)之间必须加一个100uf的电容,用来去耦滤波

启动传输

数据传输初始化:
当SCK时钟为高电平时,DATA翻转位低电平,紧接着SCK变为低电平,
随后在SCK时钟高电平时,DATA翻转为高电平
一看就懂!SHT11温湿度检测的使用_第2张图片

/*SHT启动传输*/
void SHT_Start()
{
	SCK = 1;DATA = 1;//准备	
	_nop_();	SCK  = 1;
	_nop_();    DATA = 0; 
	_nop_();    SCK  = 0;
	_nop_();    SCK  = 1;
	_nop_();    DATA = 1;
}

数据的读取和写入

一看就懂!SHT11温湿度检测的使用_第3张图片
一看就懂!SHT11温湿度检测的使用_第4张图片
为了通讯安全,DATA的有效时间在SCK上升沿之前和下降沿之后应分别延迟Tsu和Tho
向传感器发送命令(写入)
DATA在SCK上升沿有效,且在SCK高电平时必须保持稳定
DATA在SCK下降沿之后改变(参考上图 DATA valid write 段)
从传感器读取数据(读取)
DATA Tv在SCK变低以后有效,且维持到下一个SCK的下降沿
(参考上图 DATA valid read 段)

/*向SHT发送8bit数据*/
void SHT_send(uchar dat)
{
	uchar i;
	SCK = 0;
	_nop_();
	for(i = 0; i < 8;i ++)
	{
		if(dat & 0x80)//和要发送的数相与,结果为发送的位
		{
			DATA = 1; _nop_();
		}
		else
		{
			DATA = 0; _nop_();
		}
		dat <<= 1;
		SCK = 1;	_nop_();
		SCK = 0;
	}
}

/*从SHT11接收8bit数据*/
uchar SHT_rece()
{
	uchar i,dat;
	SCK = 0;    _nop_();
	for(i = 0;i < 8;i ++)
	{
		SCK = 1; _nop_();
		dat <<= 1;
		if(DATA)
		{
			dat = dat | 0x01; _nop_();
		}
		else
		{
			dat = dat & 0xfe; _nop_();	
		}
		SCK = 0;	 _nop_();
	}
	DATA =	1;
	return dat;
}

命令

命令包含三个地址位(目前只有“000”)和五个命令位
一看就懂!SHT11温湿度检测的使用_第5张图片
发布命令‘0000 0101’湿度测量,‘0000 0011’温度测量
控制器要等待测量结束,大约需要20/80/320ms,对应8/12/14bit测量
下拉DATA为低电平并进入空闲模式,表示测量结束
控制器再次触发SCK时钟前,必须等待这个“数据备妥”信号来读出数据,数据可以先被存储

接着传输2字节的测量数据和1字节的CRC奇偶校验
在收到CRC的确认之后,表示通讯结束。
测量通讯完成后,自动转入休眠模式。

/*检测SHT11的响应信号(在第九个时钟周期)*/
void SHT_answer()
{
	SCLK = 1;	_nop_();
	while(DATA = 1);
	SCLK = 0;
	DATA = 1;
}

/*SHT接收两个8位数据后接收CRC校验码*/
void SHT_end()
{
	DATA = 1;
	SCLK = 1; _nop_();
	SCLK = 0; _nop_();
}

复位

如果出现通讯中断,可以使用
当DATA保持高电平时,触发SCK时钟9次或更多,然后发送“传输启动”时序
一看就懂!SHT11温湿度检测的使用_第6张图片

void SHT_recon()
{
	uchar i;
	DATA=1; SCK=0; //准备
	for(i = 0;i < 9;i ++//DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位
    {
		SCK=1;
		SCK=0;
	}
	SHT_Start(); //启动传输
}

状态寄存器

一看就懂!SHT11温湿度检测的使用_第7张图片
某些高级功能可以通过给寄存器发指令来实现,如选择测量分辨率,电量不足,加热,OTP加载
测量分辨率
默认分辨率14bit(温度)、12bit(湿度)
可被降为12和8bit,适用于要求测量速度极高或者功耗极低的应用
电量检测
电量不足2.47V发出警告,精度为±0.05V
加热
加热器可以使传感器的温度高于周围环境5~10℃
OTP加载
开启后标定数据将在每次测量前被传到寄存器。不开启,可减少大约10ms测量时间
一看就懂!SHT11温湿度检测的使用_第8张图片
一看就懂!SHT11温湿度检测的使用_第9张图片

/*向SHT11的状态寄存器设置功能
command为 0X07读寄存器	;返回值为状态寄存器的值
位6显示当前检测完一次数据后电源供电情况
位6 == 0,VDD > 2.47V,; 位6 == 1,VDD < 2.47V(电量不足)
位0当前测量分辨率
位0 == 1,8位湿度,12位温度
位0 == 0,12位湿度,14位温度(默认为0)
*/
uchar SHT_read_register(uchar command)
{
	uchar dat;
	SHT_Start();//启动传输
	SHT_send(command);
	SHT_answer();//信号响应
	dat = SHT_rece();
	SHT_end();//CRC校验
	return dat; 
}

/*向SHT11的状态寄存器设置功能
command为 0X06写寄存器 ;dat为设置数据位数*/
void SHT_write_register(uchar command,uchar dat)
{
	SHT_Start();//启动传输
	SHT_send(command);
	SHT_answer();//信号响应
	SHT_send(dat);
	SHT_answer();
}

湿度信号转换

湿度传感器对电压无依赖性
湿度信号需要温度补偿
公式
在这里插入图片描述
在这里插入图片描述
参数
在这里插入图片描述
在这里插入图片描述

/*将检测数据转化为湿度数据;适用于8位测量数据
RHline=C1+C2*SOrh+C3*SOrh*SOrh 
RHtrue=(tempeture-25)*(t1+t2*SOrh)+RHline
(C1=-2.0468,C2=0.5872,C3=-0.0004,t1=0.01,t2=0.00128)*/
float SHT_hum8bit(uint dat,float temp)
{
	float RHline,RHtrue;
	RHline=-2.0468+0.5872*dat-0.0004*dat*dat;
    RHtrue=(temp-25)*(0.01+0.00128*dat)+RHline;
	if(RHtrue>100)
	{
		RHtrue = 100;	
	}
	else if(RHtrue < 0.1)
	{
		RHtrue = 0.1;	
	}
	return RHtrue;
}

温度信号转换

公式
在这里插入图片描述
参数
在这里插入图片描述
一看就懂!SHT11温湿度检测的使用_第10张图片

/*将检测到的数据转化为温度数据 T=d1+d2*SOt 
d1 = -40,d2 = 0.04   适用于12位测量精度*/
float SHT_temp12bit(uint dat)
{
	float temp1;
	temp1 = 0.04*dat - 40;
	if(temp1 > 100.0)
	{
		temp_flag = 1;
	}
	else
	{
		temp_flag = 0;
	}	
	return temp1;
}

你可能感兴趣的:(传感器)