基于51单片机WIFI智能家居系统设计

1、系统功能介绍

  • 1、本设计采用STC89C51/52单片机作为主控芯片,ESP8266实现WIFI远程数据传输,随时随地在外就可以远程监控家中情况,控制家电等;
    • 板子WIFI默认连接的WIFI【账号:DuoDuoXueZhang】【密码:123456789】、
    • 手机端发送以下指令:
      • 打开继电器1 :DKJDQ1
      • 关闭继电器1 :GBJDQ1
      • 打开继电器2 :DKJDQ2
      • 关闭继电器2 :GBJDQ2
      • 获取温湿度数据 :HQSJ
  • 2、采用DHT11温湿度传感器测量环境中的温湿度,LCD1602液晶显示屏实时显示,并通过WIFI实时传输到手机上;
  • 3、板子上加入两路继电器可以连接控制家电、风扇、电灯、空调等设备,继电器带有工作指示灯;
  • 4、可以通过按键设定温湿度报警值,并存储于AT24C02中,当实测值超过设定值时系统发送声光报警提醒;

2、演示视频

2.1、实物演示:

2.2、仿真演示

2.3、资料

  • 资料在对应视频简介中

3、系统电路介绍

3.1、STC89C51单片机最小系统设计

  • 采用STC89C51单片机作为主控芯片。STC89C51是宏晶科技公司生产的一款低功耗、高性能的八位CMOS微处理器,片内具有8k在线编程Flash存储器。STC89C51单片机的内核采用的是MCS-51内核,指令完全兼容MCS-51,但是该单片机越做了升级使得芯片具有很多传统的51单片机不具备的功能,例如该芯片还有4K的EEPROM存储,在需要使用到掉电存储数据的时候就可以直接使用单片机内部的存储,不在需要在外接存储芯片进行存储。STC89C51单片机具有的开发简单、可在线编程下载、成本低是非常不错的选择。

  • 单片机最小系统电路图如下图所示

  • 实物图:

3.2、LCD1602液晶显示电路设计

  • LCD1602液晶也叫LCD1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形。

  • DL-20无线串口透传模块是一款基于UART接口的全双工无线透明传输模块,可以工作在2400MHZZ-2450MHZ公用频段。该模块采用TI的CC2530芯片,具体型号为CC2530F256RHAR。符合IEEE802.15.4协议,通过该模块可以使传统的串口设备实现无线传输,替换掉复杂的布线工作。用于点对点通信、广播通信。即插即用,免开发,使用简单。

  • LCD1602引脚说明

  • 电路原理图

  • 实物图

3.3、WIFI模块的电路设计

  • WIFI模块采用的是ESP8266,该WIFI模块采用了串口的通讯协议与单片机之间进行通讯。单片机采用AT指令控制模块的工作。该模块无线传输速率最高可达150Mbps。信道个数可达到14个,频率范围2.4-2.4835G,发射功率12-15DBM,2 个以太网口、2 个串口。它的系统配置管理采用远程Web 管理。串口波特率非常宽,在1200~230400bps(支持非标准波特率)之间,工作温度:-20-70℃。

  • 由于该模块的工作电压为3.3V,而单片机采用的是5V,为了使得电源兼容,本设计通过两个二极管进行将5V电压降压到3.3V后供WIFI模块使用。

  • 电路设计如下图所示:

  • 实物图:

3.4、AT24C02电路设计

  • AT24C02是一个2K位串行CMOS E2PROM,内部含有256个8位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗。AT24C02有一个8字节页写缓冲器。该器件通过IIC总线接口进行操作,有一个专门的写保护功能。

  • 电路原理图:

  • 实物图:

4、程序设计

4.1、系统主程序设计

