欢迎访问深圳市智有科技有限公司官网,我公司主要从事电子产品、电子设备的研发及销售、传感器的研发及销售、国内贸易、货物及技术进出口 www.zy-sensor.com

咨询热线

传感器->温湿度传感器 您的位置:首页 > 解决方案 > 传感器->温湿度传感器

PHT11温湿度传感器

更新时间:2022-07-23 11:56:00点击次数:801次字号:T|T
PHT11 数字温湿度传感器是一款低成本的温湿度传感器。采用单总线数字通讯和12位ADC采样温湿度传感技术,传感器包括一 个电阻式感湿元件和一个 NTC 测温元件。

1、PHT11传感器

  PHT11 数字温湿度传感器是一款低成本高性价比的温湿度传感器。采用单总线数字通讯和12位ADC采样温湿度传感技术,传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能 8 位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。

2、温湿度读取方式

     单片机通过单根数据线与PHT11进行通讯,单片机拉低数据线的电平20ms后切换IO口为输入状态,即可激活PHT11,紧接着连续读取PHT11输出的温湿度数据,根据时序时间进行采集判断输出的数据位是逻辑1还是逻辑0,然后再把读取到的数据进行简单转换即可得到温度值和湿度值,湿度范围5%~95%,温度范围-20~60度。

3、C51例程参考

//------------------------------------------------
//  STC15W系列
// 读DHT11数据
//  晶振12MHZ
//  间隔1s读取温湿度并发送到串口
//------------------------------------------------
//------------------------------------------------
// 头文、宏定义
//------------------------------------------------

#define MAIN_Fosc 11059200L //定义主时钟
#define BaudRate1 115200UL //选择波特率
#include "STC15Fxxxx.H"

#include <intrins.h>
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char

#define Timer1_Reload (65536UL -(MAIN_Fosc / 4 / BaudRate1)) //Timer 1 重装值, 对应300KHZ
#define Timer2_Reload (65536UL -(MAIN_Fosc / 4 / BaudRate1)) //Timer 2 重装值, 对应300KHZ

/************* 本地变量声明 **************/

//------------------------------------------------
// 端口定义、寄存器定义
//------------------------------------------------
sbit DIO = P1^0;
sbit LED = P5^5; //指示灯
uint timeout;
uchar read_data[10];
//------------------------------------------------
// 30us延时
//------------------------------------------------
void Delay30us() //@11.0592MHz
{
unsigned char i;
i = 80;
while (--i);
}

void Delay20ms() //@11.0592MHz
{
unsigned char i, j, k;

_nop_();
_nop_();
i = 1;
j = 216;
k = 35;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}

//------------------------------------------------
// 100ms延时
//------------------------------------------------
void Delay100ms() //@11.0592MHz
{
unsigned char i, j, k;

i = 5;
j = 52;
k = 195;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}

//------------------------------------------------
// 开始信号
//------------------------------------------------
void Strt_DHT()
{
DIO=0;
Delay20ms();
DIO=1;
}

//------------------------------------------------
// 应答信号   11.0592MHZ
//------------------------------------------------
uchar Ack()
{
timeout=0;
while(DIO)
{
if(++timeout>300)
return 0;
}

if(DIO==0)
{
timeout=0;
while(!DIO)
{
if(++timeout>167)
return 0;
}
timeout=0;
while(DIO)
{
if(++timeout>50)
return 0;
}
}
else
{
return 0;
}
return 1;
}
//------------------------------------------------
// 读一个字节数据
//------------------------------------------------
uchar read_1byte()
{
uchar i;
uchar temp=0;

for(i=0;i<8;i++)
{
temp<<=1;
    timeout=0;
while(!DIO)
{
if(++timeout>111)
break;
}
Delay30us();
if(DIO)
temp=temp|0x01;

timeout=0;
while(DIO)
{
if(++timeout>20)
break;
}
}
return temp;
}


void init()
{
P0M1 = 0; P0M0 = 0; //设置为准双向口
P1M1 = 0; P1M0 = 0; //设置为准双向口
P2M1 = 0; P2M0 = 0; //设置为准双向口 弱上拉,应为外部按键没有上拉电阻,所以需要配置端口上拉不然那检查不到,虽然复位寄存器是0,但是还是要配置一遍才生效。
P3M1 = 0; P3M0 = 0; //设置为准双向口
P4M1 = 0; P4M0 = 0; //设置为准双向口
P5M1 = 0; P5M0 = 0; //设置为准双向口
P6M1 = 0; P6M0 = 0; //设置为准双向口
P7M1 = 0; P7M0 = 0; //设置为准双向口

//----------------------------------------------串口1初始化
S1_8bit(); //8位数据
S1_USE_P30P31(); //UART1 使用P30 P31口 默认

AUXR &= ~(1<<4); //Timer stop 波特率使用Timer2产生
AUXR |= 0x01; //S1 BRT Use Timer2;
AUXR |=  (1<<2); //Timer2 set as 1T mode
TH2 = (u8)(Timer2_Reload >> 8);
TL2 = (u8)Timer2_Reload;
AUXR |=  (1<<4); //Timer run enable

REN = 1; //允许接收
ES  = 1; //允许中断
TI=1;     //发送中断标志位,必须设置
EA = 1; //全局中断
}

//========================================================================
// 函数: void main(void)
// 描述: 主函数。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 
// 备注: 
//========================================================================
void main(void)
{
float Temperature,Humidity;
uchar temp;
uchar i;
init();
  DIO=1;

while(1)
{
LED=0;//指示灯亮
Strt_DHT();
if(Ack())
{
for(i=0;i<5;i++)
{
read_data[i]=read_1byte();
}
}

Humidity=read_data[0];
temp=read_data[3]&0x0f;
Temperature=temp/10.0;
Temperature=Temperature+read_data[2];
if((read_data[3]&0x80)==0x80) //判断是否为负温度
{
Temperature=-Temperature;
}
printf("PHT:%0.1f,%0.0f  ",Temperature,Humidity);

for(i=0;i<5;i++)
{
read_data[i]=0;
}

LED=1;//指示灯灭
for(i=0;i<10;i++)//延时1s
{
Delay100ms();
}
}
}

(编辑:admin)
  • 上一篇:已经没有了
  • 下一篇:已经没有了
客服侧栏 在线客服 项目咨询 售后服务