温湿度传感器(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");
}
}