软件准备:1.net assist网络调试助手
2.串口调试助手
主要问题以及解决方案
1.采用12M晶振,波特率设置为9600时,通信误差率过大
解决方法:
(1)换11.0592Mhz晶振
(2)使用T2寄存器,算出初始值
SCON=0X50;
T2CON=0X34;
PCON=0X80;
RCAP2H=(65536-39)/256;
RCAP2L=(65536-39)%256;
2.STC52单片机存放不下要发送给8266WIFI的太多指令
解决方法:
在target的option里选为large in XDATA,意思为使用单片机的64KBRAM空间,程序内定义的所有变量都会存放到此空间。
同时选用use Xram,只用加stc的keil扩展包才会有这个选项,选用AT89C51不会有。
3.单片机接受所数字如何转整形?
解决方案:
(1)可以看我另一个帖子的回复
(2)将串口接收信息定义为整型,上位机发送字母或数字,相应ASCII码的二进制转十进制的值就是串口接收到的数据,例如,发送0收到48,发送A收到65。
4.字符串的发送
解决方案:
采用指针反复调用发送单一字符的程序
void send_byte(uchar by) //发送单一字符的函数
{
SBUF = by;
while(!TI);
TI = 0;
}
void send_string(uchar *p) //发送字符串的函数
{
while(*p!= '\0')
{
send_byte(*p); //反复调用发送单一字符的函数
p++;
}
}
5.如何使用8266wifi模块?
解决方案:
8266wifi有AT指令集,我放在附件
51单片机通过串口TXD向8266wifi的RXD发送指令,8266wifi模块进行相应操作
所以要在51内存放相应字符串指令(末尾一定要加回车符和换行符)
uchar rst[]="AT+RST\r\n"; //wifi模块复位(esp12s初始波特率为9600)
uchar mod[]="AT+CWMODE=3\r\n";//设置为AP和ST模式,可连接网络,也开启热点
uchar wico[]="AT+CWJAP=\"Nick\",\"qweasdzxc\"\r\n";//“Nick”为所要链接网络wifi名,"qweasdzxc"为wifi密码
uchar sev[]="AT+CIPSTART=\"TCP\",\"192.168.43.31\",8080\r\n"//TCP为网络传输协议,192.168.43.31为上位机端口号,输入正确即可和上位机无线通信
uchar mods[]="AT+CIPMODE=1\r\n"; //开启发送模式
uchar sen[]="AT+CIPSEND\r\n";//开始发送,执行完此指令后,单片机向wifi模块发送的任何信息自动默认为所要发送给上位机的信息
5.发送信息后跳到串口中断程序,误操作接收程序怎么办?
解决方案:
发送信息前关闭串口中断,发送信息后打开串口中断
6.发送连接相应wifi的指令后,还没连接成功就进行下一条指令操作怎么办?
解决方案:
设置延时,连接端口指令建议延时长一点
源程序如下(我使用的是精准延时,如果要拷贝的话看我另一个帖子,添加c.lib)
#include "reg52.h"
#include "stdio.h"
#include "string.h"
#define uchar unsigned char
#define uint unsigned int
void send_byte(uchar by);
void send_string(uchar *p);
void delay(uint n);
uchar rst[]="AT+RST\r\n";
uchar mod[]="AT+CWMODE=3\r\n";
uchar wico[]="AT+CWJAP=\"Nick\",\"qweasdzxc\"\r\n";
uchar sev[]="AT+CIPSTART=\"TCP\",\"192.168.43.31\",8080\r\n";
uchar mods[]="AT+CIPMODE=1\r\n";
uchar sen[]="AT+CIPSEND\r\n";
uchar in[]="in\r\n";
uchar copa[]="bye\r\n";
uint g,y,r;
sbit ght=P2^0;
sbit yht=P2^1;
sbit rht=P2^2;
void UsartInit()
{
SCON=0X50;
T2CON=0X34;
PCON=0X80;
RCAP2H=(65536-39)/256;
RCAP2L=(65536-39)%256;
ES=0;
EA=1;
ET0=1;
ET1=1;
EX0=1;
IT0=1;
EX1=1;
IT1=1;
}
void main()
{
UsartInit();
send_string(rst);
delay(1);
send_string(mod);
delay(1);
send_string(wico);
delay(10);
send_string(sev);
delay(10);
send_string(mods);
delay(5);
send_string(sen);
delay(3);
ES=1;
g=5;
y=2;
r=5;
while(1)
{
ght=0;
yht=1;
rht=1;
delay(g);
ght=1;
yht=0;
rht=1;
delay(y);
ght=1;
yht=1;
rht=0;
delay(r);
}
}
void send_byte(uchar by)
{
SBUF = by;
while(!TI);
TI = 0;
}
void send_string(uchar *p)
{
while(*p!= '\0')
{
send_byte(*p);
p++;
}
}
void delay(uint n)
{
unsigned int i=0;
for(i=0;i<n;i++)
{
#pragma asm
DEL3:MOV R0,#100
DEL2:MOV R1,#100
DEL1:MOV R2,#25
DEL0:NOP
NOP
DJNZ R2,DEL0
DJNZ R1,DEL1
DJNZ R0,DEL2
#pragma endasm
}
}
void Usart() interrupt 4
{
uint str1;
str1=SBUF;
g=str1;
r=str1;
RI = 0;//
}
void Iny0() interrupt 0
{
ES=0;
send_string(in);
ES=1;
}
void Iny1() interrupt 2
{
ES=0;
send_string(copa);
ES=1;
}
at指令集:
|