【Proteus仿真】【51单片机】蔬菜大棚温湿度控制系统设计

文章目录

  • 一、主要功能
  • 二、使用步骤
  • 三、硬件资源
  • 四、软件设计
    • 1、主要代码
  • 五、实验现象
  • 联系作者

一、主要功能

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
【Proteus仿真】【51单片机】蔬菜大棚温湿度控制系统设计_第1张图片

联系作者

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

你可能感兴趣的:(单片机,嵌入式硬件,c语言,51单片机,proteus)