资源描述
基于89C51单片机SHT11温湿度传感器电路图于程序作者: 张志杰
SHT11、h文件:
#ifndef __SHT11_H__
#define __SHT11_H__
/*************************
SHT11相关命令
**************************/
#define uchar unsigned char
#define uint unsigned int
#define TEM_TEST 0x03//温度检测命令
#define HUM_TEST 0x05//湿度检测命令
#define REG_READ 0x07//读寄存器
#define REG_WRITE 0x06//写寄存器
#define FUNCTION_SET 0x01//设置SHT11得工作精度为8位/湿度 12位温度
/**************************
SHT11端口定义
***************************/
sbit SHT11_DATA=P3^1;
sbit SHT11_SCK=P3^0;
sbit P33=P3^3;
sbit P32=P3^2;
sbit P36=P3^6;
sbit P37=P3^7;
uchar flag_tempeture=0; //显示温度位置得标志
uchar flag_humidity=0; //显示湿度位置得标志
uchar code str1[]={ 0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//温度图标
uchar code str6_sht11[]="%RH ";
uchar code str4_sht11[]="humi=";
uchar code str2_sht11[]="temp=";
uchar code str7_sht11[]=" ";//清除没不要得显示
/***************************
函数名称:Delay
函数功能:SHT11内部延时
****************************/
void Delay
{
;
;
}
/***************************
函数名称:Delay_Ms
函数功能:SHT11检测等待延时
函数说明:11ms/55ms/210ms 分别对应8位/12位/14位 测量结果
对应得形参为N 则延时Nms
****************************/
void Delay_Ms(uint ms) // ms延时函数 (AT89C51 11、0592MHz)
{
uint i;
uchar j;
for(i=0;i<ms;i++)
{
for(j=0;j<200;j++);
for(j=0;j<102;j++);
}
}
/**************************
函数功能:SHT11启动时序
***************************/
void SHT11_Start
{
SHT11_SCK=1;
SHT11_DATA=1;
Delay;
SHT11_DATA=0;
Delay;
SHT11_SCK=0;
Delay;
SHT11_SCK=1;
Delay;
SHT11_DATA=1;
}
/******************************
函数名称:SHT11_Sendbyte(uchar dat)
函数功能: 向SHT11发送8bite数据
******************************/
void SHT11_Sendbyte(uchar dat)
{
uchar i;
SHT11_SCK=0;
Delay;
for(i=0;i<8;i++)
{
if(dat&0x80)
{
SHT11_DATA=1;
Delay;
}
else
{
SHT11_DATA=0;
Delay;
}
dat=dat<<1;
SHT11_SCK=1;
Delay;
SHT11_SCK=0;
}
}
/*********************************
函数名称SHT11_Answer:
函数功能:检测SHT11得响应信号(在第九个时钟周期)
***********************************/
void SHT11_Answer
{
SHT11_SCK=1;
Delay;
while(SHT11_DATA==1);
SHT11_SCK=0;
SHT11_DATA=1;
}
/************************************
函数名称:SHT11_Test_Finish
函数功能:检测SHT11温湿度检测就是否完毕
*************************************/
void SHT11_Test_Finish
{
while(SHT11_DATA==1);
}
/************************************
函数名称:SHT11_Receivebyte
函数功能:从SHT11接收8bite数据
*************************************/
uchar SHT11_Receivebyte
{
uchar i;
uchar dat;
SHT11_SCK=0;
Delay;
for(i=0;i<8;i++)
{
SHT11_SCK=1;
Delay;
dat=dat<<1;
if(SHT11_DATA)
{
dat=dat|0x01;
Delay;
}
else
{
dat=dat&0xfe;
Delay;
}
SHT11_SCK=0;
Delay;
}
SHT11_DATA=1; //释放数据总线
return(dat);
}
/***********************************
函数名称:MCU_Answer
函数功能:单片机向SHT11发送应答信号
*************************************/
void MCU_Answer
{
SHT11_SCK=0;
Delay;
SHT11_DATA=0;
Delay;
SHT11_SCK=1;
Delay;
SHT11_SCK=0;
Delay;
SHT11_DATA=1; //释放数据总线 这条指令非常重要 不加得话导致单片机不能读取低8位
}
/***********************************
函数名称:SHT11_End
当接收两个8byte数据后部接收CRC校验码
************************************/
void SHT11_End
{
SHT11_DATA=1;
SHT11_SCK=1;
Delay;
SHT11_SCK=0;
Delay;
}
/*************************************
函数名称:void SHT11_Write_Register(uchar mand ,uchar dat)
函数说明:向SHT11得状态寄存器设置功能
mand为REG_WRITE 0x06写寄存器
dat为 设置SHT11得功能 可以设置检测得数据位数
*/
void SHT11_Write_Register(uchar mand ,uchar dat)
{
SHT11_Start;
SHT11_Sendbyte(mand);
SHT11_Answer;
SHT11_Sendbyte(dat);
SHT11_Answer;
}
/***************************************
函数名称:uchar SHT11_Read_Register(uchar mand)
函数说明:mand为REG_READ 0x07//读寄存器
返回值为状态寄存器得值
位6显示当前检测完一次数据后电源供电情况
当位6为0时表明VDD>2、47V 当位6为1时表明VDD<2、47V即电量不足
位0表明当前得测量分辨率
当位0为1时表明测量精度:8位/湿度 12位温度
当位0为0时表明测量精度:12位湿度 14位温度
默认为0
*******************************************/
uchar SHT11_Read_Register(uchar mand)
{
uchar dat;
SHT11_Start;
SHT11_Sendbyte(mand);
SHT11_Answer;
dat=SHT11_Receivebyte;
SHT11_End;
return(dat);
}
/***************************************
函数名称:SHT11_Measure(uchar mand,uint time);
函数功能:设置SHT11检测功能,并返回相应得检测结果
函数说明:mand形参用于设定温度检测还就是湿度检测,
time形参用于设定检测过程中得等待时间,以确定检测结果得位数
11ms/55ms/210ms 分别对应8位/12位/14位
****************************************/
uint SHT11_Measure(uchar mand,uchar time)
{
uint dat=0;
uchar data_high,data_low;
SHT11_Start;
SHT11_Sendbyte(mand);
SHT11_Answer;
Delay_Ms(time);
SHT11_Test_Finish;
data_high=SHT11_Receivebyte;
MCU_Answer;
data_low=SHT11_Receivebyte;
SHT11_End;
dat=(dat|data_high);
dat=(dat<<8)|data_low;
return(dat);
}
/****************************************
函数名称:Convert_Tempeture12bit(uint dat);
函数功能:将检测到得数据转化为相应得温度数据
函数说明:温度转换公式T=d1+d2*SOt
公式中得参数d1=40,d2=0、04
适用于12位测量精度
*/
float SHT11_Convert_Tempeture12bit(uint dat)
{
float tempeture1;
tempeture1=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=(tempeture25)*(t1+t2*SOrh)+RHline
公式中得参数:C1=4,C2=0,648,C3=0、00072
t1=0、01,t2=0、00128
适用于8位测量精度
*/
uint SHT11_Convert_Humidity8bit(uint dat,float temp)
{
float RHline,RHtrue;
uint r;
RHline=4+0、648*dat0、00072*dat*dat;
RHtrue=(temp25)*(0、01+0、00128*dat)+RHline;
r=(RHtrue3)*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);
}
#endif
Display、c文件:
#include <reg52、h>
#include "SHT11、h"
#define uchar unsigned char
#define uint unsigned int
#define TEM_TEST 0x03//温度检测命令
#define HUM_TEST 0x05//湿度检测命令
#define REG_READ 0x07//读寄存器
#define REG_WRITE 0x06//写寄存器
#define FUNCTION_SET 0x01//设置SHT11得工作精度为8位/湿度 12位温度
uchar DispData[4] = {0, 1, 2, 3};
code uchar DispSegmentP0[10]={0x3f,0x06,0x1b,0x0f,0x26,0x2d,0x3d,0x07,0x3f,0x2f};
code uchar DispSegmentP2[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, 0xbf ,0x7F};
sbit P16=P1^6;
sbit P26=P2^6;
sbit P34=P3^4;
void Temp_delay(unsigned 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 = DispSegmentP0[*Buffer];
P2 = DispSegmentP2[*Buffer];
if(P16==0)
P26=1;
Temp_delay(2);
Buffer++;
}
}
void DispConvert(uchar *DispAddr, uint Temp2Con)
{
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;
}
void main
{
uint temp;
uint dat;
uint Hum;
//float f;
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);
}
else
{
P36=0;
P37=1;
DispConvert(DispData,temp*10);
}
}
}
还有些地方不就是很完美
展开阅读全文