大哥求sht75程序,我用12864显示,原理一样,51单片机,不知道sht11跟这个程序一样吗,最好是75的啊,感谢
答案:2 悬赏:30 手机版
解决时间 2021-03-24 02:21
- 提问者网友:浩歌待明月
- 2021-03-23 18:27
大哥求sht75程序,我用12864显示,原理一样,51单片机,不知道sht11跟这个程序一样吗,最好是75的啊,感谢
最佳答案
- 五星知识达人网友:执傲
- 2021-03-23 19:27
原理是差不多的。
#include
#include
#include
#include
sfr P4 = 0xc0;
sfr WDT_CONTR = 0xc1;
#define Measure_TEMP 0x03 //温度
#define Measure_HUMI 0x05 //湿度
sbit TH_SCK = P3^6;
sbit TH_DAT = P3^7;
unsigned char TH_Array[3];
bit Error;
void Start(void)
{
TH_SCK = 1; //拉高SCK
TH_DAT = 0; //拉低DAT
_nop_(); //短时间延时,给硬件反应时间
TH_SCK = 0; //拉低SCK
_nop_();_nop_();_nop_(); //短时间延时,给硬件反应时间
TH_SCK = 1; //上拉SCK
TH_DAT = 1; //上拉DAT
_nop_(); //短时间延时,给硬件反应时间
TH_SCK = 0; //拉低SCK
}
void Write_Byte(unsigned char Value)
{
unsigned char i;
for (i = 0x80;i > 0;i /= 2) //8 个SCK 时钟的下降沿
{
if (i & Value)
TH_DAT = 1;
else
TH_DAT = 0;
TH_SCK = 1;
_nop_();_nop_();_nop_();
TH_SCK = 0;
} // 在第8 个SCK 时钟的下降沿之后,将DATA 下拉低电平,
// 在第9 个SCK 时钟的下降沿之后,释放DATA(恢复高电平)。
TH_DAT = 1;
TH_SCK = 1;
Error = TH_DAT; //读SHT75的应答
TH_SCK = 0; //第九脉冲后上拉数据线
//return Error; //为1就错
}
unsigned char Read_Byte (bit ack)
{
unsigned char i,val = 0;
TH_DAT = 1;
for (i = 0x80;i > 0;i /= 2)
{
TH_SCK = 1;
if (TH_DAT) val = (val | i);
TH_SCK = 0;
}
TH_DAT = !ack; //MCU要在每个字节后应答SHT75
TH_SCK = 1;
_nop_();_nop_();_nop_();
TH_SCK = 0;
TH_DAT = 1;
return val;
}
void Measure(unsigned char Mode)
{
unsigned int Wait_i;
Start(); //初始化启动时序
switch(Mode)
{
case 0x00:
Write_Byte(Measure_TEMP);
break; //0x00:温度测试
case 0x01:
Write_Byte(Measure_HUMI);
break; //0x01:湿度测试
default: break;
}
for (Wait_i = 0;Wait_i < 65535;Wait_i++)
{
WDT_CONTR = 0x35;
if(TH_DAT == 0)
break; //延时等待转换完成
}
if(Wait_i == 0xffff)
{
Error = 1;
return;
}
TH_Array[0] = Read_Byte(1);
TH_Array[1] = Read_Byte(1);
TH_Array[2] = Read_Byte(0);
}
unsigned int Calc_SHT90(void)
{
const float c1 = 4.0;
const float c2 = 0.0405; //在程序过程中不可改变的单精度浮点数
const float c3 = 0.0000028;
const float t1 = 0.01;
const float t2 = 0.00008;
float rh_lin;
float rh_ture;
float t_c;
unsigned int Temp_T;
unsigned int Temp_H;
unsigned char T_End; // 最后 温度
unsigned char H_End; //最后 湿度
unsigned int TH_Result;
unsigned int TH_Result_Bk; //最后温度,湿度
Error = 0;
Measure(0x00); //温度
memcpy(&Temp_T,TH_Array,2);
Measure(0x01); //湿度
memcpy(&Temp_H,TH_Array,2);
if(Error)
return(TH_Result_Bk);
t_c = Temp_T * 0.01 - 40 + 128; //温度
rh_lin = c2 * Temp_H - c3 * Temp_H * Temp_H - c1; //相对湿度
rh_ture = (t_c - 25 - 128) * (t1 + t2 * Temp_H) + rh_lin;// 相对湿度对于温度依赖性的补偿
T_End = t_c; //保存温度
H_End = rh_ture; //保存湿度
TH_Result = 0;
TH_Result = T_End;
TH_Result = TH_Result << 8; //读高8位温度数据
TH_Result = TH_Result + H_End; // 读低8位湿度数据
TH_Result_Bk = TH_Result; //最后高8位温度,低8位湿度
return(TH_Result); //高8位温度,低8位湿度
}来自:求助得到的回答
#include
#include
#include
#include
sfr P4 = 0xc0;
sfr WDT_CONTR = 0xc1;
#define Measure_TEMP 0x03 //温度
#define Measure_HUMI 0x05 //湿度
sbit TH_SCK = P3^6;
sbit TH_DAT = P3^7;
unsigned char TH_Array[3];
bit Error;
void Start(void)
{
TH_SCK = 1; //拉高SCK
TH_DAT = 0; //拉低DAT
_nop_(); //短时间延时,给硬件反应时间
TH_SCK = 0; //拉低SCK
_nop_();_nop_();_nop_(); //短时间延时,给硬件反应时间
TH_SCK = 1; //上拉SCK
TH_DAT = 1; //上拉DAT
_nop_(); //短时间延时,给硬件反应时间
TH_SCK = 0; //拉低SCK
}
void Write_Byte(unsigned char Value)
{
unsigned char i;
for (i = 0x80;i > 0;i /= 2) //8 个SCK 时钟的下降沿
{
if (i & Value)
TH_DAT = 1;
else
TH_DAT = 0;
TH_SCK = 1;
_nop_();_nop_();_nop_();
TH_SCK = 0;
} // 在第8 个SCK 时钟的下降沿之后,将DATA 下拉低电平,
// 在第9 个SCK 时钟的下降沿之后,释放DATA(恢复高电平)。
TH_DAT = 1;
TH_SCK = 1;
Error = TH_DAT; //读SHT75的应答
TH_SCK = 0; //第九脉冲后上拉数据线
//return Error; //为1就错
}
unsigned char Read_Byte (bit ack)
{
unsigned char i,val = 0;
TH_DAT = 1;
for (i = 0x80;i > 0;i /= 2)
{
TH_SCK = 1;
if (TH_DAT) val = (val | i);
TH_SCK = 0;
}
TH_DAT = !ack; //MCU要在每个字节后应答SHT75
TH_SCK = 1;
_nop_();_nop_();_nop_();
TH_SCK = 0;
TH_DAT = 1;
return val;
}
void Measure(unsigned char Mode)
{
unsigned int Wait_i;
Start(); //初始化启动时序
switch(Mode)
{
case 0x00:
Write_Byte(Measure_TEMP);
break; //0x00:温度测试
case 0x01:
Write_Byte(Measure_HUMI);
break; //0x01:湿度测试
default: break;
}
for (Wait_i = 0;Wait_i < 65535;Wait_i++)
{
WDT_CONTR = 0x35;
if(TH_DAT == 0)
break; //延时等待转换完成
}
if(Wait_i == 0xffff)
{
Error = 1;
return;
}
TH_Array[0] = Read_Byte(1);
TH_Array[1] = Read_Byte(1);
TH_Array[2] = Read_Byte(0);
}
unsigned int Calc_SHT90(void)
{
const float c1 = 4.0;
const float c2 = 0.0405; //在程序过程中不可改变的单精度浮点数
const float c3 = 0.0000028;
const float t1 = 0.01;
const float t2 = 0.00008;
float rh_lin;
float rh_ture;
float t_c;
unsigned int Temp_T;
unsigned int Temp_H;
unsigned char T_End; // 最后 温度
unsigned char H_End; //最后 湿度
unsigned int TH_Result;
unsigned int TH_Result_Bk; //最后温度,湿度
Error = 0;
Measure(0x00); //温度
memcpy(&Temp_T,TH_Array,2);
Measure(0x01); //湿度
memcpy(&Temp_H,TH_Array,2);
if(Error)
return(TH_Result_Bk);
t_c = Temp_T * 0.01 - 40 + 128; //温度
rh_lin = c2 * Temp_H - c3 * Temp_H * Temp_H - c1; //相对湿度
rh_ture = (t_c - 25 - 128) * (t1 + t2 * Temp_H) + rh_lin;// 相对湿度对于温度依赖性的补偿
T_End = t_c; //保存温度
H_End = rh_ture; //保存湿度
TH_Result = 0;
TH_Result = T_End;
TH_Result = TH_Result << 8; //读高8位温度数据
TH_Result = TH_Result + H_End; // 读低8位湿度数据
TH_Result_Bk = TH_Result; //最后高8位温度,低8位湿度
return(TH_Result); //高8位温度,低8位湿度
}来自:求助得到的回答
全部回答
- 1楼网友:执傲
- 2021-03-23 20:58
sht75和sht11是一样的,只是精度不同
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