单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 877|回复: 2
收起左侧

C51单片机设置esp8266程序怪现象 memory model:"选PDATA或XDATA才正常

[复制链接]
lern01 发表于 2017-11-25 20:05 | 显示全部楼层 |阅读模式
使用ESP8266(ESP-01S)连接单片机

编译前需要在“devies target"栏里的”memory model:"选PDATA或XDATA,否则编译后运行不正常,感到很迷惑,望大侠给予指点,为什么要这样设置才行?

程序如下:
  1. /***************************************************************************************
  2. 题目:基于STC89CS2RC单片机无线WIFI模块控制
  3. 内容:通过MCU上位机对ESP8266wifi模块的控制和设置,实现手机端控制LED灯的亮灭。
  4. ********************************************************************/
  5. #include <reg52.h>//包含头文件
  6. #define uint unsigned int
  7. #define uchar unsigned char
  8. #define RELOAD_COUNT 0xFD//宏定义波特率发生器的载入值
  9. //define RELOAD_COUNT(256-(((11520000/16)/12)/9600))也可以或波特率9600
  10. //256-晶振频率/波特率x16=BRT
  11. /*****************LED灯对应P0口的1个端口*************/
  12. sbit LED = P0^0;
  13. /************波特率发生器相关功能寄存器的定义****************/
  14. sfr AUXR = 0x8E;                   //辅助寄存器的地址
  15. sfr BRT = 0x9C;                           //独立波特率发生器的地址
  16. sfr AUXR1 = 0xA2;                   //辅助寄存器1的地址
  17. /*****************相关变量**************/
  18. uchar Receive, i;
  19. uint n;
  20. uchar Recive_table[15];//用于接收wifi模块反馈到MCU上的数据
  21. /*******************************************************************
  22. 名称:延时函数
  23. 作用:毫秒级延时,微妙级延时函数,为数据收发完成作等待.......
  24. ********************************************************************/
  25. void ms_delay(uint t)
  26. {
  27.         uint i, j;

  28.         for(i=t; i>0; i--)
  29.                 for(j=110; j>0; j--);
  30. }

  31. void us_delay(uchar t)
  32. {
  33.         while(t--);
  34. }
  35. /********************************************************************
  36. 名称:波特率发生器函数
  37. 作用:波特率发生器可以是T1定时器实现,也可以是MCU内部独立的波特率发生器,
  38.       各自不同的载入值计算式,具体根据寄存器相关设置来参考计算,以实现  
  39.           异步串行通讯。(经测试,两种设置方式均可用,可任选一种。)  
  40. **********************************************************************/
  41. void Uart_Init()//使用定时器1作为波特率发生器(STC89C52、STC89C51、AT89C51或者STC12C560S2等均可)
  42. {
  43.         SCON = 0x50;//设置为串行口以方式1工作,8位异步通讯,允许接收中断。
  44.                     //一帧信息为10位,1位起始位,8位数据位(低位在先),1位停止位。
  45. //        PCON = 0x80;    //SMOD波特率选择位为1,SMOD = 1.波特率加倍
  46.         TMOD = 0x20;    //设置定时器1为波特率发生器,工作在模式2,8位自动装载
  47.         TH1 = RELOAD_COUNT;//波特率9600,TH1=256-FOSC/16/12/2/波特率
  48.         TL1 = TH1;
  49.         EA = 1;  //总中断打开
  50.         ES = 0;  //关闭串口中断
  51.         TR1 = 1; //启动定时器1
  52. }
  53. /*
  54. void Uart_Init()//使用独立的波特率发生器(STC12C560S2或带有独立波特率发生器的单片机均可)
  55. {
  56.         SCON = 0x50;//设置为串行口以方式1工作,8位异步通讯,允许接收中断。
  57.         PCON = 0x80;//SMOD波特率选择位为1,SMOD=1.
  58.         BRT = RELOAD_COUNT;//波特率9600 256-晶振频率/波特率x16=BRT
  59.         AUXR = 0xD5;//T0、T1不12分频,速度是89C51的12倍,启动独立波特率发生器,每个时钟计数一次
  60.                     //设置串口1的波特率发生器为独立波特率发生器,
  61.         AUXR1 = 0x80;//切换到P1口
  62.         ES = 1;  //开启串口中断
  63.         EA = 1;  //开启总中断
  64. }                                                                                                           */
  65. /********************************************************************
  66. 名称:串口发送函数  
  67. 功能:MCU向其他与其连接的设备发送数据(此处是无线WIFI模块ESP8266)  
  68. ********************************************************************/
  69. void Send_Uart(uchar value)
  70. {
  71.         ES = 0;                           //关串口中断
  72.         TI = 0;                           //清零发送标志位
  73.         SBUF = value;           //发送数据value
  74.         while(TI == 0);           //等待发送完毕
  75.         TI = 0;                           //清零发送标志位
  76.         ES = 1;                           //开串口中断
  77. }
  78. /********************************************************************
  79. 名称:WIFI模块设置函数  
  80. 作用: 启动模块,以便可以实现无线接入和控制  
  81. ********************************************************************/
  82. void ESP8266_Set(uchar *puf) //数组指针*puf指向字符串数组
  83. {
  84.         while(*puf != '\0') //遇到空格跳出循环
  85.         {
  86.                 Send_Uart(*puf); //向WIFI模块发送控制指令
  87.                 us_delay(5);
  88.                 puf++;
  89.         }
  90.         us_delay(5);
  91.         Send_Uart('\r'); //回车
  92.         us_delay(5);
  93.         Send_Uart('\n');  //换行
  94.         ms_delay(1000);
  95. }
  96. /****************************************************
  97. 名称:ESP8266发送数据函数
  98. 功能:用于与wifi模块相连的终端发送数据
  99. *****************************************************/
  100. void ESP8266_Sent(uchar *puf)
  101. {
  102.         ESP8266_Set("AT+CIPSEND=0,4");
  103.         while(*puf != '\0')  //遇到空格跳出循环
  104.         {
  105.                 Send_Uart(*puf); //向WIFI模块发送控制指令
  106.                 us_delay(5);
  107.                 puf++;
  108.         }
  109.         us_delay(5);
  110.         Send_Uart('\n');  //换行
  111.         ms_delay(10);
  112. }
  113. /********************************************************************
  114. 名称:主函数  
  115. 作用:程序的执行入口  
  116. ********************************************************************/
  117. void main()
  118. {
  119.         LED = 0;  //打开LED灯
  120.         Uart_Init();  //使用定时器1作波特率发生器
  121.         ESP8266_Set("AT+CWMODE=1");  //设置路由器 1 station模式 2 AP模式 3 station+AP混合模式
  122.         ESP8266_Set("AT+RST");  //重新启动wifi模块
  123. //        ESP8266_Set("AT+CWSAP=\"ESP-01S\",\"\",11,4");         //设置模块SSID:WIFI,PWD:密码及安全类型加密模式(WPA2-PSK)
  124.         ESP8266_Set("AT+CIPMUX=1"); //开启多连接模式,允许多个客户端接入
  125.         ESP8266_Set("AT+CIPSERVER=1,5000"); //启动TCP/IP端口为5000实现基于网络控制
  126.         ES = 1; //打开串口中断
  127.         
  128.         while(1)
  129.         {
  130.                 if((Recive_table[0] == '+')&&(Recive_table[1] == 'I')&&(Recive_table[2] == 'P'))
  131.                 {                          //MCU接收到的数据为+IPD时进入判断控制0\1来使小灯亮与灭
  132.                         if((Recive_table[3] == 'D')&&(Recive_table[6] == ','))
  133.                         {
  134.                                 if(Recive_table[9] == '0')
  135.                                 {
  136.                                         LED = 0; //灯亮
  137.                                         ESP8266_Sent("灯亮"); //wifi模块向pc端或手机端?发送"灯亮”
  138.                                 }
  139.                                 else if(Recive_table[9] == '1')
  140.                                 {
  141.                                         LED = 1; //灯灭
  142.                                         ESP8266_Sent("灯灭"); //wifi模块向pc端或手机端 发送"灯灭"
  143.                                 }
  144.                         }
  145.                 }
  146.         }
  147. }
  148. /*********************************************************************
  149. 名称:串行通讯中断
  150. 作用:发送或接收结束后进入该函数,对相应的标志位软件清0,实现模块对数据
  151.       正常的收发。
  152. ********************************************************************/
  153. void Uart_Interrupt() interrupt 4
  154. {
  155.         static uchar i = 0;
  156.         
  157.         if(RI == 1)
  158.         {
  159.                 RI = 0;
  160.                 Receive = SBUF;//MCU接收wifi模块反馈回来的数据
  161.                 Recive_table[i] = Receive;
  162.                 i++;
  163.                 if((Recive_table[i-1]=='\n'))
  164.                 i = 0;       //遇到换行重新装值
  165.         }
  166.         else
  167.                 TI = 0;
  168. }
复制代码
回复

使用道具 举报

 楼主| lern01 发表于 2017-11-28 20:08 | 显示全部楼层
有人知道吗?????
回复

使用道具 举报

 楼主| lern01 发表于 2017-12-20 10:01 | 显示全部楼层
没人碰到过吗?烦请大使们帮忙解答,十分感谢!
回复

使用道具 举报

奋斗de小青年 发表于 2017-12-20 14:36
一般遇到你这样的情况是全局变量太多的问题,单片机内部的RAM已经不够用了需要外部的RAM,可以看看这里的资料。http://blog.csdn.net/snow416/article/details/6407177

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛单片机.

Powered by 单片机教程网

快速回复 返回顶部 返回列表