浅析SHT11温度湿度检测在51单片机中的应用

发表于 2020-04-03 14:36:13 收藏 已收藏
赞(2) •  评论(0

浅析SHT11温度湿度检测在51单片机中的应用

发表于 2020-04-03 14:36:13
+关注

概述
系统通过SHT11温湿度传感器感应周围的环境的温度和湿度,通过单片机对采集到的数据进行读取处理,经过LCD1602显示模块实时显示温湿度数据,同时可以通过按键模块对温湿度报警上、下限值进行设定。获取本文所有设计资源,请关注公众号:交大小将。当SHT11读取的温湿度值不再设定范围内时,报警模块LED灯指示故障信息,同时蜂鸣器报警;当温湿度读取数据正常后,LED灯熄灭,蜂鸣器关闭。

设计要求

1.设计一套基于51单片机的温湿度Proteus仿真监控系统;
2.采用高精度的SHT11温湿度传感器模块;
3.LCD液晶实时显示当前环境温湿度值;
4.设计报警单元,实现对超限温湿度监控报警;
5.设计输入单元,可调节系统正常温湿度范围;
6.仿真系统能够可靠、稳定地运行;

系统框架
温湿度监测系统主要是利用AT89C51单片机最小系统为核心,包括晶振电路、复位电路和排阻电路,SHT11温湿度传感器对环境温湿度的采集,经过单片机进行数据处理,最终通过LCD1602液晶显示模块准确、快捷、实时地显示出当前环境的温度和湿度。获取本文设计资源,包括仿真程序论文,请关注公众号:交大小将。同时,按键模块可设置温湿度的上下限值,当采集的数据不在设定范围内时,实现LED和蜂鸣器报警,从而达到对环境温湿度监测的目的。本系统的总体设计如下图。

仿真运行结果

C程序设计

/*********************************************************/// SHT11温湿度检测/*********************************************************/char ShtMeasure(unsigned char *p_value, unsigned char*p_checksum, unsigned char mode){        unsignederror=0;        unsignedint i;        ShtTransStart();         switch(mode)          {               case1 :                       error+=WriteByte(0x03);                      break;               case2 :                                  error+=ShtWriteByte(0x05);                      break;               default:                      break;        }        for(i=0;i<65535;i++)               if(Data_P==0)                      break;                if(Data_P)                      error+=1;         *(p_value)=ShtReadByte(1);        *(p_value-1)=ShtReadByte(1);        *p_checksum=ShtReadByte(0);        returnerror;      }/*********************************************************/// SHT11温湿度值标度变换及温度补偿/*********************************************************/void CalcSHT11(float *p_humidity ,float*p_temperature){        constfloat C1=-4.0        constfloat C2=+0.0405;          constfloat C3=-0.0000028;        constfloat T1=+0.01;        constfloat T2=+0.00008;        floatrh=*p_humidity;        floatt=*p_temperature;           floatrh_lin;         floatrh_true;              float t_C;        t_C=t*0.01- 40;        rh_lin=C3*rh*rh+ C2*rh + C1;        rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;        *p_temperature=t_C;        *p_humidity=rh_true;}/*********************************************************/// 温度校正/*********************************************************/unsigned char TempCorrect(int temp){        if(temp<0)    temp=0;        if(temp>970)  temp=970;        if(temp>235)  temp=temp+10;        if(temp>555)  temp=temp+10;        if(temp>875)  temp=temp+10;        temp=(temp%1000)/10;        returntemp;}/*********************************************************/// 湿度校正/*********************************************************/unsigned char HumiCorrect(unsigned int humi){        if(humi>999)  humi=999;        if((humi>490)&&(humi<951))  humi=humi-10;        humi=(humi%1000)/10;        returnhumi;}/*********************************************************/// 读取SHT11的温湿度数据/*********************************************************/void ReadShtData(){        valuehumi_val,temp_val;        unsignedchar error;        unsignedchar checksum;         unsignedint temp1,humi1;             error=0;        error+=ShtMeasure((unsignedchar*)&temp_val.i,&checksum,1);        error+=ShtMeasure((unsignedchar*)&humi_val.i,&checksum,2);          if(error!=0)               ShtConnectReset();        else        {               temp_val.f=(float)temp_val.i;               CalcSHT11(&humi_val.f,&temp_val.f);                   temp1=temp_val.f*10;               temp=TempCorrect(temp1);               humi1=humi_val.f*10-50;               humi=HumiCorrect(humi1);        humi = humi + 2;        }}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉

赞(2)

收藏

相关话题

评论(0)

加载更多评论

分享到

QQ空间 QQ好友 微博
取消