ESP连接本地服务器的51单片机汇编程序
本例采用at89c2051单片机,晶振11.096MHZ,通讯速率9600,TCP多连接方式,本地连接地址192.168.1.收发数据107成功。
硬件电路如下图所示
以下是常见的AT命令:
;服务器模式
;AT CIPMUX=1
允许多个客户端连接,当然,模块最多允许5个客户端连接(每个客户端对应一个id0-4)。还必须设置,否则服务器配置会出错
;AT CIPSERVER=1,5000 创建服务器
;AT CIPSERVER=1,8080
;AT CIPSEND=0,6
;AT CIFSR
查询模块IP地址
;AT CIPSTATUS
查询模块连接状态
;客户端模式
;AT CWMODE=1 设置模式,模式说明:AT CWMODE
= :1-Station模式,2-AP模式,3-AP兼Station模式。重启后生效
;AT CIPMUX=0;单路连接时发送指令AT CIPSEND=x
, x发送的字节数
请注意,只有在单连接时才能设置为传输模式——串口数据直接发送到网络,网络数据直接发送到串口
;AT CWJAP="LOVE","recon2012"
;AT CIPSTART="TCP","192.168.1.8",8080
;AT CWLAP
列出当前可用性
AP
;AT CIPSEND=8 向主机发送8个字节
;设置模块ip,发送AT CIPSTA="192.168.1.110";响应;AT CIPSTA="192.168.1.110"
busy p... 2,CONNECT
OK
;AT CWSAP="TEST","12345678",1,3
创建热点
;AT CWLIF
查看在线IP列表
三、汇编程序如下:
ORG 0000H
AJMP
MAIN;转入主程序
ORG
0003H ;外部中断P3.2脚INT0入口地址
RETI
ORG
000BH;
LJMP
CT
RETI
ORG
0013H;中断陷阱
RETI
ORG
0023H
RETI
DD
EQU P1.7.操作状态指示
FLAG_0EQU20H.0
;接收到上行串发送的数据标志p3.0
FLAG_3EQU20H.3;00分标志
;FLAGEQU20H.4;通用标志寄存器
HMEQU21H;定时器毫秒存储
YEAREQU22H;年
MONTHEQU23H;月
DAYEQU24H;日
WEEKEQU25H;星期
HOUREQU26H;小时3031
MINUTEEQU27H;分钟3233
SECONDEQU28H;秒3435
MAIN:
MOV
SCon,#50h;
MOV
TMOD,#21H;波特率发生器T1工作在模式2
MOV
TH1,#0FDH ;波特率9600
MOV
TL1,TH1
MOV
PCON,#0H
SETB
TR1;启动定时器T1
MOVTH0,
#0D0H;
MOVTL0,
#00H
MOV
DPTR,#5000;延迟5秒;
LCALL
DelayXmS
LCALL
ATEOK;发送AT
MOV
DPTR,#5000;延时5秒
LCALL
DelayXmS
LCALL
CWMODE;
MOV
DPTR,#5000;延时5秒
LCALL
DelayXmS
LCALL
CIPMUX;CIPMUX=启动多路连接模式
MOV
DPTR,#5000;延迟5秒;
LCALL
DelayXmS
CALL
CIPSTART;建立TCP连接*
MOV
DPTR,#5000;延时5秒
LCALL
DelayXmS
CALL
CIPSEND;发送数据
CALL
CIPSEND100
MOV
DPTR,#5000;延时5秒
LCALL
DelayXmS
CALL
CIPSEND;发送数据,
CALL
CIPSEND28
A1:MOV
DPTR,#3000;延时5秒
LCALL
DelayXmS
CLRFLAG_0
ORL0A8H,
#82H;允许定时器0中断
A2:SETB
TR0
JB
FLAG_0,A3;不要等1定时器0工作1分钟FLAG_0=接收数据使FLAG_0=1
JB
RI,UARTI;检测到RI变1;串口数据进来了;RI=1
AJMP
A2
ATEOK:;发送AT指令!
MOV
A,#41H;将ASCII代码A发送到串口
LCALL
FS
MOV
A,#54H;将ASCII将代码T发送到串口
LCALL
FS
LCALL
HC;回车!
MOV
R2,#15
ATEOK0:LCALL
PDOK;
JNZ
ATEOK1;如果没有检测到OK,重复发
DJNZ
R2,ATEOK0
ATEOK1:RET
PDOK:LCALL
PDDA
LCALL
PDRI;等待下一个串口数据
MOV
A,SBUF;
CJNE
A,#4FH,SB;判断串口数据"O"=4F
CLR
RI;软件清除串口中断标记
LCALL
PDRI;等待下一个串口数据
MOV
A,SBUF;
CJNE
A,#4BH,SB;判断串口数据"K"=4BH
LCALL
PDDA
MOV
A,#0FFH;检测到OK,对A置1
CPL
DD
RET
SB:CLR
A;没有检测到OK,对A清零
CLR
p>RI;清除有串口数据标志RET
PDRI: SETB
REN;占用R4/R5/R1
MOV
R1,#220;
PBZ: MOV
R4,#80;67
DY2: MOV
R5,#8;8
DY1: JB
RI,KKQ;
DJNZ
R5,DY1;
JB
RI,KKQ;
SETB
C;程序正常时C=1
DJNZ
R4,DY2;内循环50毫秒
DJNZ
R1,PBZ;超时退出
CLR
C;对串口接收超时退出C=0
CLR
RI;清除有串口数据标志
KKQ: RET
;检测0D/0A?
PDDA: CLR
RI;清除有串口数据标志
LCALL
PDRI;
MOV
A,SBUF;
CJNE
A,#0DH,SB;判断串口数据换行键
CLR
RI;软件清除串口中断标记
LCALL
PDRI;等待下一个串口数据
MOV
A,SBUF;
CJNE
A,#0AH,SB;判断串口数据
CLR
RI;软件清除串口中断标记
RET
FS: CLR ES
MOV
SBUF,A
JNB TI, $
CLR TI
SETB ES
RET
;发送回车指令!
HC:
MOV
A,#0DH
LCALL
FS
MOV
A,#0AH
LCALL
FS
RET
;发送AT指令!
AT1:
MOV
A,#41H;将ASCII码A发送到串口去
LCALL
FS
MOV
A,#54H;将ASCII码T发送到串口去
LCALL
FS
RET
;发送AT+C,应答
ATC:
LCALL
AT1
MOV
A,#2BH ;+
LCALL
FS
MOV
A,#43H ;C
LCALL
FS
RET
;入口参数:DPTR=MS(毫秒1-65535mS)
DELAYXMS:
MOV
A,DPH
MOV
R7,#01
JZ
DF1
MOV
R7,DPH
DF1: MOV
A,DPl
MOV
R6,#1
JZ
DEL1
MOV
R6,DPl
DEL1: MOV
B,#0
DJNZ
B,$
DJNZ
B,$
DJNZ
R6,DEL1
DJNZ
R7,DF1
RET
;发送AT+CWMODE=1 W=57 M=4D O=4F D=44 E=45 1=31
CWMODE:
LCALL
ATC
MOV
A,#57H ;W
LCALL
FS
MOV
A,#4DH ;M
LCALL
FS
MOV
A,#4FH ;O
LCALL
FS
MOV
A,#44H ;D
LCALL
FS
MOV
A,#45H ;E
LCALL
FS
MOV
A,#3DH ;="3D"
LCALL
FS
MOV
A,#31H ;1
LCALL
FS
LCALL
HC;回车!
MOV
R2,#15
CWMODE0: LCALL
PDOK;
XRL
A,#0FFH
JZ
CWMODE1;
DJNZ
R2,CWMODE0
CWMODE1: RET
;发送;AT+CWLAP
CWLAP:
LCALL
ATC
MOV
A,#57H ;W
LCALL
FS
MOV
A,#4CH ;L
LCALL
FS
MOV
A,#41H ;A
LCALL
FS
MOV
A,#50H ;P
LCALL
FS
LCALL
HC;回车!
MOV
R2,#10
CWLAP1: LCALL
PDOK;判断是否回答OK?
JNZ
CWLAP2;如果没有检测到OK,继续检查
DJNZ
R2,CWLAP1
CWLAP2: RET
CIPMUX:
LCALL
ATC
MOV
A,#49H ;I
LCALL
FS
MOV
A,#50H ;P
LCALL
FS
MOV
A,#4DH ;M
LCALL
FS
MOV
A,#55H ;U
LCALL
FS
MOV
A,#58H ;X
LCALL
FS
MOV
A,#3DH ;="3D"
LCALL
FS
MOV
A,#31H ;1
LCALL
FS
LCALL
HC;回车!
MOV
R2,#10
CIPMUX0: LCALL
PDOK;
XRL
A,#0FFH
JZ
CIPMUX1;如果没有检测到OK,重复发
DJNZ
R2,CIPMUX0
CIPMUX1: RET
CIPSTART:
LCALL
ATC
MOV
A,#49H ;I
LCALL
FS
MOV
A,#50H ;P
LCALL
FS
MOV
A,#53H ;S
LCALL
FS
MOV
A,#54H ;T
LCALL
FS
MOV
A,#41H ;A
LCALL
FS
MOV
A,#52H ;R
LCALL
FS
MOV
A,#54H ;T
LCALL
FS
MOV
A,#3DH ;=
LCALL
FS
MOV
A,#32H ;2
LCALL
FS
MOV
A,#2CH ;,
LCALL
FS
MOV
A,#22H ;"
LCALL
FS
MOV
A,#54H ;T
LCALL
FS
MOV
A,#43H ;C
LCALL
FS
MOV
A,#50H ;P
LCALL
FS
MOV
A,#22H ;"
LCALL
FS
MOV
A,#2CH
LCALL
FS
MOV
A,#22H ;"
LCALL
FS
MOV
A,#31H ;1
LCALL
FS
MOV
A,#39H ;9
LCALL
FS
MOV
A,#32H ;2
LCALL
FS
MOV
A,#2EH ;.
LCALL
FS
MOV
A,#31H ;1
LCALL
FS
MOV
A,#36H ;6
LCALL
FS
MOV
A,#38H ;8
LCALL
FS
MOV
A,#2EH ;.
LCALL
FS
MOV
A,#31H ;" 1
LCALL
FS
MOV
A,#2EH ;.
LCALL
FS
MOV
A,#31H ;" 1
LCALL
FS
MOV
A,#30H ;" 0
LCALL
FS
MOV
A,#37H ;" 9
LCALL
FS
MOV
A,#22H ;"
LCALL
FS
MOV
A,#2CH
LCALL
FS
MOV
A,#35H ;"5
LCALL
FS
MOV
A,#30H ;"0
LCALL
FS
MOV
A,#30H ;"0
LCALL
FS
MOV
A,#30H ;0
LCALL
FS
LCALL
HC;回车!
MOV
R2,#15
CIPSTART0: LCALL
PDOK ;判断是否回答OK?
XRL
A,#0FFH
JZ
CIPSTART1
DJNZ
R2, CIPSTART0
CIPSTART1: RET
CIPSEND28: MOV
A,#33H ;3
LCALL
FS
MOV
A,#30H ;0
LCALL
FS
LCALL
HC;回车!
MOV
R2,#10
FS400: LCALL
PDOK;
XRL
A,#0FFH
JZ
FSJ;
DJNZ
R2,FS400
RET
;发送AT+CIPSEND=2,
CIPSEND: LCALL
ATC
MOV
A,#49H ;I
LCALL
FS
MOV
A,#50H ;P
LCALL
FS
MOV
A,#53H ;S
LCALL
FS
MOV
A,#45H ;E
LCALL
FS
MOV
A,#4EH ;N
LCALL
FS
MOV
A,#44H ;D
LCALL
FS
MOV
A,#3DH ;=
LCALL
FS
MOV
A,#32H ;2
LCALL
FS
MOV
A,#2CH ;,
LCALL
FS
RET
;发送100个字节
CIPSEND100: MOV
A,#31H ;1
LCALL
FS
MOV
A,#30H ;0
LCALL
FS
MOV
A,#30H ;0
LCALL
FS
LCALL
HC;回车!
MOV
R2,#15
CIPSEND0: LCALL
PDOK;
XRL
A,#0FFH
JZ
FLJ
DJNZ
R2,CIPSEND0
CIPSEND1: RET
FLJ: MOV
R2,#50 ;LJA=51,LJB=50 *
MOV
R0,#30H ;30H到62H共50个字节
MOV
DPTR,#LJB ;
FLJ1: CLR
A
MOVC
A,@A+DPTR
MOV
@R0,A
INC
R0
INC
DPTR
DJNZ
R2,FLJ1
MOV
R0,#30H;30H到62H共50个字节
MOV
R2,#50;LJA=51,LJB=50 *
FLJ2: ACALL
FSD
DJNZ
R2,FLJ2
LCALL
HC;回车!
RET
FSJ: MOV
R2,#15
MOV
R0,#30H
MOV
DPTR,#SJB;
FSJ1: CLR
A
MOVC
A,@A+DPTR
MOV
@R0,A
INC
R0
INC
DPTR
DJNZ
R2,FSJ1
MOV
R0,#30H
MOV
R2,#15
FSJ2: ACALL
FSD
DJNZ
R2,FSJ2
LCALL
HC;回车!
RET
FSD: MOV
DPTR,#ASCII
MOV A, @R0
FSD1: ANL A, #0F0H
SWAP A
MOVC
A,@A+DPTR
CALL
FS
MOV A, @R0
ANL A, #0FH
MOVC
A,@A+DPTR
CALL
FS
INC R0
RET
CT:
PUSH
ACC
PUSH
PSW
PUSH
DPH
PUSH
DPL
MOV TH0,
#0DCH;
MOV TL0,
#00H
INC
HM ;毫秒
MOV A,HM
CJNE A,
#64H, DONE ;0AH
MOV HM,
#00H
CPL
DD
MOV A,SECOND
ADD
A,#01H
DA
A
MOV
SECOND,A
XRL
A,#10H
JNZ
CT2
SETB FLAG_3 ;到10秒检查一次开关量有无报警
CT2: MOV
A,SECOND
XRL
A,#25H
JNZ
CT8
SETB FLAG_3 ;到25秒检查一次开关量有无报警
CT8: MOV
A,SECOND ;WIFI
XRL
A,#30H ;到30秒
JNZ
CT3
MOV
A,MINUTE ;检查分+1是不是被4整除
ADD
A,#01H
MOV
B,#02H
DIV
AB
MOV
A,B
JNZ
CT3
CT3: MOV
A,SECOND
XRL
A,#40H
JNZ
CT4
SETB FLAG_3 ;到40秒检查一次开关量有无报警
CT4: MOV
A,SECOND
XRL
A,#55H
JNZ
CT0
SETB FLAG_3 ;到55秒检查一次开关量有无报警
CT0: MOV
A,SECOND
XRL A,
#60h
JNZ
DONE
MOV SECOND,
#00H
SETB FLAG_0 ;心跳标志置位;每3分钟发送一次;
MOV
2CH,#06H
MOV A,MINUTE
ADD
A,#01H
DA
A
MOV
MINUTE,A
CT1: MOV
A,MINUTE
XRL A,#30h ;
JNZ
CT6
CT6: MOV
A,MINUTE
XRL A,#60h ;
JNZ
DONE
MOV MINUTE,
#00H
MOV A,HOUR
ADD
A,#01H
DA
A
MOV
HOUR,A
XRL A,
#24h
JNZ
DONE
MOV HOUR,
#00H
DONE:
POP
DPL
POP
DPH
POP
PSW
POP
ACC
RETI
;跳过接收数据
TGSJ:
SETB
C
CLR
RI;软件清除串口中断标记
LCALL
PDRI;等待下一个串口数据
MOV
A,SBUF;将串口寄存器中接收到的数据给A
JNC
XPAS;如果检测到发生超时退出,就跳出这段程序
DJNZ
R3,TGSJ;判断是否已经收全部数据?
XPAS: RET
LJB:DB
10H,30H,00H,03H,45H,44H,50H,01H,40H,00H,80H,00H,07H,31H,30H,38H,30H,34H,35H,38H,00H ;21
DB
1CH,35H,6AH,4DH,47H,61H,48H,72H,30H,37H,3DH,75H,32H,43H,3DH,38H,52H,67H,78H,62H,44H,6FH,64H,4DH,5AH,36H,59H,73H,3DH;29
ASCII:DB
30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,41H,42H,43H,44H,45H,46H;
SJB:DB
30H,0DH,00H,07H,33H,32H,36H,36H,38H,38H,38H,31H,31H,31H,31H
END
四、利用TCP/UDP调试工具看程序执行的结果如下图:
五、wifi设置
在你家中的wifi如TP-LINK的静态地址分配中,把ESP8266的MAC地址绑定到192.168.1.107IP上,如下图。如果不绑定,任其动态分配IP地址,你就要经常改程序中的ip地址。