概述
系統通過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; ???????}}
評論