軟件準備: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不會有。
無標題.jpg (83.47 KB, 下載次數: 72)
下載附件
2019-3-25 18:18 上傳
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指令集:
AT指令集018.pdf
(690.8 KB, 下載次數: 61)
2019-3-25 18:49 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|