?? 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 + -