基于单片机的温湿度控制系统

1.设计任务

利用AT89C51单片机为核心控制元件,设计一个简易温湿度控制系统,设计的系统实用性强、操作简单,实现了智能化、数字化。

2. 设计要求

2.1系统方案论证

根据设计任务,分析设计系统的组成,给出实现设计任务的几种方案,分析比较几种设计方案的优略,本着尽量以软件代替硬件,同时力求电路简单,工作可靠的原则,确定总体设计方案。

2.2系统硬件电路设计

根据系统设计方案进行软、硬件的分配,软、硬件设计分别进行。硬件设计包括单片机最小系统和扩展接口及配置,硬件结构在设计时要选择合适的元器件,硬件电路要简洁、工作可靠,需用Proteus绘制整个系统的电路仿真原理图。

主函数:

#include<reg51.h>
#include<intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit rs=P2^6;
sbit rw=P2^5;
sbit e=P2^7;
sbit SCK=P1^6;
sbit DATA=P1^7;
sbit k1=P2^0;  //ÎÂʪ¶ÈÉ趨
sbit k2=P2^1;  //¼Ó
sbit k3=P2^2;  //¼õ
sbit k4=P2^3;  //Í˳öÉ趨
sbit beep=P2^4;//·äÃùÆ÷
sbit led=P3^0; //ledָʾµÆ

sbit relay1=P3^5; //  ¼Óʪ
sbit relay2=P3^6; //¼ÓÈÈ 

	
	//µØÖ·  ÃüÁî  ¶Á/д
#define STATUS_REG_W 0x06   //000   0011    0
#define STATUS_REG_R 0x07   //000   0011    1
#define MEASURE_TEMP 0x03   //000   0001    1
#define MEASURE_HUMI 0x05   //000   0010    1
#define RESET        0x1e   //000   1111    0
#define ACK 1
#define noACK 0
u8 code d1[]="Temp: ";
u8 code d2[]="Humi: ";
u8 code d3[]="TempH:";
u8 code d4[]="TempL:";
u8 code d5[]="HumiH:";
u8 code d6[]="HumiL:";
u16 temp,humi;
u8 wendu[5],shidu[5];
u8 mode,shedingok;
int wdh=30,wdl=20,sdh=30,sdl=20;
u8 sbuf[4];


