一、心得概述
不知不觉断断续续学习51单片机3个月了,这次在了解学习了DHT11模块后,决定做一个用DHT11模块检测温湿度的系统出来练手,编写代码在开发板上测试成功之后,在万能板上做出了实物。
项目细节描述:
使用9v电池+AMS1117-5v降压模块供电,另外预留了micro usb接口可接线供电。
使用LCD1602显示屏显示测量数据。
使用DHT11模块检测温湿度。
使用STC89C52芯片。
二、主要模块资料
DHT11使用单总线双向通信,时序图如下:
三、核心程序
1.DHT11的驱动程序
(1).dht.h
#ifndef __DHT11_H__
#define __DHT11_H__
/*
**********************************************************************
* 头文件包含
**********************************************************************
*/
#include "common.h"
/*
**********************************************************************
* 本地宏定义
**********************************************************************
*/
/*
**********************************************************************
* 外部函数原型声明
**********************************************************************
*/
void read_DHT11(u16 *temp,u16 *humi);
#endif
(2).dht.c
/*
**********************************************************************
* 头文件包含
**********************************************************************
*/
#include "dht11.h"
/*
**********************************************************************
* 本地全局变量
**********************************************************************
*/
sbit da = P2^0;
u16 number = 50000;
/*
**********************************************************************
* 内部函数原型声明
**********************************************************************
*/
void read_DHT11(u16 *temp,u16 *humi);
/*
**********************************************************************
* 工具函数
**********************************************************************
*/
void delay19ms(void) //误差 0us
{
unsigned char a,b;
for(b=157;b>0;b--)
for(a=59;a>0;a--);
}
void delay10us(void) //误差 0us
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=2;a>0;a--);
}
/*********************************************************************
* 函 数 名 : read_DHT11
* 函数功能 : **并读取湿度温度测量模块的数据
* 参数列表 : 无
* 函数输出 : 无
*********************************************************************/
void read_DHT11(u16 *temp,u16 *humi)
{
u16 cp=0;
u16 i=0;
u16 j=0;
u16 dat[5] = {0x00,0x00,0x00,0x00,0x00};
da = 0;
delay19ms();
da = 1;
delay10us();
delay10us();
delay10us();
if(da!=0) return;
cp = 0;
while(da==0&&cp++<number);
//if(cp>=number)return;
da = 1;
while(da==1&&cp++<number);
//if(cp>=number)return;
for(i=0;i<5;i++)
{
for(j=0;j<8;j++)
{
cp = 0;
dat[i]=dat[i]<<1;
while(da==0&&cp++<number);
//if(cp>=number)return;
delay10us();
delay10us();
delay10us();
if(da==1)
{
dat[i] = dat[i]|0x01;
cp = 0;
while(da==1&&cp++<number);
//if(cp>=number)return;
}
}
}
if(dat[4]!=(dat[0]+dat[1]+dat[2]+dat[3]))return;
*humi = dat[0];
*temp = dat[2];
}