• 方案介绍
  • 相关推荐
申请入驻 产业图谱

基于51单片机的WIFI遥控控制系统

04/20 13:35
261
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

基于51单片机的WIFI遥控控制系统

1、项目简介

1.1 系统功能

  • 功能介绍:
    • 1、本设计采用STC89C51/52单片机作为主控芯片,ESP8266实现WIFI远程数据传输,随时随地在外就可以远程控制家电等;
      • 板子WIFI默认连接的WIFI【账号:magic】【密码:123456789】
      • 手机端发送以下指令:
      • 打开继电器1 :DKJDQ1
      • 关闭继电器1 :GBJDQ1
      • 打开继电器2 :DKJDQ2
      • 关闭继电器2 :GBJDQ2
    • 2、板子上加入两路继电器可以连接控制家电、风扇、电灯、空调等设备,继电器带有工作指示灯;

1.2 演示视频

  • 演示视频:https://www.bilibili.com/video/BV1MuzfYJEtp

2、部分电路设计

2.1 51单片机核心板电路设计

  • ‌51单片机最小系统是确保51系列单片机能够正常工作的最基本电路配置,通常包括‌电源电路、‌晶振电路、‌复位电路。这些组件共同为单片机提供稳定的工作环境和必要的时钟信号,确保单片机能够准确地执行程序指令。‌
  • STC89C51是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash存储器。STC89C51使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU和在系统可编程Flash,使得STC89C51为众多嵌入式控制应用系统提供高灵活、非常有效的解决方案。具有以下标准功能:8k字节Flash,512字节RAM,32位I/O口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。另外STC89X52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz,6T/12T可选。
  • 单片机最小系统原理图如下图所示:

2.2 LCD1602液晶显示电路设计

  • LCD1602液晶也叫LCD1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形。
  • LCD1602一共具有11条指令,单片机发送这些指令到LCD1602上就可以完成一些特定的功能,比如清屏,开关显示等等。LCD1602自己带有字库在显示的时候可以直接调用字库进行显示,当然如果字库中没有的字符也可以根据需要自己自定义字符写入CGROM中,自定义字符的分辨率为5*8而却自定义字符数量有限需要合理的安排使用,最多可以自定义8个字符,将自定义字符字模写入LCD的CGROM中后就可以随意的调用,调用的方式和正常显示字符是一样的。

电路原理图:

实物图:

2.3 继电器驱动电路设计

  • ‌继电器是一个由电控制的元器件。通常,被用在需要自动控制的电路中。简单的说,继电器就是一个通过输入的小电流来控制大电流的输出的一个“自动开关”。因此在电路中继电器起着自动调节电路、转换电路、保护电路等作用。
  • 当使用51单片机进行控制继电器时候由于单片机IO口输出电流在4~20mA之间,而继电器工作吸合电流大约在40mA,所以采用直接控制是无法驱动的。需要添加一个电流放大电路

其具体电路原理图如下图所示:

实物图如下:

2.4、WIFI模块的设计

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

其具体电路原理图如下图所示:

实物图:

3、单片机代码展示

3.1 LCD1602显示程序

void lcd_clear(void)
{
	lcd_write_com(0x01);
	delay_ms(5);
}

void lcd_write_com(unsigned char byte)//写指令
{
	RS = 0;//命令
	RW = 0;//写
	E = 1;
	DataPort = byte;//装载指令码
	_nop_();
	_nop_();
	delay_ms(1);
	E = 0;    
}

void lcd_write_data(unsigned char byte)//写数据
{
	RS = 1;//数据
	RW = 0;//写
	E = 1;
	DataPort = byte;//数据装载
	_nop_();
	_nop_();
	delay_ms(1);
	E = 0;
}

void lcd_init()
{
	delay_ms(5);
	lcd_write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口
	delay_ms(5);
	lcd_write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口
	delay_ms(5);
	lcd_write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口
	delay_ms(5);
	lcd_write_com(0x08); //关闭显示
	delay_ms(5);
	lcd_write_com(0x01);//清屏指令
	delay_ms(5);
	lcd_write_com(0x06);
	delay_ms(5);
	lcd_write_com(0x0c);
	delay_ms(5); 
}
void lcd_write_char(unsigned char x,unsigned char y,unsigned char byte)//在指定位置显示一个字符
{
  if(0 == y)
	{
		lcd_write_com(0x80 + x);//第一行
	}
  else if(1 == y)
	{
		lcd_write_com(0x80 + 0x40 + x);//第二行
	}
	lcd_write_data(byte);
}

void lcd_write_str(unsigned char x, unsigned char y, unsigned char *s)//在指定位置显示一个字符串
{
	 if(0 == y)
		{
			lcd_write_com(0x80 + x);//第一行
		}
	  else
		{
			lcd_write_com(0x80 + 0x40 + x);//第二行
		}
		
		while(*s)//判断是否检测到结束符
		{
			lcd_write_data(*s);//显示一个字符
			s++;//指针加1
		}
		
}

相关推荐