enum {TEMP,HUMI};
void delay(u16 i)
{
	while(i--);
}
void wrc(u8 c)	 //дÃüÁî
{
	delay(1000);
	rs=0;
	rw=0;
	e=0;
	P0=c;
	e=1;
	delay(10);
	e=0;
}
void wrd(u8 dat)	  //дÊý¾Ý
{
	delay(1000);
	rs=1;
	rw=0;
	e=0;
	P0=dat;
	e=1;
	delay(10);
	e=0;
	rs=0;
}
void init()
{
	delay(1000);
	wrc(0x38);
	wrc(0x38);
	wrc(0x38);
	wrc(0x06);
	wrc(0x0c);
	wrc(0x01);
}
void s_transstart()  //Æô¶¯´«Êä
{
	DATA=1;
	SCK=0;
	delay(1);	
	SCK=1;
	delay(1);
	DATA=0;
	delay(1);
	SCK=0;
	delay(1);
	SCK=1;
	delay(1);
	DATA=1;
	delay(1);
	SCK=0;
	delay(1);
}
void s_connectionreset() //ͨѶ¸´Î»
{
	u8 i;
	DATA=1;
	for(i=0;i<9;i++)
	{
		SCK=0;
		delay(1);
		SCK=1;
		delay(1);
	}
	s_transstart();  //Æô¶¯´«Êä
}
u8 s_write_byte(u8 dat)	//sht11дÊý¾Ý
{
	u8 i,error=0;;
	SCK=0;
	delay(1);
	for(i=0;i<8;i++)	
	{
		if((dat&0x80)==0x80)	//ÏÈ´«¸ßλÔÚ´«µÍλ
			DATA=1;
		else
			DATA=0;
		dat<<=1;
		SCK=1;
		delay(1);
		SCK=0;
		delay(1);	
	}
	DATA=1;		 //ÊÍ·ÅÊý¾ÝÏß
	error=DATA;		 //¼ì²éÓ¦´ðÐźţ¬È·ÈÏͨѶÕý³£
	delay(1);	  
	SCK=1;
	delay(1);
	SCK=0;
	delay(1);
	DATA=1;
	return error;    //error=1 ͨѶ´íÎó
}
u8 s_read_byte(u8 ack)    //sht11дÊý¾Ý
{
	u8 i,val=0;
	DATA=1;
	SCK=0;
	delay(1);
	for(i=0;i<8;i++)	
	{
		val<<=1;
		if(DATA==1)
		{
			val|=0x01;
		}
		SCK=1;
		delay(1);
		SCK=0;
		delay(1);	
	}
	DATA=!ack;	  //ACKλ
	SCK=1;
	delay(1);
	SCK=0;
	delay(1);
	DATA=1;		//ÊÍ·ÅÊý¾ÝÏß
	return val;	
}
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 sound()   //Éù¹â±¨¾¯
{
	u8 i=100;
	while(i--)
	{
		beep=~beep;
		delay(300);
		led=~led;
	}
}
void time0init()  //¶¨Ê±Æ÷0 ³õʼ»¯
{
	TMOD=0X01;
	TH0=0Xfc;
	TL0=0X18;  //É趨1ms¶¨Ê±
	TR0=1;
	EA=1;
	ET0=1;
}
void keypros()	//°´¼ü´¦Àíº¯Êý
{
	if(k1==0)	  //ÎÂʪ¶ÈÉ趨
	{
		delay(1000);
		if(k1==0)
		{
			mode++;
			shedingok=0;
			if(mode==5)mode=0;
			if(mode==1)wrc(0x01);
			if(mode==3)wrc(0x01);
		}
		while(!k1);
	}
	if(mode==1)	   // ζÈÉÏÏÞÉ趨
	{
		if(k2==0)		   //ζȼÓ
		{
			delay(1000);
			if(k2==0)
			{
				wdh+=5;	
				if(wdh>80)wdh=80;
			}
			while(!k2);	
		}
		if(k3==0)		   //ζȼõ
		{
			delay(1000);
			if(k3==0)
			{
				wdh-=5;
				if(wdh<0)wdh=0;
			}
			while(!k3);
		}			
	}

	if(mode==2)	   // ζÈÏÂÏÞÉ趨
	{
		if(k2==0)		   //ζȼÓ
		{
			delay(1000);
			if(k2==0)
			{
				wdl+=5;	
				if(wdh>80)wdh=80;
			}
			while(!k2);
		}
		if(k3==0)		   //ζȼõ
		{
			delay(1000);
			if(k3==0)
			{
				wdl-=5;
				if(wdh<0)wdh=0;
			}
			while(!k3);
		}			
	}

	if(mode==3)	   // ʪ¶ÈÉÏÏÞÉ趨
	{
		if(k2==0)		   //ʪ¶È¼Ó
		{
			delay(1000);
			if(k2==0)
			{
				sdh+=5;
				if(sdh>80)sdh=80;	
			}
			while(!k2);
		}
		if(k3==0)		   //ʪ¶È¼õ
		{
			delay(1000);
			if(k3==0)
			{
				sdh-=5;
				if(sdh<0)wdh=0;
			}
			while(!k3);
		}			
	}

	if(mode==4)	   // ʪ¶ÈÏÂÏÞÉ趨
	{
		if(k2==0)		   //ʪ¶È¼Ó
		{
			delay(1000);
			if(k2==0)
			{
				sdl+=5;	
				if(sdh>80)sdh=80;
			}
			while(!k2);
		}
		if(k3==0)		   //ʪ¶È¼õ
		{
			delay(1000);
			if(k3==0)
			{
				sdl-=5;
				if(sdh<0)wdh=0;
			}
			while(!k3);
		}			
	}
	if(k4==0)	  //Í˳öÉ趨
	{
		delay(1000);
		if(k4==0)
		{
			mode=0;
			shedingok=1;
		}
		while(!k4);	
	}
	sbuf[0]=wdh;	//½«É趨ºÃµÄÎÂʪ¶ÈÉÏÏÂÏÞÖµ±£´æÔÚÊý×ésbufÄÚ
	sbuf[1]=wdl;
	sbuf[2]=sdh;
	sbuf[3]=sdl;
//	wrbytes(7,sbuf);		
}
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 data_change()  //Êý¾Ý±È½Ïº¯Êý
{
	if((temp>wdh)&&shedingok==1)//Èç¹û¼ì²âζȴóÓÚÉ趨ÉÏÏÞ  ¼ÓÈȹرգ¬
	{
		sound();   //Éù¹â±¨¾¯
		relay2=1;
	}
	if((temp<wdl)&&shedingok==1)//Èç¹û¼ì²âζȵÍÓÚÉ趨ÏÂÏÞ  ¼ÓÈÈ´ò¿ª£¬
	{
		sound();   //Éù¹â±¨¾¯
		relay2=0;
	}
	if((humi>sdh)&&shedingok==1)//Èç¹û¼ì²âʪ¶È´óÓÚÉ趨ÉÏÏÞ  ¼Óʪ¹Ø±Õ£¬
	{
		sound();   //Éù¹â±¨¾¯
		relay1=1;
	}
	if((humi<sdl)&&shedingok==1)//Èç¹û¼ì²âʪ¶ÈµÍÓÚÉ趨ÏÂÏÞ  ¼Óʪ´ò¿ª£¬
	{
		sound();   //Éù¹â±¨¾¯
		relay1=0;
	}
	
}
void kai_display()	  //¿ª»ú½çÃæÏÔʾ
{
	u8 i;
	wrc(0x00+0x80);	
	for(i=0;i<6;i++)
	{	
		wrd(d1[i]);
	}
	wrc(0x40+0x80);	
	for(i=0;i<6;i++)
	{	
		wrd(d2[i]);
	}		
}
void display()	   //ÎÂʪ¶ÈÏÔʾº¯Êý
{
	u8 i;	
	if(mode==0)
	{
		kai_display();	  //¿ª»ú½çÃæÏÔʾ
		wrc(0x06+0x80);
		wendu[0]=temp/100+'0';     		//ζȰÙλ 
		wendu[1]=temp%100/10+'0';     	//ζÈʮλ	
		wendu[2]=temp%10+'0';			//ζȸöλ
		wendu[3]=0x2E;						//СÊýµã
		temp=temp_val.f*10;
		wendu[4]=temp%10+'0';				//ζÈСÊýµãºóµÚһλ
		for(i=0;i<5;i++)
		{
			wrd(wendu[i]);
		}
		wrd(0xdf);
		wrd('C');
		
		wrc(0x46+0x80);
		shidu[0]=humi/100+'0';     		//ʪ¶È°Ùλ
		shidu[1]=humi%100/10+'0';     	//ʪ¶Èʮλ	
		shidu[2]=humi%10+'0';			//ʪ¶È¸öλ
		shidu[3]=0x2E;
		humi=humi_val.f*10;						//СÊýµã
		shidu[4]=humi%10+'0';				//ʪ¶ÈСÊýµãºóµÚһλ
		for(i=0;i<5;i++)
		{
			wrd(shidu[i]);
		}
		wrd('%');
		wrd('R');
		wrd('H');		
	}
	datapros(); //Êý¾Ý´¦Àí ÏÔʾ			 		
}
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);	
	}		
}
void time0() interrupt 1	 //¶¨Ê±Æ÷0ÖжϺ¯Êý
{
//	static u16 j;
	TH0=0Xfc;
	TL0=0X18;  //É趨1ms¶¨Ê±
	keypros();
	
}

Proteus 仿真

完整代码点开链接私信  免费  获取。

【iBot机器人工作室的个人空间-哔哩哔哩】 https://b23.tv/ryUWVKa

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

K11mvp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值