本文主要是介绍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~90xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef, ///带小数点0~90x40};
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,这里是20mss_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); //延时60usif(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);}}
}
这篇关于dht11测量温湿度基于stc89c52的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!