51单片机连接ESP8266串口WiFi模块

通信设计应用

58人已加入

描述

  51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8004单片机,后来随着Flash rom技术的发展,8004单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。需要注意的是51系列的单片机一般不具备自编程能力。

  51单片机区别

  同样的一段程序,在各个单片机厂家的硬件上运行的结果都是一样的,如ATMEL的89C51(已经停产)、89S51, PHILIPS,和WINBOND等,我们常说的已经停产的89C51指的是ATMEL公司的 AT89C51单片机,同时是在原基础上增强了许多特性,如时钟,更优秀的是由Flash(程序存储器的内容至少可以改写1000次)存储器取代了原来的ROM(一次性写入),AT89C51的性能相对于8051已经算是非常优越的了。

  不过在市场化方面,89C51受到了PIC单片机阵营的挑战,89C51最致命的缺陷在于不支持ISP(在线更新程序)功能,必须加上ISP功能等新功能才能更好延续MCS-51的传奇。

  89S51就是在这样的背景下取代89C51的,89S51已经成为了实际应用市场上新的宠儿,作为市场占有率第一的Atmel公司已经停产AT89C51,将用AT89S51代替。89S51在工艺上进行了改进,89S51采用0.35新工艺,成本降低,而且将功能提升,增加了竞争力。89SXX可以向下兼容89CXX等51系列芯片。同时,Atmel不再接受89CXX的定单,大家在市场上见到的89C51实际都是Atmel前期生产的巨量库存而以。如果市场需要,Atmel当然也可以再恢复生产AT89C51。

  51单片机连接ESP8266串口WiFi模块

  引脚连接

  51单片机

  烧录固件

  打开烧录软件,选择配置选项卡,点击第二栏的小齿轮图标 - 加载固件地址

  51单片机

  点击其他选项的选择栏,取消选中,只选择第二个选项(固件地址)

  51单片机

  返回操作选项卡,选择正确COM端口,点击一键烧写

  模块重新上电,下载开始,等待下载完成

  

  串口助手测试ESP8266串口WiFi模块

  引脚连接

  51单片机

  注:此时连接状态 WiFi模块–》51单片机–》串口助手(PC),由于WiFi模块和单片机的TXD和RXD处于正接状态,单片机和WiFi模块并不通信,相当于WiFi模块直连串口助手。

  AT常用指令

  ESP8266串口WiFi模块分为三种工作模式:Station模式(类似无线终端),AP模式(提供无线接入服务),AP模式兼Station模式。

  通过串口助手测试WiFi模块时,

  测试

  发送指令:AT

  响应:OK

  重启模块

  发送命令:AT+RST

  响应 :OK

  设置模块

  发送指令:AT+CWMODE = 《mode》

  说明:需重启后生效(AT+RST)

  《mode》:1-Station模式,2-AP模式,3-AP兼Station模式。

  响应:OK

  配置AP参数

  发送命令:

  指令:AT+ CWSAP= 《ssid》,《pwd》,《chl》, 《ecn》

  说明:指令只有在AP模式开启后有效

  《ssid》:字符串参数,接入点名称

  《pwd》:字符串参数,密码最长64字节,ASCII

  《chl》:通道号

  《ecn》:加密模式,0-OPEN,1-WEP,2-WPA_PSK,3-WPA2_PSK,4-WPA_WPA2_PSK

  示例:AT+CWSAP=”TEST”,”123456123456”,1,3

  响应:OK

  开启多连接模式

  发送命令:AT+CIPMUX=《mode》

  说明:《mode》 :0-单路连接模式,1-多路连接模式

  响应:OK

  创建服务器

  发送命令:AT+CIPSERVER=《mode》,《port》

  说明:AT+ CIPMUX=1时才能开启服务器;关闭server模式需要重启。开启server后自动建立server监听,当有client接入会自动按顺序占用一个连接。

  《mode》:0-关闭server模式,1-开启server模式

  《port》:端口号,缺省值为333

  响应:OK

  通过51单片机初始化WiFi模块

  通过串口助手测试AT指令可以发现,部分AT指令断电不会保存,因此需要在代码中进行初始化设置。

  引脚连接

