STC89C52/90C516RD/89C516RD DHT11温湿度传感器驱动代码

1.硬件

STC89C52/90C516RD/89C516RD等
晶振:11.0592M
内存配置:
在这里插入图片描述
Memory Model为small,选择其他无法正常运行。

2.代码

dht11.h

#ifndef __DHT11_H
#define __DHT11_H 
#include "reg52.h"   

#ifndef uchar
#define uchar unsigned char
#endif

#ifndef uint
#define uint unsigned int
#endif

IO操作函数											   
sbit DHT11_DQ_OUT=P1^4; 	

extern uchar idata rec_dat[15]; 	
uchar get_dht11_data(uchar *temp, uchar *humi);
#endif

dht11.c

#include <dht11.h>
#include <intrins.h>
#include "delay.h"

uchar idata rec_dat[15] = "";

uchar idata humi_data_H = 0;
uchar idata humi_data_L = 0;
uchar idata temp_data_H = 0;
uchar idata temp_data_L = 0;
uchar idata check_data = 0;

/***************************************************
*	延时子函数 
*	延时10us
****************************************************/

static void delay_10us()		//@11.0592MHz
{
	uchar i;

	i = 2;
	while (--i);
}

static void delay_30us()		//@11.0592MHz
{
	uchar i;

	i = 11;
	while (--i);
}


/*
	函数说明:获取dht11一个字节
	参数:void
	返回值:获取到的dht11一个字节的数据
*/
static uchar get_dht11_byte(void)
{   
	uchar i = 0;
	uchar time_out = 0;
	uchar temp = 0;
	uchar dht11_byte_data = 0;
	for(i=0;i<8;i++)	   
	{
		time_out=0;	
		while((!DHT11_DQ_OUT)&&time_out++ <= 5); /* 每一bit数据开始之前,都有持续大约50us的低电平 */
		if(time_out == 6) break;  /* 超时退出 */
		delay_30us();   /* 超过30us后还是高电平,表明该bit为1 */
		temp=0;
		if(DHT11_DQ_OUT)temp=1;
		time_out=0;
		while((DHT11_DQ_OUT)&&time_out++ <= 200);
		 
		if(time_out==200)break;
		
		dht11_byte_data<<=1;
		dht11_byte_data|=temp;        //0
	}
	return dht11_byte_data;
}


/*
	函数说明:获取DHT11温湿度数据
	参数:*temp 温度   *humi 湿度
	返回值:获取成功返回0   失败返回1
*/
uchar get_dht11_data(uchar *temp, uchar *humi)
{
	uchar time_out;
	uchar temp1 = 0;
	
	DHT11_DQ_OUT=0;
	delay_ms(20);   /* 主机至少拉低18ms */
	DHT11_DQ_OUT=1; 
	delay_10us();
	delay_10us();
	delay_10us();
	delay_10us();	/* 主机拉高20-40us */
	
	time_out = 0;
	
	while(!DHT11_DQ_OUT && time_out++ <= 5); /* 等待DHT11回应 */
	if(time_out == 6)   return 1; /* 超时退出,sht11未响应 */
	else   /* DHT11响应 */
	{
		time_out=0;	 
		while((!DHT11_DQ_OUT)&&time_out++ <= 5);  /* 等待DHT11响应完毕,大约需要延时80us */
		if(time_out == 6)  return 1; /* 超时异常 */
		time_out=0;
		while((DHT11_DQ_OUT)&&time_out++ <= 5);
		if(time_out == 6)  return 1; /* 超时异常 */ 
		humi_data_H=get_dht11_byte();
		humi_data_L=get_dht11_byte();
		temp_data_H=get_dht11_byte();
		temp_data_L=get_dht11_byte();
		check_data =get_dht11_byte();
		DHT11_DQ_OUT=1;
		//数据校验 
		temp1 = (humi_data_H+humi_data_L+temp_data_H+temp_data_L);
		if(temp1 == check_data)
		{
			*humi = humi_data_H;
			*temp = temp_data_H;
			rec_dat[0] = temp_data_H/10 + '0';
			rec_dat[1] = temp_data_H%10 + '0';
			rec_dat[2] = ' ';
			rec_dat[3] = humi_data_H/10 + '0';
			rec_dat[4] = humi_data_H%10 + '0';
			rec_dat[5] = '\0';
		}
	 }
	return 0;
}

代码有任何问题请参考DHT11数据手册或者留言,将不定期更新常用模块或者芯片驱动代码。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

all of the time

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值