DHT11温湿度模块开发

开发手册分析

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

代码模块

DHT11.c

#include <REG52.H>
#include "DHT11.h"
sbit Temp_data = P3^6;
unsigned int rec_dat[4];
unsigned char rec_dat_lcd0[6];
unsigned char rec_dat_lcd1[6];
unsigned char rec_dat_lcd2[6];
unsigned char rec_dat_lcd3[6];
//延时us 
void DHT11_delay_us(unsigned char n)
{
	while(--n);

}
//延时ms
void DHT11_delay_ms(unsigned int z)
{
	unsigned int i,j;
	for(i=z;i>0;i--)
	{
		for(j=110;j>0;j--);
	
	}


}
//起始信号
void DHT11_START()
{
	Temp_data = 1;//空闲状态高电平
	DHT11_delay_us(2);//延时2us
	Temp_data=0;//拉低电平
	DHT11_delay_ms(20);//至少给18ms
	Temp_data = 1;
	DHT11_delay_us(13);

}
//接收一个字节函数
unsigned char DHT11_rec_byte()
{
	unsigned char i,dat;
  for(i=0;i<8;i++)
	{
		while(!Temp_data);//等待DHT11低电平过去
		DHT11_delay_us(8);//延时8us(实际是28us,加上后面程序执行时间总共28us)
		dat<<1;
		if(Temp_data==1)
		{
			dat+=1;
		}
		while(Temp_data); //等待DHT11拉低
	}
	return dat; 

}
//接收温度数据
void DHT11_receice()
{
	unsigned int R_H,R_L,T_H,T_L;
	unsigned char RH,RL,TH,TL,revise;
	DHT11_START();//主机发送信号
	Temp_data=1;
	if(Temp_data==0)//判断DHT11是否进入响应
	{
		while(Temp_data==0);//等待低电平响应信号
		DHT11_delay_us(40);//拉高后延时40ms
		R_H=DHT11_rec_byte();//接收湿度高八位,后面类似
		R_L=DHT11_rec_byte();
		T_H=DHT11_rec_byte();
		T_L=DHT11_rec_byte();
		revise=DHT11_rec_byte();//接收校验位
		DHT11_delay_us(25);
		
		if((R_H+R_L+T_H+T_L)==revise);//校验校验位是否正确
		{
			RH=R_H;
			RL=R_L;
			TH=T_H;
			TL=T_L;
		}
		rec_dat[0]=RH;
		rec_dat[1]=RL;
		rec_dat[2]=TH;
		rec_dat[3]=TL;
		
	}
}
//温湿度模块使用串口发送数据
void InitUART()//使用定时器1,作为串口波特率发生器
{
	SCON=0X40;//串口通信工作方式1
	REN=1;//允许串口一接收
	TMOD=0X20;//定时器1工作方式
	TH1=0XF3;//配置串口波特率
	TL1=0XF3;
	TI=1;
	TR1=1;
}

DHT11.H

#ifndef _DHT11_H_
#define _DHT11_H_
void DHT11_delay_us(unsigned char n);
void DHT11_delay_ms(unsigned int z);
void DHT11_START();
unsigned char DHT11_rec_byte();
void DHT11_receice();

void InitUART();
#endif

main.c

#include "regx52.h"
#include "intrins.h"
#include "LCD1602.h"
#include "stdio.h"
#include "DHT11.h"
extern unsigned int rec_dat[4];
extern unsigned char rec_dat_lcd0[6];
extern unsigned char rec_dat_lcd1[6];
extern unsigned char rec_dat_lcd2[6];
extern unsigned char rec_dat_lcd3[6];
void main()
{
	LCD_Init();
	InitUART();
	LCD_Showstring(1,1,"Humi:");
	LCD_Showstring(2,1,"Temp:");
	while(1)
	{
		DHT11_delay_ms(150);
		DHT11_receice();
		sprintf(rec_dat_lcd0,"%d",rec_dat[0]);//将后面的数组转为字符串存入前面数组
		sprintf(rec_dat_lcd1,"%d",rec_dat[1]);
		sprintf(rec_dat_lcd2,"%d",rec_dat[2]);
		sprintf(rec_dat_lcd3,"%d",rec_dat[3]);
		DHT11_delay_ms(100);
		//显示湿度
		LCD_Showstring(1,6,rec_dat_lcd0);
		LCD_Showstring(1,8,".");
		LCD_Showstring(1,9,rec_dat_lcd1);
		LCD_Showstring(1,11,"%");
		
		//显示温度
		LCD_Showstring(2,6,rec_dat_lcd2);
		LCD_Showstring(2,8,".");
		LCD_Showstring(2,9,rec_dat_lcd3);
		LCD_Showstring(2,13,"C");
		
	}
	
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值