基于RS485的温湿度变送器——DHT11.c/.h
金善愚
2026年02月08日 09:57
收录于文集
共14篇
学知识涨知识

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

File Name: DHT11.c

Author : JSY

Date :

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

#include "DHT11.h"

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

// 函数名称:DHT11_Rst

// 输入参数:无

// 输出参数:无

// 函数功能:DHT11复位

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

void DHT11_Rst(void)

{

DHT11_IO = 0;//主机拉低总线 至少18ms以上

Delay20ms();

DHT11_IO = 1;//主机拉高总线 20-40us

Delay30us();

}

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

// 函数名称:DHT11_Check

// 输入参数:无

// 输出参数:0:正常 <0:异常

// 函数功能:DHT11检测

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

char DHT11_Check(void)

{

unsigned int t = 0;

while(DHT11_IO)//等待低电平出现

{

t++;

nop();

if(t > 1000)

return -1;

}

t = 0;

while(!DHT11_IO)//判断低电平的合法性 低电平时间 80us 超时判断

{

t++;

nop();

if(t > 100)

return -2;

}

t = 0;

while(DHT11_IO)//判断高电平的合法性 高电平时间 80us

{

t++;

nop();

if(t > 100)

return -3;

}

return 0;//如果DHT11 正常,返回0,异常返回小于0

}

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

// 函数名称:DHT11_Read_Byte

// 输入参数:无

// 输出参数:读取的数据

// 函数功能:DHT11读字节

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

unsigned char DHT11_Read_Byte(void)

{

unsigned char i;

unsigned int t = 0;

unsigned char dat = 0;

for(i = 0;i<8;i++)//高位先出 低位后出

{

while(!DHT11_IO)//等待50us低电平过去 超时

{

t++;

nop();

if(t > 100)

return 0;

}

Delay40us();

dat <<= 1;

if(DHT11_IO == 1)//如果40us以后是高电平,则当前比特位为‘1’,否则为比特‘0’

{

dat |= 1;

t = 0;

while(DHT11_IO)

{

t++;

nop();

if(t > 100)

return 0;

}

}

}

return dat;

}

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

// 函数名称:DHT11_Read_Data

// 输入参数:保存读取数据的变量指针

// 输出参数:0:读取正常 <0:读取错误

// 函数功能:DHT11读温湿度

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

char DHT11_Read_Data(unsigned char tempH,unsigned char tempL,unsigned char humiH,unsigned char humiL)

{

unsigned char buf[5];

DHT11_Rst();

if(DHT11_Check() == 0)

{

buf[0] = DHT11_Read_Byte();//接收湿度高8位

buf[1] = DHT11_Read_Byte();//接收湿度低8位

buf[2] = DHT11_Read_Byte();//接收温度高8位

buf[3] = DHT11_Read_Byte();//接收温度低8位

buf[4] = DHT11_Read_Byte();//接收校验位

Delay40us();

if((buf[0]+buf[1]+buf[2]+buf[3]) == buf[4])

{

*humiH = buf[0];

*humiL = buf[1];

*tempH = buf[2];

*tempL = buf[3];

}

else

return -1;

}

else

return -2;

return 0;

}

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

File Name: DHT11.h

Author : JSY

Date :

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

#ifndef __DHT11_H__

#define __DHT11_H__

#include <reg52.h>

#include "delay.h"

#include <intrins.h>

//端口声明

sbit DHT11_IO = P1^0;

//函数声明

void DHT11_Rst(void);

char DHT11_Check(void);

unsigned char DHT11_Read_Byte(void);

char DHT11_Read_Data(unsigned char tempH,unsigned char tempL,unsigned char humiH,unsigned char humiL);

#endif