好文档 - 专业文书写作范文服务资料分享网站

基于89C51单片机SHT11温湿度传感器电路图于程序作者.docx

天下 分享 时间: 加入收藏 我要投稿 点赞

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 #i nclude \

#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); } } }

还有些地方不是很完美

9xzc65gn679x6b742rz56u75f0b43501d7b
领取福利

微信扫码领取福利

微信扫码分享