* 【实验平台】: QX-MINI51 单片机开发版
* 【外部晶振】: 11.0592mhz
* 【主控芯片】: STC89C52
* 【显示器 】: 1602
* 【传感器 】: DHT11
* 【编译环境】: Keil μVisio3
* 【程序功能】: DHT11 第三脚悬空 DHT11孔面面向开发板外
* 【使用说明】:
* 说明:免费开源,不提供源代码分析.
**********************************************************************************/
// 湿度20-90 温度0-50 采样间隔1S
#include
#include "lcd.h"
sbit DQ=P3^7; //DTH11
uchar code ASCII[]="0123456789%c";
uchar code table0[]=" Hum:00";
uchar code table1[]=" Tem:00";
uchar tem;
uchar hum;
display0[2]={0,0};
display1[2]={0,0};
//**************************延时函数
void delay_ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
//**************************初始化DTH11
bit Init_DTH11()
{
bit flag;
uchar num;
DQ=0;
delay_ms(19); // >18ms
DQ=1;
for(num=0;num<10;num++); // 20-40us 34.7us
for(num=0;num<12;num++);
flag=DQ;
for(num=0;num<11;num++); //DTH响应80us
for(num=0;num<24;num++); //DTH拉高80us
return flag;
}
//****************************读DTH11数据
uchar DTH11_RD_CHAR()
{
uchar byte=0;
uchar num;
uchar num1;
while(DQ==1);
for(num1=0;num1<8;num1++)
{
while(DQ==0);
byte<<=1; //高位在前
for(num=0;DQ==1;num++);
if(num<10)
byte|=0x00;
else
byte|=0x01;
}
return byte;
}
//******************************读取DTH11温度和湿度
void DTH11_DUSHU()
{
uchar num;
if(Init_DTH11()==0)
{
hum=DTH11_RD_CHAR(); //比正常值高7度左右
DTH11_RD_CHAR();
tem=DTH11_RD_CHAR();
DTH11_RD_CHAR();
DTH11_RD_CHAR();
for(num=0;num<17;num++); //最后BIT输出后拉低总线50us
DQ=1;
}
}
//***********************************显示函数
void Display_DTH11()
{
display0[1]=hum/10%10;
display0[0]=hum%10;
LcdShowStr(0, 0, table0);
DisplayOneChar (8, 0, ASCII[ display0[1] ] );
DisplayOneChar (9, 0, ASCII[ display0[0] ] );
DisplayOneChar (10, 0, ASCII[10] ); //显示湿度
display1[1]=tem/10%10;
display1[0]=tem%10;
LcdShowStr(0, 1, table1);
DisplayOneChar (8, 1, ASCII[ display1[1] ] );
DisplayOneChar (9, 1, ASCII[ display1[0] ] );
DisplayOneChar (10, 1, 0xdf );
DisplayOneChar (11, 1, ASCII[11] ); //显示温度
}
//*******************************主函数
main()
{
tem=0;
hum=0;
delay_ms(1000); //DTH11开始1s有错误输出
InitLcd1602();
while(1)
{
DTH11_DUSHU();
Display_DTH11();
delay_ms(2000);
}
}