51单片机学习——非标协议外设——DHT11温湿度传感器

温湿度传感器(DHT11)

1、模块线路连接

2、模块认知

3、模块初始化检测模块是否存在

   总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后, 等待主机开始信号结束,延时等待20-40us后, 读取DHT11的响应信号。

3.1、检测方法

   主机拉高延时20-40us后,DHT11模块会将DHT引脚拉低为低电平且持续80us,则检测该处电平,有模块低电平,无模块为高电平。

   代码:

4、模块检检测温度湿度

   4.1、初始化模块

   4.2、采集数据

   4.3、传递数据给串口

4、总代码
 

#include "reg52.h"
#include "intrins.h"

sfr  AUXR   = 0x8e;
sbit DHT 		= P3^3;
sbit led_D6 = P3^6;
char databuffer[5];

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

	_nop_();
	i = 8;
	j = 1;
	k = 243;
	do

	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

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

	i = 36;
	j = 217;
	do
	{
		while (--j);
	} while (--i);
}

void Delay50us()		//@11.0592MHz
{
	unsigned char i;

	_nop_();
	i = 20;
	while (--i);
}

void DHT11_INIT()
{
	DHT = 1;
	DHT = 0;				//主机把总线拉低等待DHT响应,拉低时间大于等于18ms
	Delay20ms();
	DHT = 1;
	while(DHT);			//主机拉高后,延时一段时间,单片机引脚会被模块拉低,
									//while(DHT)则是一直等待被拉低
	while(!DHT);		//等待DHT的80us响应结束
	while(DHT);			//等待高电平结束,结束后开始传递数据
	
}

void DHT_Message()
{
	char i;
	char j;
	char flag;									//用来保存 信号
	char temp;                  //8bit能保存一个数
	DHT11_INIT();								//采集一次数据后就会变成低功耗模式,需要重新变
															//为高功耗模式
	for(i = 0 ; i<5 ; i++){			//五种类型的数据
		for(j= 0 ; j<8 ; j++){		//每种类型8bit
			while(!DHT);							//等待1bit开始结束
			Delay50us();						//检测是2bit开始的低电平(数字0信号),高电平(数字1信号)
			if(DHT == 0){
				flag = 0;
			}else{
				flag = 1;
				while( DHT );		//保证数字1信号的70us高电平耗完
			}
			temp <<= 1;						//左移1
			temp  |= flag;				//将得到的信号放在二进制最后一位 
		}
		databuffer[i] = temp;
	}
}

void Send_Character(char Data)
{
	SBUF = Data;
	while(!TI);						//发送完8bit数据,硬件会将TI置1,需要软件恢复
	TI = 0;
}

void Send_CharacterString(char *str)
{
	while(*str ){
		Send_Character(*str);
		str++;
	}
}

void UART_INIT()
{
	AUXR  = 0x01;			//降低辐射
	PCON &= 0x7F;			//波特率不倍速
	SCON = 0x50;			//8位数据,可变波特率
	TMOD &= 0x0F;			//清除定时器1模式位
	TMOD |= 0x20;			//设定定时器1为8位自动重装方式
	TL1 = 0xFD;				//设定定时初值
	TH1 = 0xFD;				//设定定时器重装值
	ET1 = 0;					//禁止定时器1中断
	TR1 = 1;					//启动定时器1
}

void main()
{
	Delay1000ms();				//延时1s让单片机运行稳定
	UART_INIT();					//初始化串口
	while(1){
		Delay1000ms();				//等待1s以越过DHT11的不稳定状态
		DHT_Message();				//采集数据
		//“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”
		// 湿度
		Send_CharacterString("Humidness:");
		//		湿度整数部分
		Send_Character(databuffer[0]/10 + 0x30);			//需要将数据转换成字符形式, 
																												//不然例如发送:97 ,收到的是字母:a
		Send_Character(databuffer[0]%10 + 0x30);			//0x30在ASCLL码表中表示字符0
		//   湿度小数部分
		Send_Character('.');
		Send_Character(databuffer[1]/10 + 0x30);
		Send_Character(databuffer[1]%10 + 0x30);
		Send_CharacterString("\r\n");
		
		// 温度
		Send_CharacterString("Temperature:");
		
		//		温度整数部分
		Send_Character(databuffer[2]/10 + 0x30);
		Send_Character(databuffer[2]%10 + 0x30);
		//		温度小数部分
		Send_Character('.');
		Send_Character(databuffer[3]/10 + 0x30);
		Send_Character(databuffer[3]%10 + 0x30);
		Send_CharacterString("\r\n");
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值