新浪博客

ESP8266连接oneNET的51单片机汇编程序

2018-09-02 10:58阅读:
ESP8266连接oneNET51单片机汇编程序
本例采用at89c2051单片机,晶振11.096MHZ,通讯速率9600TCP单连接方式,连接地址183.230.40.39,端口876,数据收发成功。
一、硬件电路如下图
ESP8266连接oneNET的51单片机汇编程序
二、用到的AT命令:
;AT+CWMODE=1 设置模式,模式说明:AT+CWMODE = 1-Station
式,2-AP模式,3-APStation模式。重启后生效
;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.2INT0入口地址
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.SM0SM1SM2REN,TB8RB8TI,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-APStation模式。重启后生效

MOV DPTR,#5000;延时5
LCALL DelayXmS
LCALL CIPMUX ; CIPMUX=0

MOV DPTR,#5000;延时5 ;
LCALL DelayXmS
CALL CIPSTART2 ;连接onenetAT+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;ASCIIA发送到串口去
LCALL FS
MOV A,#54H;ASCIIT发送到串口去
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,A1
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;检测到RI1就退出
DJNZ R5,DY1;25微秒检测一次
JB RI,KKQ;检测到RI1就退出
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;ASCIIA发送到串口去
LCALL FS
MOV A,#54H;ASCIIT发送到串口去
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 IP183.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 IP183.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
四、利用手机软件看程序执行的结果如下图:

ESP8266连接oneNET的51单片机汇编程序

我的更多文章

下载客户端阅读体验更佳

APP专享