51单片机

  注:此时连接状态 WiFi模块–》51单片机–》串口助手(PC),由于WiFi模块和单片机的TXD和RXD处于正接状态,单片机和WiFi模块可以进行串口通信。

  实现代码

  #include《reg52.h》 //51单片机常用的头文件

  #define uchar unsigned char //宏定义一个无符号的char类型

  #define uint unsigned int //宏定义一个无符号的int类型

  //发送一字节

  void sendByte(uchar b)

  {

  SBUF = b;

  while(!TI);

  TI=0;

  }

  //发送字符串

  void sendString(uchar *s)

  {

  while(*s != ‘’) //字符串默认结尾‘’,以此来判断字符串的结束

  {

  sendByte(*s);

  s++;

  }

  }

  //初始化ESP8266WiFi模块

  void initEsp()

  {

  uint a;

  SCON = 0x50; //8位数据,可变波特率

  TMOD = 0x20; //设置定时器1位16位自动重装模式

  TL1 = 0xfd; //设置定时器初值,波特率为9600

  TH1 = 0xfd;

  ET1 = 0; //禁止定时器1中断

  TR1 = 1; //启动定时器1

  EA = 1;

  for (a=0; a《50000; a++); //延时几秒,让模块有时间启动

  sendString(“AT+CWMODE=2 ”); //设置为softAP和station共存模式

  //WiFi热点不能通过代码设置,可使用串口助手进行设置,该设置断电不丢失

  /*

  for (a=0; a《20000; a++);

  sendString(“AT+CWSAP=‘TEST’,‘12345678’,1,3 ”); //建立WiFi热点

  */

  for (a=0; a《50000; a++);

  sendString(“AT+CIPMUX=1 ”); //启动多连接

  for (a=0; a《20000; a++);

  sendString(“AT+CIPSERVER=1,333 ”);//建立server,端口为333

  for (a=0; a《20000; a++);

  sendString(“AT+CIPSTO=50 ”); //服务器超时时间设置

  RI=0;

  ES=1; //初始化完成,串行口中断打开

  }

  //主函数

  void main()

  {

  initEsp();

  }

  注:代码中波特率应和串口助手的波特率相符,且部分AT命令如重启模块,设置WiFi热点等指令无法使用。

  获取WiFi传输的数据

  ESP8266WiFi模块作为TCP服务器接受来自客户端的信息前默认会加上+IPD,n,《string.length》:这样的字符,处理时应注意。

  实现代码

  //获取数据,数据格式示例:+IPD,0,14:“time”:“11:11”

  void getData()

  {

  uint a;

  if(receiveFlag)

  {

  for(i=0; i《2; i++)

  {

  Hour[i]=Buffer[17+i];

  }

  Hour[2]=‘’;

  for(i=0; i《2; i++)

  {

  Minute[i]=Buffer[20+i];

  }

  Minute[2]=‘’;

  //将获取到的数据发送到串口助手上显示

  for (a=0; a《10000; a++); //需要延时,负责会造成数据错乱导致丢包

  sendString(Hour);

  for (a=0; a《10000; a++);

  sendString(Minute);

  receiveFlag=0;

  count=0;

  for(i=0; i《22; i++)

  {

  Buffer[i]=0;

  }

  }

  }

  //主函数

  void main()

  {

  initEsp(); //初始化WiFi模块

  receiveFlag = 0; //receiveFlag判断执行getData() 的标志

  count = 0; //count缓冲区RXDdata[count]的索引

  while(1)

  {

  getData();

  }

  }

  //利用中断接收信息,且舍弃无效信息

  void uart() interrupt 4

  {

  if(RI == 1)

  {

  ES = 0; //关闭串行中断

  RI = 0; //清除串口接收标志位

  temp = SBUF; //从串口缓冲区取得数据

  if(count《20) //满足需接收的信息长度,将数据存入缓冲区

  {

  Buffer[count]=temp;

  count++;

  if(Buffer[0]==‘+’) //判断是否为无效数据,由于WiFi模块会自动加上“+PID.。”开头的字符串

  {

  receiveFlag = 1;

  }

  else

  {

  receiveFlag = 0;

  count = 0;

  }

  }

  ES = 1;

  }

  }

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分