基于51单片机的WIFI智能家居系统设计详解
基于51单片机WIFI智能家居系统设计
1、系统功能介绍
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信号,结束本次数据读取
}
}
作者:点灯师