// 濕度20-90 溫度0-50 采樣間隔1S
#include <reg52.h>
#include <intrins.h>
#include "LCD1602display.h"
sbit DQ=P2^3; //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;
DisplayListChar(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;
DisplayListChar(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有錯誤輸出
InitLCM();
while(1)
{
DTH11_DUSHU();
Display_DTH11();
delay_ms(2000);
}
}
用到的LCD1602display.h頭文件這里有:http://www.zg4o1577.cn/mcu/3292.html