ESP8266连接oneNET的51单片机汇编程序
本例采用at89c2051单片机,晶振11.096MHZ,通讯速率9600,TCP单连接方式,连接地址183.230.40.39,端口876,数据收发成功。
一、硬件电路如下图
http://s13/mw690/0068KRmqzy7nj6sMSAY8c&690
二、用到的AT命令:
;AT+CWMODE=1 设置模式,模式说明:AT+CWMODE
= :1-Station模式,2-AP模式,3-AP兼Station模式。重启后生效
;AT+CIPMUX=0
;单路连接时发送指令为AT+CIPSEND=x
, x为发送的字节数
注意只有在单连接的时候才可以设置为透传模式--就是串口的数据直接发送到网络,网络的数据直接发送到串口
;AT+CIPSTART="TCP","183.230.40.39",876
;AT+CIPSEND=50 向主机发送50个字节
三、汇编程序如下:
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
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_0
EQU
20H.0
;接收到上行串口发来数据标志
p3.0
FLAG_3
EQU
20H.3
;00分标志
FLAG
EQU
20H.4
;通用标志寄存器
HM
EQU
21H
;定时器毫秒存储
YEAR
EQU
22H
;年
MONTH
EQU
23H
;月
DAY
EQU
24H
;日
WEEK
EQU
25H
;星期
HOUR
EQU
26H
;小时3031
MINUTE
EQU
27H
;分钟3233
SECOND
EQU
28H
;秒3435
MAIN:
MOV
SCon,#50h; 方式1,REN=1.SM0,SM1,SM2,REN,TB8,RB8,TI,RI
MOV TMOD,#21H;波特率发生器T1工作在模式2上
MOV TH1,#0FDH
MOV TL1,TH1
MOV PCON,#0H
SETB TR1 ;启动定时器T1
MOV TH0,
#0DCH ;
MOV TL0, #00H
MOV DPTR,#5000;延时5秒
;
LCALL DelayXmS
LCALL
ATEOK
MOV DPTR,#5000;延时5秒
LCALL DelayXmS
LCALL CWMODE;模式说明:AT+CWMODE
=3 :1-Station模式,2-AP模式,3-AP兼Station模式。重启后生效
灭
MOV DPTR,#5000;延时5秒
LCALL DelayXmS
LCALL CIPMUX
;
CIPMUX=0
亮
MOV DPTR,#5000;延时5秒
;
LCALL DelayXmS
CALL
CIPSTART2
;连接onenet,AT+CIPSTART="TCP","183.230.40.39",876
MOV DPTR,#5000;延时5秒
LCALL DelayXmS
CALL
CIPSEND
;AT+CIPSEND=50,发送数据,建立ONENET连接
CALL CIPSEND100
MOV DPTR,#5000;延时5秒
LCALL DelayXmS
CALL
CIPSEND
;
CALL
CIPSEND28
A1:
MOV DPTR,#1000;延时5秒
LCALL DelayXmS
CLR FLAG_0
ORL 0A8H, #82H;允许定时器0中断
A2:
SETB TR0
JB FLAG_0,A3 ;不为1等待,定时器0工作1分钟时会使FLAG_0=1,接收到数据使FLAG_0=1
JB RI,UARTI
AJMP A2
;**********************************************
A3:
CLR TR0
CALL
CIPSEND
;
CALL CIPSEND28
AJMP A1
;**********************************************
+IPD,16:0326688822222 0D 0A 2B 49 50 44 2C 31 36
3A 30 0E 00 07 33 32 36 36 38 38 38 32 32 32 32 32
UARTI:
CLR
TR0
LCALL PDDA;调用串口接收0D/0A数据子程序
UARTI1:
CLR RI;清楚串口中断标志
LCALL PDRI
MOV A,SBUF
XRL A,#2BH
JNZ A2;判断串口数据是不是“+号”
;+IPD,17:0 326688811111
UARTI2:
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到de数据给A
CJNE A,#49H,EXITT;判断串口数据;"I"
2B 49 50 44 2C 31 37 3A 30 0F 00 07 33 32 36 36 38 38 38 31 31 31
31 31 31
CLR RI;软件清除串口中断标记
8个
LCALL PDRI;等待下一个串口数据
MOV
A,SBUF;将串口寄存器中接收到de数据给A
CJNE A,#50H,EXITT;判断串口数据;"P"
MOV R3,#5;定义接收数据总长度
5
LCALL TGSJ;调用接收串口数据子程序
CLR RI;软件清除串口中断标记
LCALL
PDRI;等待下一个串口数据
MOV A,SBUF;
MOV R2,A
CJNE A,#01H,U1;PDRD;判断串口数据
MOV DPTR,#5000;延时5秒
LCALL
DelayXmS
CALL CIPSTART2 ;=40说明连接断开,重新连接
MOV DPTR,#5000
LCALL DelayXmS
CALL
CIPSEND
;AT+CIPSEND=50,发送数据,建立ONENET连接
CALL CIPSEND100
AJMP EXITT
U1:
MOV A,R2
XRL A,#02H
;判断串口数据=02说明连接成功
JNZ U2
MOV DPTR,#5000;延时5秒
LCALL DelayXmS
CALL
CIPSEND
;
CALL CIPSEND28
AJMP EXITT
U2:
MOV A,R2
XRL A,#30H
;判断串口数据=30说明是数据
JNZ EXITT
MOV R3,#12;定义接收数据总长度
LCALL TGSJ;调用接收串口数据子程序
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;
MOV R2,A
CJNE A,#31H,U3;判断串口数据
MOV R3,#8
U22:
CPL DD
MOV DPTR,#800;延时5秒
LCALL DelayXmS ;CALL DELAY2
DJNZ
R3,U22
AJMP EXITT
U3:
MOV A,R2
CJNE A,#32H,EXITT
MOV R3,#10
U33:
CPL DD
MOV DPTR,#800;
LCALL
DelayXmS
DJNZ R3,U33
EXITT:
MOV DPTR,#2000;延时5秒
LCALL DelayXmS
CLR RI;软件清除串口中断标记,退出串口中断
AJMP A1
;**********************************************
ATEOK:
;发送AT指令!
MOV A,#41H;将ASCII码A发送到串口去
LCALL
FS
MOV A,#54H;将ASCII码T发送到串口去
LCALL FS
LCALL HC;回车!
MOV R2,#15
ATEOK0:
LCALL PDOK;判断手机shi否回答OK?
JNZ ATEOK1;如果没有检测到OK,重复发
DJNZ R2,ATEOK0
ATEOK1:
RET
PDOK:
LCALL PDDA
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到de数据给A
CJNE A,#4FH,SB;判断串口数据
"O"=4F
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到de数据给A
CJNE A,#4BH,SB;判断串口数据
"K"=4BH
LCALL PDDA
MOV A,#0FFH;检测到OK,对A置1
CPL DD
RET
SB:
CLR A;没有检测到OK,对A清零
CLR RI;清除有串口数据标志
RET
PDRI:
SETB REN;占用R4/R5/R1
MOV R1,#220;300毫秒超时退出!
PBZ:
MOV R4,#100;67
DY2:
MOV R5,#8
DY1:
JB RI,KKQ;检测到RI变1就退出
DJNZ R5,DY1;25微秒检测一次
JB RI,KKQ;检测到RI变1就退出
SETB C;程序正常时C=1
DJNZ R4,DY2;内循环50毫秒
DJNZ R1,PBZ;超时退出
CLR C;对串口接收超时退出C=0
CLR RI;清除有串口数据标志
KKQ:
RET
;检测手机shi否回答0D/0A?
PDDA:
CLR RI;清除有串口数据标志
LCALL
PDRI;2秒内检测串口shi否有数据返回?
MOV A,SBUF;将串口寄存器中接收到de数据给A
CJNE A,#0DH,SB;判断串口数据
换行键
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到de数据给A
CJNE A,#0AH,SB;判断串口数据
CLR RI;软件清除串口中断标记
RET
FS:
CLR
ES
;;CLR TI;先对TI进行软件复位
MOV SBUF,A
JNB
TI,
$
CLR
TI
SETB
ES
;;;;;;;;;;
LCALL PDTI;调用检测TI变为高电平de子程序
RET
;跳过接收数据de子程序(专门针对PDU码数据)
TGSJ:
SETB C
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到de数据给A
JNC XPAS;如果检测到发生超时退出,就跳出这段程序
DJNZ R3,TGSJ;判断是否已经收全部数据?
XPAS:
RET
;发送HC回车指令!
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 WDT_CONTR ,#37H;喂狗
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,#33H ;1
LCALL FS
LCALL HC;回车!
MOV R2,#15
CWMODE0:
LCALL PDOK;判断手机shi否回答OK?
XRL A,#0FFH
JZ CWMODE1;如果没有检测到OK,重复发
DJNZ R2,CWMODE0
CWMODE1:
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,#30H ;1
LCALL FS
LCALL HC;回车!
MOV R2,#10
CIPMUX0:
LCALL PDOK;判断手机shi否回答OK?
XRL A,#0FFH
JZ CIPMUX1;如果没有检测到OK,重复发
DJNZ R2,CIPMUX0
CIPMUX1:
RET
;连接到主机AT+CIPSTART="TCP","183.230.40.39",876
IP为183.230.40.39,端口876
CIPSTART2:
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,#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
;,
;连接到主机AT+CIPSTART="TCP","183.230.40.39",876
LCALL FS
MOV A,#22H ;"
LCALL FS
MOV
A,#31H
;1连接到主机AT+CIPSTART="TCP","183.230.40.39",876
LCALL FS
MOV
A,#38H
;8
LCALL FS
MOV
A,#33H
;3
LCALL FS
MOV A,#2EH ;.
LCALL FS
MOV A,#32H ;2
LCALL FS
MOV A,#33H ;3
LCALL FS
MOV A,#30H ;0
LCALL FS
MOV A,#2EH ;.
LCALL FS
MOV A,#34H ;" 4
LCALL FS
MOV A,#30H ;" 0
LCALL FS
MOV A,#2EH ;.
LCALL FS
MOV A,#33H ;"
3
IP为183.230.40.39,端口876
LCALL FS
MOV A,#39H ;" 9
LCALL FS
MOV A,#22H ;"
LCALL FS
MOV A,#2CH
;,
;连接到主机AT+CIPSTART="TCP","183.230.40.39",876
LCALL FS
MOV A,#38H ;"8
LCALL FS
MOV A,#37H ;"7
LCALL FS
MOV A,#36H ;"6
LCALL FS
LCALL HC;回车!
MOV R2,#15
CIPSTART3:
LCALL PDOK;判断手机shi否回答OK?LCALL
JCXMGR; MOV R2,#15
XRL A,#0FFH; LCALL PDOK;判断手机shi否回答OK?
JZ CIPSTART4;如果没有检测到OK,重复发
DJNZ R2, CIPSTART3;DJNZ R2,CIPSTART0
CIPSTART4:
RET
CIPSEND28:
MOV
A,#31H
;2 3
LCALL FS
MOV
A,#35H
;8 0
LCALL FS
LCALL
HC;回车!
MOV R2,#15
FS400:
LCALL PDOK;判断手机shi否回答OK?LCALL
JCXMGR; MOV R2,#15
XRL A,#0FFH
JZ FSZJ;FSJ;CSJ40;检测到>,转入CSJ
DJNZ R2,FS400
RET
CIPSEND:
LCALL
ATC
;AT+CIPSEND=102
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
RET
CIPSEND100:
MOV
A,#35H
;1
LCALL FS
MOV
A,#30H
;0
LCALL FS
LCALL HC;回车!
MOV R2,#15
CIPSEND0:
LCALL PDOK
XRL A,#0FFH
JZ FLJA;CSJ;检测到>
DJNZ R2,CIPSEND0
CIPSEND1:
RET
FLJA:
MOV
R2,#50;49
;ONENET
MOV
DPTR,#LJB
;连接ONENET
ACALL FS0
RET
FSZJ:
MOV
R2,#15;16
FSZJ1:
MOV
DPTR,#SJB
;
FS0:
CLR
ES
;ONENET
MOVC
A,@A+DPTR
MOV SBUF,A
JNB TI,$
CLR TI
INC DPTR
LCALL HC;回车!
SETB ES
RET
CT:
PUSH ACC
PUSH PSW
PUSH DPH
PUSH DPL
MOV TH0, #0DCH;88H
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
CT2:
MOV A,SECOND
XRL A,#25H
JNZ CT8
SETB
FLAG_3
;到10秒检查一次开关量有无报警
CT8:
MOV
A,SECOND
;WIFI
XRL
A,#30H
;到30秒
JNZ CT3
MOV A,MINUTE
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
;到10秒检查一次开关量有无报警
CT4:
MOV A,SECOND
XRL A,#55H
JNZ CT0
SETB
FLAG_3
;到10秒检查一次开关量有无报警
CT0:
MOV A,SECOND
XRL A, #60h
JNZ DONE
MOV SECOND, #00H
SETB
FLAG_0
;心跳标志置位
;每1分钟发送一次
;
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
;**********************************************
0891683108403505F011000D91683131868651F8
0008000854084E0A75356E90
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个
SJB:DB
30H,0DH,00H,07H,33H,32H,36H,36H,38H,38H,38H,31H,31H,31H,31H
15个
END
四、利用手机软件看程序执行的结果如下图:
http://s10/mw690/0068KRmqzy7nj6tba6Rc9&690
加载中,请稍候......