📄 gsm1.asm
字号:
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP PT_T0
ORG 0023H
KD BIT 04H ;
KE BIT 05H ;
KBUF EQU 3FH ;
LJMP RTXD_INT
MAIN:
MOV SP,#67H
MOV R7,#20H
MOV R0,#30H
CLR A
L1: MOV @R0,A
DJNZ R7,L1
MOV SCON,#50H
MOV TMOD,#01H
MOV TH0,#0E4H
MOV TL0,#10H
MOV 0C8H,#34H
MOV 0CBH,#0FFH
MOV 0CAH,#0D9H
CLR P1.3
MOV DPTR,#500 ;以50到5BH的12个单元为发短信内容单元
LCALL DEL_1S
SETB P1.3
MOV 50H,#41H
MOV 51H,#42H
MOV 53H,#42H
MOV 54H,#43H
MOV 56H,#43H
MOV 57H,#44H
MOV 59H,#44H
MOV 5AH,#45H
CLR 00H
CLR 01H
CLR KD
CLR KE
SETB ET0
SETB ES
SETB PS
CLR EA
LCALL INI_MODEN ;调用MODEN初始化
CPL P1.0
MOV KBUF,#0FFH
SETB EA
SETB TR0
MA: CLR A ;主程序循环
MOV A,KBUF
CJNE A,#0FFH,S_7
SJMP L0
S_7: CJNE A,#02H,S_4
CPL P1.0
SJMP L0
S_4: CJNE A,#03H,S_5
CPL P1.1
SJMP L0
S_5: CJNE A,#13H,S_6
CPL P1.2
SJMP L0
S_6: CJNE A,#12H,L0
CPL P1.3
L0: JNB 00H,L3 ;40H存放受到的字节
MOV A,40H
CJNE A,#52H,L4 ;判断是读指令R
LCALL ST_P
MOV R0,#50H
CLR EA ;发送P1口状态给手机
LCALL SEND_MS
MOV R7,#20H
DJNZ R7,$
ACALL FS_AT ;发送AT测试指令
SETB EA
SETB EA
SJMP L3
L4: MOV R5,#00H
MOV R7,#10H
MOV R1,#40H ;计算接收到的信息中空格的数目
L5: MOV A,@R1
CJNE A,#20H,L2
INC R5
L2: INC R1
DJNZ R7,L5
MOV R0,#40H ;根据空格的数目来控制灯
ACALL ST_C
DJNZ R5,KT_0
SJMP L3
KT_0:MOV R0,#44H
ACALL ST_C
DJNZ R5,KT_1
SJMP L3
KT_1:MOV R0,#48H
ACALL ST_C
DJNZ R5,KT_2
SJMP L3
KT_2:MOV R0,#4CH
ACALL ST_C
L3: CLR 00H
SJMP MA
RTXD_INT:
CLR EA
PUSH ACC
PUSH PSW
MOV PSW,#08H
CLR A
MOV A,SBUF
CLR RI
CJNE A,#0DH,RT00 ;接收0D
ACALL REC_CHAR
CJNE A,#0AH,RT00 ;接收0A
ACALL REC_CHAR
CJNE A,#2BH,RT00 ;接收+
ACALL REC_CHAR
CJNE A,#43H,RT00 ;接收C
ACALL REC_CHAR
CJNE A,#4DH,RT00 ;接收M
ACALL REC_CHAR
CJNE A,#54H,RT00 ;接收T
RT_1: ACALL REC_CHAR
CJNE A,#0DH,RT_1 ;等待0D,0A出现后接收数据
ACALL REC_CHAR
CJNE A,#0AH,RT_1
MOV R1,#40H
L9: ACALL REC_CHAR ;接收数据放在40H为首的地址单元中
MOV @R1,A
INC R1
CJNE A,#0DH,L9
ACALL REC_CHAR ;接收最后两位0D,0A
SETB 00H
RT00: SETB EA
SETB EA
POP PSW
POP ACC
RETI
PT_T0:
PUSH ACC
PUSH PSW
MOV TL0,#10H
MOV TH0,#0E4H
MOV PSW,#08H
LCALL KEY
JNC KY0
JB KD,KY1
SETB KD
SJMP KY2
KY1: JB KE,KY3
LCALL GKEY
SETB KE
SJMP KY2
KY0: CLR KD
CLR KE
KY3: MOV KBUF,#0FFH
KY2: POP PSW
POP ACC
RETI
ST_P: MOV A,P1 ;读P1状态,并写入发送单元子程序
JNB ACC.0,S8
MOV 52H,#31H
SJMP S9
S8: MOV 52H,#30H
S9: JNB ACC.1,S7
MOV 55H,#31H
SJMP S6
S7: MOV 55H,#30H
S6: JNB ACC.2,S5
MOV 58H,#31H
SJMP S4
S5: MOV 58H,#30H
S4: JNB ACC.3,S3
MOV 5BH,#31H
SJMP S2
S3: MOV 5BH,#30H
S2: RET
ST_C: MOV A,@R0
CJNE A,#41H,L_0
INC R0
INC R0
INC R0
MOV A,@R0
CJNE A,#30H,ST0
CLR P1.0
RET
ST0: SETB P1.0
RET
L_0: CJNE A,#42H,L_1
INC R0
INC R0
INC R0
MOV A,@R0
CJNE A,#30H,ST1
CLR P1.1
RET
ST1: SETB P1.1
RET
L_1: CJNE A,#43H,L_2
INC R0
INC R0
INC R0
MOV A,@R0
CJNE A,#30H,ST2
CLR P1.2
RET
ST2: SETB P1.2
RET
L_2: CJNE A,#44H,L_3
INC R0
INC R0
INC R0
MOV A,@R0
CJNE A,#30H,ST3
CLR P1.3
RET
ST3: SETB P1.3
L_3: RET
INI_MODEN:
INI_1:MOV DPTR,#TAB_ATE0 ;关闭回显 ATE0
MOV R2,#05H
LCALL SEND
LCALL PDOK
JB 01H,INI_2
MOV DPTR,#500
LCALL DEL_1S
AJMP INI_1
INI_2:
MOV DPTR,#500
LCALL DEL_1S
MOV DPTR,#TAB_CMGF1 ;设置短消息为TEXT模式
MOV R2,#11
LCALL SEND
CLR 01H
LCALL PDOK
JB 01H,INI_3
LCALL DEL_1S
AJMP INI_2
INI_3: MOV DPTR,#500
LCALL DEL_1S
MOV DPTR,#TAB_CNMI ;设置短消息不存储
MOV R2,#13H
LCALL SEND
CLR 01H
LCALL PDOK
JB 01H,INI_4
MOV DPTR,#500
ACALL DEL_1S
AJMP INI_3
INI_4:MOV DPTR,#500
LCALL DEL_1S
RET
FS_AT:
MOV A,#41H
ACALL FS
MOV A,#54H
ACALL FS
MOV A,#0DH
ACALL FS
CLR 01H
LCALL PDOK
JB 01H,ST00
MOV DPTR,#500
LCALL DEL_1S
AJMP FS_AT
ST00: RET
REC_CHAR: ;接收一字节
CLR A
JNB RI,$
CLR RI
MOV A,SBUF
RET
DEL_1S: ;延时 入口参数 DPTR
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
SEND: CLR A ;发送字节,个数由R2确定
MOVC A,@A+DPTR
MOV SBUF,A
JNB TI,$
CLR TI
INC DPTR
DJNZ R2,SEND
RET
REC: JNB RI,$ ;接收数据块,个数为R3,放在首址为R1的连续单元中
CLR RI
MOV A,SBUF
MOV @R1,A
INC R1
DJNZ R3,REC
RET
PDOK:
LCALL PDDA
LCALL PDRI
MOV A,SBUF
CJNE A,#4FH,SB
CLR RI
LCALL PDRI
MOV A,SBUF
CJNE A,#4BH,SB
LCALL PDDA
SETB 01H ;检测到OK,对A置1
RET ;判断是不是手机回答的OK代码? 0D 0A 4F 4B 0D 0A
;检测手机是否回答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
SB: CLR A ;没有检测到OK,对A清零
CLR RI ;清除有串口数据标志
RET
;判断串口数据是否接收成功?超时退出
PDRI: ;占用R4/R5/R1
MOV R1,#60 ;300毫秒超时退出!
PBZ: MOV R4,#200
DY2: MOV R5,#25
DY1: JB RI,KKQ
DJNZ R5,DY1
JB RI,KKQ
SETB C
DJNZ R4,DY2
DJNZ R1,PBZ
CLR C
CLR RI
KKQ: RET
FS: MOV SBUF,A ;把A的内容发送出去
JNB TI,$
CLR TI
RET
SEND_MS: ;发送短息子程序
MOV DPTR,#TAB_CMGS
MOV R2,#08H
LCALL SEND
MOV DPTR,#TAB_CMGS2
MOV R2,#0EH
LCALL SEND
S0: ACALL REC_CHAR
CJNE A,#20H,S0
MOV R2,#0CH
S1: MOV A,@R0
ACALL FS
INC R0
DJNZ R2,S1
MOV A,#0DH
ACALL FS
MOV A,#1AH
ACALL FS
RET
GKEY: ;读键值子程序
MOV R7,#03H
MOV A,#0EFH
KY4: MOV P2,A
MOV A,P2
ANL A,#0E0H
JB ACC.5,KY5
MOV B,R7
CLR A
ORL A,B
MOV KBUF,A
SETB C
RET
KY5: JB ACC.6,KY6
MOV B,R7
MOV A,#10H
ORL A,B
MOV KBUF,A
SETB C
RET
KY6: JB ACC.7,KY7
MOV B,R7
MOV A,#20H
ORL A,B
MOV KBUF,A
SETB C
RET
KY7: SETB C
RRC A
DJNZ R7,KY4
CLR C
RET
KEY: MOV R7,#03H ;判键盘状态子程序
MOV A,#0EFH
S_2: MOV P2,A
MOV A,P2
ANL A,#0E0H
JNB ACC.5,S_1
JNB ACC.6,S_1
JNB ACC.7,S_1
SETB C
RRC A
DJNZ R7,S_2
CLR C
RET
S_1: SETB C
RET
TAB_ATE0:
DB 41H,54H,45H,30H,0DH
TAB_CMGF1:
DB 41H,54H,2BH,43H,4DH,47H,46H,3DH,31H,0DH,0AH
TAB_CNMI:
DB "AT+CNMI=2,2,0,0,1",0DH,0AH
TAB_CMGR:
DB "AT+CMGR=1",0DH,0AH
TAB_CMGS:
DB "AT+CMGS="
TAB_CMGS2:
DB 22H,"15979049351",22H,0DH
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -