UChar dat; SHT11_Start();
SHT11_Se ndbyte(comma nd); SHT11_A nswer();
dat=SHT11_ReCeiVebyte(); SHT11_E nd(); return(dat); }
/***************************************
函数名称:SHT11_MeaSUre(UChar command,uint time); 函数功能:设置SHT11检测功能,并返回相应的检测结果 函数说明:Command形参用于设定温度检测还是湿度检测
,
time形参用于设定检测过程中的等待时间,以确定检测结果的位数 11ms∕55ms∕210ms 分别对应 8位 /12 位 /14 位 ****************************************/
Uint SHT11_MeaSUre(UChar comma nd,uchar time) {
Uint dat=0;
UChar data_high,data_low; SHT11_Start();
SHT11_Se ndbyte(comma nd); SHT11_A nswer(); Delay_Ms(time); SHT11_TeSt_Fi ni sh();
data_high=SHT11_ReCeiVebyte(); MCU_A nswer();
data」OW=SHT11_Receivebyte(); SHT11_E nd(); dat=(dat|data_high); dat=(dat<<8)|data_low; return(dat); }
/**************************************** 函数名称:Convert_Tempeture12bit(uint dat); 函数功能:将检测到的数据转化为相应的温度数据 函数说明:温度转换公式--T=d1+d2*S0t
公式中的参数 d仁-40,d2=0.04 适用于12位测量精度
*/
float SHT11_Co nvert_Tempeture12bit(ui nt dat) {
float tempeture1;
tempeture 仁-40+0.04*dat; if(tempeture1>23)
tempeture1=tempeture1+1; if(tempeture1>55)
tempeture1=tempeture1+1; if(P37==1)
{
if(tempeture1>=16&&tempeture1<30) { P33=1; P32=0; } else { P33=0; P32=1; } }
return(tempeture1); }
/*****************************************
函数名称:SHT11_Convert_Humidity8bit(uint dat,float temp) 函数功能:将检测到的数据转化为相应的湿度数据
函数说明:相对湿度转换公式-----RHline=C1+C2*SOrh+C3*SOrh*SOrh( SOrh为单片机接收到的数据)
检测数据的线性化
——RHtrUe=(tempeture-25)*(t1+t2*S0rh)+RHIi ne 公式中的参
数:C仁-4,C2=0,648,C3=-0.00072
t1=0.01,t2=0.00128
适用于8位测量精度
*/
Uint SHT11_Co nvert_Humidity8bit(ui nt dat,float temp) {
float RHli ne,RHtrue; Uint r;
RHli ne=-4+0.648*dat-0.00072*dat*dat;
RHtrUe=(temp-25)*(0.01+0?00128*dat)+RHIi ne; r=(RHtrue-3)*10+0.5; if(P37==0) {
if(r>=400&&r<600) {
P33=1; } else { P33=0; } if(r>=600) {
P32=1; } else {
P32=0; } }
return(r); } #en dif
DiSPlay.c 文件: #in elude
#defi ne UChar Un Sig ned Char #defi ne Uint Un Sig ned int #defi ne TEM_TEST #defi ne HUM_TEST #defi ne REG_READ #defi ne REG_WRITE #define FUNCTION_SET
0x03〃温度检测命令 0x05〃湿度检测命令 0x07〃读寄存器
0x06〃写寄存器
0x01〃设置SHT11的工作精度为8位/湿度12位温度
UChar DiSPData[4] = {0, 1,2, 3};
code UChar DiSPSegme ntP0[10]={0x3f,0x06,0x1b,0x0f,0x26,0x2d,0x3d,0x07,0x3f,0x2f}; code UChar DiSPSegme ntP2[10]={0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x00,0x22,0x22};
// 0 1 2 3 4 5 6 7 8 9 % code UChar DiSPCtrl[4] = {0xef, 0xdF Sbit P16=P1^6;
Sbit P26=P2^6; Sbit P34=P3^4;
void TemP_delay (Un Sig ned int j) { UChar i; for(i=100;i>0;i--) {
for(j;j>0;j--); }
}
void ShOW(UChar *Buffer) {
UChar i;
for (i=0; i<4; i++) {
P1 = DiSPCtrl[i];
P0 = DiSPSegme ntP0[*Buffer]; P2 = DiSPSegme ntP2[*Buffer]; if(P16==0) P26=1;
TemP_delay(2); Buffer++; }
}
void DiSPC On Vert(UChar *DispAddr , Uint Temp2C On) {
DiSPAddr[0] = Temp2Co n/1000;
DiSPAddr[1] = (TemP2Con - DiSPAddr[0]*1000)/100;
DiSPAddr[2] = (TemP2Con - DiSPAddr[0]*1000 - DiSPAddr[1]*100)/10; DiSPAddr[3] = Temp2Con - }
void mai n() {
Uint temp; Uint dat; Ui nt Hum; //float f;
, 0xbf ,0x7F};
DiSPAddr[0]*1000 - DiSPAddr[1]*100 - DiSPAddr[2]*10;
while(1)
{
ShoW(DiSPData);
SHT11_Write_Register(REG_WRITE,FUNCTI0N_SET);
temp=SHT11_MeaSUre(TEM_TEST ,0x37); temp=SHT11_Co nvert_Tempeture12bit(temp); dat=SHT11_MeaSUre(HUM_TEST ,0x0b);
HUm=SHT11_Co nvert_Humidity8bit(dat,temp); if(P34==0) {
P36=1; P37=0;
DiSPC On Vert(DiSPData,Hum); } else {
P36=0; P37=1;
DiSPCO nvert(DispData,temp*10); } } }
还有些地方不是很完美