基于单片机SHT11温湿度传感器电路图于程序文档格式.docx
《基于单片机SHT11温湿度传感器电路图于程序文档格式.docx》由会员分享,可在线阅读,更多相关《基于单片机SHT11温湿度传感器电路图于程序文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
//显示温度位置的标志
ucharflag_humidity=0;
//显示湿度位置的标志
ucharcodestr1[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};
//温度图标
ucharcodestr6_sht11[]="
%RH"
;
ucharcodestr4_sht11[]="
humi="
ucharcodestr2_sht11[]="
temp="
ucharcodestr7_sht11[]="
"
//清除没不要的显示
/***
函数名称:
Delay()
函数功能:
SHT11内部延时
****/
voidDelay()
{
;
}
Delay_Ms()
SHT11检测等待延时
函数说明:
11ms/55ms/210ms分别对应8位/12位/14位测量结果
对应的形参为N则延时Nms
voidDelay_Ms(uintms)//ms延时函数(AT89C51@
uinti;
ucharj;
for(i=0;
i<
ms;
i++)
{
for(j=0;
j<
200;
j++);
102;
}
SHT11启动时序
voidSHT11_Start()
SHT11_SCK=1;
SHT11_DATA=1;
Delay();
SHT11_DATA=0;
SHT11_SCK=0;
/
函数名称:
SHT11_Sendbyte(uchardat)
向SHT11发送8bite数据
voidSHT11_Sendbyte(uchardat)
uchari;
8;
if(dat&
0x80)
else
dat=dat<
<
1;
函数名称SHT11_Answer():
检测SHT11的响应信号(在第九个时钟周期)
*****/
voidSHT11_Answer()
while(SHT11_DATA==1);
SHT11_Test_Finish()
检测SHT11温湿度检测是否完毕
*/
voidSHT11_Test_Finish()
SHT11_Receivebyte()
从SHT11接收8bite数据
ucharSHT11_Receivebyte()
uchardat;
{
if(SHT11_DATA)
dat=dat|0x01;
dat=dat&
0xfe;
//释放数据总线
return(dat);
/*****
MCU_Answer()
单片机向SHT11发送应答信号
voidMCU_Answer()
//释放数据总线这条指令非常重要不加的话导致单片机不能读取低8位
SHT11_End()
当接收两个8byte数据后部接收CRC校验码
voidSHT11_End()
voidSHT11_Write_Register(ucharcommand,uchardat)
函数说明:
向SHT11的状态寄存器设置功能
command为REG_WRITE0x06写寄存器
dat为设置SHT11的功能可以设置检测的数据位数
SHT11_Start();
SHT11_Sendbyte(command);
SHT11_Answer();
SHT11_Sendbyte(dat);
ucharSHT11_Read_Register(ucharcommand)
command为REG_READ0x07//读寄存器
返回值为状态寄存器的值
位6显示当前检测完一次数据后电源供电情况
当位6为0时表明VDD>
当位6为1时表明VDD<
即电量不足
位0表明当前的测量分辨率
当位0为1时表明测量精度:
8位/湿度12位温度
当位0为0时表明测量精度:
12位湿度14位温度
默认为0
dat=SHT11_Receivebyte();
SHT11_End();
SHT11_Measure(ucharcommand,uinttime);
设置SHT11检测功能,并返回相应的检测结果
command形参用于设定温度检测还是湿度检测,
time形参用于设定检测过程中的等待时间,以确定检测结果的位数
11ms/55ms/210ms分别对应8位/12位/14位
uintSHT11_Measure(ucharcommand,uchartime)
uintdat=0;
uchardata_high,data_low;
Delay_Ms(time);
SHT11_Test_Finish();
data_high=SHT11_Receivebyte();
MCU_Answer();
data_low=SHT11_Receivebyte();
dat=(dat|data_high);
dat=(dat<
8)|data_low;
/****
Convert_Tempeture12bit(uintdat);
将检测到的数据转化为相应的温度数据
温度转换公式--T=d1+d2*SOt
公式中的参数d1=-40,d2=
适用于12位测量精度
floatSHT11_Convert_Tempeture12bit(uintdat)
floattempeture1;
tempeture1=-40+*dat;
if(tempeture1>
23)
tempeture1=tempeture1+1;
55)
if(P37==1)
=16&
&
tempeture1<
30)
P33=1;
P32=0;
P33=0;
P32=1;
return(tempeture1);
SHT11_Convert_Humidity8bit(uintdat,floattemp)
将检测到的数据转化为相应的湿度数据
相对湿度转换公式-----RHline=C1+C2*SOrh+C3*SOrh*SOrh(检测数据的线性化SOrh为单片机接收到的数据)
-----RHtrue=(tempeture-25)*(t1+t2*SOrh)+RHline
公式中的参数:
C1=-4,C2=0,648,C3=
t1=,t2=
适用于8位测量精度
uintSHT11_Convert_Humidity8bit(uintdat,floattemp)
floatRHline,RHtrue;
uintr;
RHline=-4+**dat*dat;
RHtrue=(temp-25)*+*dat)+RHline;
r=(RHtrue-3)*10+;
if(P37==0)
if(r>
=400&
r<
600)
=600)
return(r);
#endif
#include<
>
#include"
"
ucharDispData[4]={0,1,2,3};
codeucharDispSegmentP0[10]={0x3f,0x06,0x1b,0x0f,0x26,0x2d,0x3d,0x07,0x3f,0x2f};
codeucharDispSegmentP2[10]={0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x00,0x22,0x22};
//0123456789%
codeucharDispCtrl[4]={0xef,0xdF,0xbf,0x7F};
sbitP16=P1^6;
sbitP26=P2^6;
sbitP34=P3^4;
voidTemp_delay(unsignedintj)
for(i=100;
i>
0;
i--)
for(j;
j>
j--);
voidShow(uchar*Buffer)
for(i=0;
i<
4;
i++)
P1=DispCtrl[i];
P0=DispSegmentP0[*Buffer];
P2=DispSegmentP2[*Buffer];
if(P16==0)
P26=1;
Temp_delay
(2);
Buffer++;
voidDispConvert(uchar*DispAddr,uintTemp2Con)
DispAddr[0]=Temp2Con/1000;
DispAddr[1]=(Temp2Con-DispAddr[0]*1000)/100;
DispAddr[2]=(Temp2Con-DispAddr[0]*1000-DispAddr[1]*100)/10;
DispAddr[3]=Temp2Con-DispAddr[0]*1000-DispAddr[1]*100-DispAddr[2]*10;
}
voidmain()
uinttemp;
uintdat;
uintHum;
//floatf;
while
(1)
Show(DispData);
SHT11_Write_Register(REG_WRITE,FUNCTION_SET);
temp=SHT11_Measure(TEM_TEST,0x37);
temp=SHT11_Convert_Tempeture12bit(temp);
dat=SHT11_Measure(HUM_TEST,0x0b);
Hum=SHT11_Convert_Humidity8bit(dat,temp);
if(P34==0)
P36=1;
P37=0;
DispConvert(DispData,Hum);
P36=0;
P37=1;
DispConvert(DispData,temp*10);
}
还有些地方不是很完美