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 command ,uchar dat) 函数说明:向SHT11的状态寄存器设置功能
command为REG_WRITE 0x06写寄存器
dat为 设置SHT11的功能 可以设置检测的数据位数 */
void SHT11_Write_Register(uchar command ,uchar dat) {
SHT11_Start();
SHT11_Sendbyte(command); SHT11_Answer();
SHT11_Sendbyte(dat); SHT11_Answer(); }
/***************************************
函数名称:uchar SHT11_Read_Register(uchar command)
函数说明:command为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 command) {
uchar dat; SHT11_Start();
SHT11_Sendbyte(command); SHT11_Answer();
dat=SHT11_Receivebyte(); SHT11_End(); return(dat); }
/***************************************
函数名称:SHT11_Measure(uchar command,uint time); 函数功能:设置SHT11检测功能,并返回相应的检测结果 函数说明:command形参用于设定温度检测还是湿度检测, time形参用于设定检测过程中的等待时间,以确定检测结果的位数 11ms/55ms/210ms 分别对应8位/12位/14位 ****************************************/
uint SHT11_Measure(uchar command,uchar time) {
uint dat=0;
uchar data_high,data_low; SHT11_Start();
SHT11_Sendbyte(command); 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=(tempeture-25)*(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*dat-0.00072*dat*dat;
RHtrue=(temp-25)*(0.01+0.00128*dat)+RHline; 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); }
#endif
Display.c文件:
#include
#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) {