
/*****************************
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