void main()
{
	delayms(200);
	if(key_jian==0)
	{
		delayms(100);
		if(key_jian==0)
		{
			AT24C02_write_date(0,85);//写入【湿度上限值】数据保存
			AT24C02_write_date(1,40);//写入【湿度下限值】数据保存
			AT24C02_write_date(2,38);//写入【温度上限值】数据保存
			AT24C02_write_date(3,16);//写入【温度下限值】数据保存
		}
	}
  
	humi_up=AT24C02_read_date(0);  //读取存储的【湿度上限值】数据
	humi_down=AT24C02_read_date(1);//读取存储的【湿度下限值】数据
	temp_up=AT24C02_read_date(2);  //读取存储的【温度上限值】数据
	temp_down=AT24C02_read_date(3);//读取存储的【温度下限值】数据
  
	LCD_init();				    //LCD1602初始化
	lcd1602_write_pic(0x00,pic);//将自定义字符“°”写入到LCD1602中
	ESP8266_init();			    //ESP8266初始化

	while(1)			        //死循环
	{	
		scan();		            //按键检测处理
		if(set_f==0)			//正常显示模式
		{
			T0_num++;			//循环变量+1
			if(T0_num>=100)		//每循环100次,进入读取、显示数据
			{
				T0_num=0;		//重置循环变量
				DHT11_read();   //读取DHT11温湿度
				display();	    //显示当前温、湿度
			}
		}
		else
			if(set_f<3)
				display2();	    //显示设置温度上下限
			else
				display3();  	//显示设置湿度上下限
	}
}

4.2、ESP8266连接WIFI

/********************************************************
函数名称:void ESP8266_zhuce()
函数作用:ESP8266配置参数
参数说明:
********************************************************/
void ESP8266_zhuce()
{
	lcd1602_write_character(0,1,"IP115.29.109.104");
	lcd1602_write_character(0,2,"Port:6593       ");

	ESP8266_delayms(150); 
	lcd1602_write_character(0,2,"ESP8266 init... ");

	ES=1;//允许串口中断
	//设置 AP 和 STA 共存模式
	clearBuff();	   //清除缓存
	lcd1602_write_character(0,2,"Set AP and STA  ");
	ESP8266_send_string(CWMODE);
	while(!Hand("OK")&&key_skip);

	//连接 wifi
	clearBuff();	   //清除缓存
	lcd1602_write_character(0,2,"Connect the WIFI");
	ESP8266_send_string(CWJAP2);
	while(!(Hand("OK")||Hand("FAIL"))&&key_skip);

	//连接失败,重新链接
	if(Hand("FAIL"))
	{
		lcd1602_write_character(0,1,"Connection fails");
		lcd1602_write_character(0,2,"Please open WIFI");
	
		while(!Hand("OK")&&key_skip)
		{
			clearBuff();	   //清除缓存
			ESP8266_send_string(CWJAP2);
			while(!(Hand("OK")||Hand("FAIL"))&&key_skip);
		}
		lcd1602_write_character(0,1,"ESP8266 init... ");	
	}

	//设置单连接
	clearBuff();	   //清除缓存
	lcd1602_write_character(0,2,"Set single link ");
	ESP8266_send_string(CIPMUX);
	while(!Hand("OK")&&key_skip);

	//设置透传模式
	clearBuff();	   //清除缓存
	lcd1602_write_character(0,2,"Set passthrough ");
	ESP8266_send_string(CIPMODE);
	while(!Hand("OK")&&key_skip);

	//连接外网服务器
	clearBuff();	   //清除缓存
	lcd1602_write_character(0,2,"Connect server  ");
	ESP8266_send_string(CIPSTART);
	while(!Hand("OK")&&key_skip);

	//设置发送数据
	clearBuff();	   //清除缓存
	lcd1602_write_character(0,2,"Set send data   ");
	ESP8266_send_string(CIPSEND);
	while(!Hand(">")&&key_skip);

	LCD_write_command(0x01);
	delay_n40us(100);
}

4.3、DHT11读取温湿度

/********************************************************
函数名称:void DHT11_read(void)
函数作用:读取DHT11温湿度
参数说明:
********************************************************/
void DHT11_read(void)
{
	DHT11_DB=0;						  //拉低DHT11信号线
	Delay_ms(20);					  //延时20ms
	DHT11_DB=1;						  //拉高DHT11信号线
	Delay_us(60);					  //延时60us
	if(!DHT11_DB)					  //等待DHT11拉高响应
	{
		DHT11_num=2;				  //重置超时变量
		while(!DHT11_DB&&DHT11_num++);//等待DHT11变为高电平
		DHT11_num=2;				  //重置超时变量
		while(DHT11_DB&&DHT11_num++); //等待DHT11变为低电平
		Humi_H=DHT11_receive();		  //接收温度整数位
		Humi_L=DHT11_receive();		  //接收温度小数位
		Temp_H=DHT11_receive();		  //接收湿度整数位
		Temp_L=DHT11_receive();		  //接收湿度小数位
		Check_data=DHT11_receive();	  //接收数据校验位
		DHT11_DB=1;					  //拉高DHT11信号,结束本次数据读取
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

点灯师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值