dht11测量温湿度基于stc89c52

最近的毕设好难啊!
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);
		}
	}
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值