一、主要功能
1、温湿度上下限阈值设定
2、超限声光报警加热/加湿
3、温湿度显示
二、使用步骤
系统运行后,LCD1602显示当前温湿度值,可通过K1键进入温湿度上限和下限阈值设置,并且LCD1602显示设置的值。通过K2和K3键进行阈值调整,设定好后可K4键保存并退出,返回主菜单显示。当检测温湿度值高于或低于上下限值时,控制声光报警,加热或加湿模块工作。
三、硬件资源
1、51单片机核心模块
2、按键模块
3、SHT11温湿度传感器模块
4、LED/蜂鸣器模块
5、继电器模块
6、LCD1602显示模块
四、软件设计
1、主要代码
代码如下:
u8 s_measure(u8 *p_value, u8 *p_checksum, u8 mode) //温湿度测量
{
u8 error=0;
u16 i;
s_transstart(); //启动传输
switch(mode) //选择发送命令
{
case TEMP : error+=s_write_byte(MEASURE_TEMP); break; //测量温度
case HUMI : error+=s_write_byte(MEASURE_HUMI); break; //测量湿度
default : break;
}
for (i=0;i<65535;i++) if(DATA==0) break; //等待测量结束
if(DATA) error+=1; // 如果长时间数据线没有拉低,说明测量错误
*(p_value) =s_read_byte(ACK); //读第一个字节,高字节 (MSB)
*(p_value+1)=s_read_byte(ACK); //读第二个字节,低字节 (LSB)
*p_checksum =s_read_byte(noACK); //read CRC校验码
return error; // error=1 通讯错误
}
//温湿度值标度变换及温度补偿
void calc_sth10(float *p_humidity ,float *p_temperature)
{
const float C1=-4.0; // 12位湿度精度 修正公式
const float C2=+0.0405; // 12位湿度精度 修正公式
const float C3=-0.0000028; // 12位湿度精度 修正公式
const float T1=+0.01; // 14位温度精度 5V条件 修正公式
const float T2=+0.00008; // 14位温度精度 5V条件 修正公式
float rh=*p_humidity; // rh: 12位 湿度
float t=*p_temperature; // t: 14位 温度
float rh_lin; // rh_lin: 湿度 linear值
float rh_true; // rh_true: 湿度 ture值
float t_C; // t_C : 温度 ℃
t_C=t*0.01 - 40; //补偿温度
rh_lin=C3*rh*rh + C2*rh + C1; //相对湿度非线性补偿
rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //相对湿度对于温度依赖性补偿
if(rh_true>100)rh_true=100; //湿度最大修正
if(rh_true<0.1)rh_true=0.1; //湿度最小修正
*p_temperature=t_C; //返回温度结果
*p_humidity=rh_true; //返回湿度结果
}
typedef struct //定义结构体类型
{
u16 i;
float f;
} value;
value humi_val,temp_val; //定义两个共同体,一个用于湿度,一个用于温度
void datapros() //数据处理 显示
{
u8 i;
if(mode==1) //温度上限数据处理
{
wendu[0]=wdh/100+'0'; //温度百位
wendu[1]=wdh%100/10+'0'; //温度十位
wendu[2]=wdh%10+'0'; //温度个位
wendu[3]=0x2E; //小数点
temp=temp_val.f*10;
wendu[4]=temp%10+'0'; //温度小数点后第一位
wrc(0x80);
for(i=0;i<6;i++)
{
wrd(d3[i]);
}
for(i=0;i<5;i++)
{
wrd(wendu[i]);
}
wrd(0xdf);
wrd('C');
}
if(mode==2) //温度下限数据处理
{
wendu[0]=wdl/100+'0'; //温度百位
wendu[1]=wdl%100/10+'0'; //温度十位
wendu[2]=wdl%10+'0'; //温度个位
wendu[3]=0x2E; //小数点
temp=temp_val.f*10;
wendu[4]=temp%10+'0'; //温度小数点后第一位
wrc(0x80+0x40);
for(i=0;i<6;i++)
{
wrd(d4[i]);
}
for(i=0;i<5;i++)
{
wrd(wendu[i]);
}
wrd(0xdf);
wrd('C');
}
if(mode==3) //湿度上限数据处理
{
shidu[0]=sdh/100+'0'; //湿度百位
shidu[1]=sdh%100/10+'0'; //湿度十位
shidu[2]=sdh%10+'0'; //湿度个位
shidu[3]=0x2E;
humi=humi_val.f*10; //小数点
shidu[4]=humi%10+'0'; //湿度小数点后第一位
wrc(0x80);
for(i=0;i<6;i++)
{
wrd(d5[i]);
}
for(i=0;i<5;i++)
{
wrd(shidu[i]);
}
wrd('%');
wrd('R');
wrd('H');
}
if(mode==4) //湿度下限数据处理
{
shidu[0]=sdl/100+'0'; //湿度百位
shidu[1]=sdl%100/10+'0'; //湿度十位
shidu[2]=sdl%10+'0'; //湿度个位
shidu[3]=0x2E;
humi=humi_val.f*10; //小数点
shidu[4]=humi%10+'0'; //湿度小数点后第一位
wrc(0x80+0x40);
for(i=0;i<6;i++)
{
wrd(d6[i]);
}
for(i=0;i<5;i++)
{
wrd(shidu[i]);
}
wrd('%');
wrd('R');
wrd('H');
}
}
void main()
{
u8 error; //用于检验是否出现错误
u8 checksum; //CRC
led=0;
init();
kai_display(); //开机界面显示
s_connectionreset(); //通讯复位
time0init(); //定时器0 初始化
while(1)
{
error=0;
error+=s_measure((u8*)&temp_val.i,&checksum,TEMP); //温度测量
error+=s_measure((u8*)&humi_val.i,&checksum,HUMI); //湿度测量
if(error!=0) s_connectionreset();
else
{
humi_val.f=(float)humi_val.i; //转换为浮点数
temp_val.f=(float)temp_val.i; //转换为浮点数
calc_sth10(&humi_val.f,&temp_val.f); //修正相对湿度及温度
temp=temp_val.f;
humi=humi_val.f-5;
}
data_change(); //数据比较
display(); //温湿度显示函数
//等待足够长的时间,以现行下一次转换
delay(100);
}
}
五、实验现象
B站演示视频:https://space.bilibili.com/444388619

联系作者
作者B站链接:https://space.bilibili.com/444388619
可提供手把手教学服务,资料获取请联系作者QQ:3443792007
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。
6490

被折叠的 条评论
为什么被折叠?



