收藏 分销(赏)

基于单片机SHT11温湿度传感器电路图于程序.doc

上传人:丰**** 文档编号:4361727 上传时间:2024-09-13 格式:DOC 页数:12 大小:109KB
下载 相关 举报
基于单片机SHT11温湿度传感器电路图于程序.doc_第1页
第1页 / 共12页
基于单片机SHT11温湿度传感器电路图于程序.doc_第2页
第2页 / 共12页
点击查看更多>>
资源描述
基于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); } } } 还有些地方不就是很完美
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服