概述
系統(tǒng)通過SHT11溫濕度傳感器感應(yīng)周圍的環(huán)境的溫度和濕度,通過單片機對采集到的數(shù)據(jù)進行讀取處理,經(jīng)過LCD1602顯示模塊實時顯示溫濕度數(shù)據(jù),同時可以通過按鍵模塊對溫濕度報警上、下限值進行設(shè)定。獲取本文所有設(shè)計資源,請關(guān)注公眾號:交大小將。當(dāng)SHT11讀取的溫濕度值不再設(shè)定范圍內(nèi)時,報警模塊LED燈指示故障信息,同時蜂鳴器報警;當(dāng)溫濕度讀取數(shù)據(jù)正常后,LED燈熄滅,蜂鳴器關(guān)閉。
設(shè)計要求
1.設(shè)計一套基于51單片機的溫濕度Proteus仿真監(jiān)控系統(tǒng);
2.采用高精度的SHT11溫濕度傳感器模塊;
3.LCD液晶實時顯示當(dāng)前環(huán)境溫濕度值;
4.設(shè)計報警單元,實現(xiàn)對超限溫濕度監(jiān)控報警;
5.設(shè)計輸入單元,可調(diào)節(jié)系統(tǒng)正常溫濕度范圍;
6.仿真系統(tǒng)能夠可靠、穩(wěn)定地運行;
系統(tǒng)框架
溫濕度監(jiān)測系統(tǒng)主要是利用AT89C51單片機最小系統(tǒng)為核心,包括晶振電路、復(fù)位電路和排阻電路,SHT11溫濕度傳感器對環(huán)境溫濕度的采集,經(jīng)過單片機進行數(shù)據(jù)處理,最終通過LCD1602液晶顯示模塊準確、快捷、實時地顯示出當(dāng)前環(huán)境的溫度和濕度。獲取本文設(shè)計資源,包括仿真程序論文,請關(guān)注公眾號:交大小將。同時,按鍵模塊可設(shè)置溫濕度的上下限值,當(dāng)采集的數(shù)據(jù)不在設(shè)定范圍內(nèi)時,實現(xiàn)LED和蜂鳴器報警,從而達到對環(huán)境溫濕度監(jiān)測的目的。本系統(tǒng)的總體設(shè)計如下圖。
仿真運行結(jié)果
C程序設(shè)計
/*********************************************************///?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的溫濕度數(shù)據(jù)/*********************************************************/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; ???????}}
評論