最近的毕设好难啊!
DHT11是一款含有已校准数字信号输出的温湿度复合传感器,传感器包括一个电容式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。抗干扰能力强,有超长的信号传输距离,采用单总线的串行数据进行数据传输。
湿度量程范围:5~95%RH
温度量程范围:-20~60℃
典型电路如下图:
连线长度短于5m时采用4.7K上拉电阻,大于5m时可根据实际情况降低上拉电阻的阻值。
它的单总线格式定义为:
下面是最重要的程序:
/***************************************
STC89C52、DHT11、11.0592M晶振
共阴数码管、74hc573锁存器
***************************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char;
#define uint unsigned int;
sbit s_data=P3^6;
sbit dula=P2^6;
sbit wela=P2^7;
uchar rshi,rge,tshi,tge,tshifen;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f, ///不带小数点0~9
0xbf,0x86,0xdb,0xcf,0xe6,
0xed,0xfd,0x87,0xff,0xef, ///带小数点0~9
0x40};
void delayms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delayus(uchar z)
{
while(z--);
}
/*************************************
主机呼叫从机
*************************************/
void dht_start()
{
s_date=1;
delayms(5); //稍微延时一下
s_date=0;
delayms(23); //最下18ms最大30ms,这里是20ms
s_date=1;
delayus(0); //约11us
_nop_():
}
/************************************
读一个字节的数据
************************************/
uchar read_byte()
{
uchar a,i;
for(i=8;i>0;i--)
{
a<<=1;
while(!s_date);
delayus(3); //延时越过低电平
if(s_date==1)
{
a=a|0x01;
while(s_date); //延时越过高电平
}
}
return a;
}
/***********************************
读取并处理全部数据:5个字节
***********************************/
void hole_data()
{
uchar R_H,R_L,T_H,T_L,check;
dhtstart();
delayus(1);
if(s_data==0)
{
while(s_data==0);
while(s_data==1);
R_H=read_byte();
R_L=read_byte();
T_H=read_byte();
T_L=read_byte();
check=read_byte();
delayus(8); //延时60us
if(R_H+R_L+T_H+T_L==check)
{
rshi=R_H/10;
rge=R_H%10;
tshi=T_H/10;
tge=T_H%10;
tshifen=T_L%10;
}
}
}
/***********************************
数码管显示
***********************************/
void display(uchar rshi,uchar rge,uchar tshi,uchar tge,uchar tshifen)
{
wela=0;
P0=0x00;
dula=1;
P0=table[rshi];
dula=0;
P0=0xff;
wela=1;
P0=0xfe; ///消隐
wela=0;
delayms(1);
P0=0x00;
dula=1;
P0=table[rge]; ///显示R个位
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(1);
P0=0x00;
dula=1;
P0=table[tshi]; ///显示T十位
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delayms(1);
P0=0x00;
dula=1;
P0=table[tge+10]; ///显示T个位,带小数点
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delayms(1);
P0=0x00;
dula=1;
P0=table[tshifen]; ///显示T十分位
dula=0;
P0=0xff;
wela=1;
P0=0xef;
wela=0;
delayms(1);
}
/************************************
主函数
************************************/
void main()
{
uint i;
delayms(1000); //越过1S的不稳定状态
while(1)
{
hole_data();
for(i=900;i>0;i--)
{
display(rshi,rge,tshi,tge,tshifen);
}
}
}