?? sms2.asm
字號:
;E87
T2CON EQU 0C8H
RCAP2L EQU 0CAH
RCAP2H EQU 0CBH
TL2 EQU 0CCH
TH2 EQU 0CDH
;cpu 8xc52
ORG 0000H
LJMP MAIN
ORG 0023H
ljmp INT_232
WDTRST EQU 0A6H ;看門狗定時器寄存器
;************宏定義
ADDR_SYS EQU 02H
ADDR_SYS1 EQU 04H
ADDR_SYS2 EQU 06H
ADDR_TMP EQU 03H
ADDR_BAK EQU 05H
ADDR_DATA EQU 07H
CONST_1MSH EQU 0FCH
CONST_1MSL EQU 065H ;按1ms定時,定時器初值
CONST_10MSH EQU 0DCH
CONST_10MSL EQU 000H
CONST_100MSH EQU 00H
CONST_100MSL EQU 00H
_R1 EQU 50H
_R2 EQU 51H
_R3 EQU 52H
;口線定義
igb BIT P1.1
BIT_ESCL BIT P1.6
BIT_ESDA BIT P1.7
in1 BIT P0.0
in2 BIT P0.1
in3 BIT p0.2
;--用戶位定義
BIT_EEF BIT 22H.0
bit_OK BIT 22H.1
BIT_ONLINE BIT 22H.2
BIT_TINYTIMEOUT BIT 22H.3
BIT_LASTBYTE BIT 22H.4
BIT_LASTOK BIT 22H.5
BIT_IDLE BIT 22H.6
chr_ok BIT 22H.7
;--寄存器定義
;COMM_LEN EQU 59h
STACK_TOP EQU 10H ;定義堆棧首址48
BUF_SEND EQU 60H
;BUF_EOF EQU 6FH
BUF_DATA EQU 80H
;BUF_REOF EQU 0FFH
;---------------------------------------------------------------------------------------
ORG 0100H
MAIN:
MOV SP,#STACK_TOP ;棧
MOV PSW,#00H ;0號工作區
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
SETB BIT_ESDA
SETB BIT_ESCL
;--------------------RAM空間清0及測試----------------------------
MOV R0,#0
M_1:
MOV @R0,#0
DJNZ R0,M_1
;--定時器T0,T1參數設置
MOV TMOD,#00010001B ;定時器T0,T1工作于方式1(16位定時)
MOV TH0,#CONST_1MSH
MOV TL0,#CONST_1MSL
;--串口參數設置
MOV SCON,#01010000B ;sm0 sm1 sm2 ren tb8 rb8 ti ri
MOV TH2,#0FFH
MOV TL2,#070H
MOV RCAP2H,#0FFH ;波特率 115200 57600 38400 28800 19200 9600 7200 4800 3600 2400
MOV RCAP2L,#0DCH ;TH2:TL2= FF:FD FF:FA FF:F7 FF:F4 FF:EE FF:DC FF:D0 FF:B8 FF:A0 FF:70
MOV T2CON,#00110100B ;TF2 EXF2 RCLK TCKL EXEN2 TR2 C/T2 CP/RL2
MOV IP,#00010000B ;中斷優先 * * PT2 PS PT1 PX1 PT0 PX0
MOV IE,#00010000B ;中斷使能寄存器 EA X ET2 ES ET1 EX1 ET0 EX0
;SETB EA
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LCALL DELAY10MS
SETB IGB
LCALL Delay10MS
CLR IGB
LCALL DELAY100MS
LCALL DELAY100MS
SETB IGB
LCALL INITMODEM
wait:
lcall delay1000ms
;ajmp $
lcall sms_send
ajmp $
RET
;INCLUDE MODEM.ASM
;--------------------------------------------------------------------
; 本程序處理MODEM的初始化,
;
; InitModem --初始化MODEM,19200 BPS,自動應答
;
;--------------------------------------------------------------------
InitModem:
;復位并關閉回顯
;CLR ES
CLR RI
MOV R0,#BUF_SEND
MOV DPTR,#TABLE_RESET
MOV R2,#6
IM_1:
CLR A
MOVC A,@A+DPTR
MOV @R0,A
INC DPTR
INC R0
DJNZ R2,IM_1
NOP
NOP
IM_2:
MOV R0,#BUF_SEND
MOV R2,#6
lCALL ATSEND
MOV R0,#BUF_DATA
MOV R2,#6
IM_21:
lCALL WAIT_RI
JC IM_2
CLR RI
MOV A,SBUF
MOV @R0,A
INC R0
DJNZ R2,IM_21
lCALL CHECK
jnb chr_ok,im_2
lCALL DELAY1000MS
;RET
;設置自動搜索GSM網
MOV R0,#BUF_SEND
MOV DPTR,#TABLE_GOGSM
MOV R2,#11
IM_3:
CLR A
MOVC A,@A+DPTR
MOV @R0,A
INC DPTR
INC R0
DJNZ R2,IM_3
NOP
NOP
IM_4:
MOV R0,#BUF_SEND
MOV R2,#11
lCALL ATSEND
MOV R0,#BUF_DATA
MOV R2,#6
IM_41:
lCALL WAIT_RI
JC IM_4
CLR RI
MOV A,SBUF
MOV @R0,A
INC R0
DJNZ R2,IM_41
lCALL CHECK
jnb chr_ok,im_4
lCALL DELAY1000MS
;=================================
;設置短信中心號碼
MOV R0,#BUF_SEND
MOV DPTR,#TABLE_SETSMS1
MOV R2,#24
IM_5:
CLR A
MOVC A,@A+DPTR
MOV @R0,A
INC DPTR
INC R0
DJNZ R2,IM_5
NOP
NOP
IM_6:
MOV R0,#BUF_SEND
MOV R2,#24
lCALL ATSEND
MOV R0,#BUF_DATA
MOV R2,#6
IM_61:
lCALL WAIT_RI
JC IM_6
CLR RI
MOV A,SBUF
MOV @R0,A
INC R0
DJNZ R2,IM_61
lCALL CHECK
jnb chr_ok,im_6
lCALL DELAY10MS
;====================================
;SET PDU OR TEXT
MOV R0,#BUF_SEND
MOV DPTR,#TABLE_SETSMS0
MOV R2,#11
IM_7:
CLR A
MOVC A,@A+DPTR
MOV @R0,A
INC DPTR
INC R0
DJNZ R2,IM_7
NOP
NOP
IM_8:
MOV R0,#BUF_SEND
MOV R2,#11
lCALL ATSEND
MOV R0,#BUF_DATA
MOV R2,#6
IM_81:
lCALL WAIT_RI
JC IM_8
CLR RI
MOV A,SBUF
MOV @R0,A
INC R0
DJNZ R2,IM_81
lCALL CHECK
jNb chr_ok,im_8
lCALL DELAY1000MS
;RET
;=====================================
;波特率9600BPS
MOV R0,#BUF_SEND
MOV DPTR,#TABLE_SCOMRATE
MOV R2,#13
IM_9:
CLR A
MOVC A,@A+DPTR
MOV @R0,A
INC DPTR
INC R0
DJNZ R2,IM_9
NOP
NOP
IM_10:
MOV R0,#BUF_SEND
MOV R2,#13
lCALL ATSEND
MOV R0,#BUF_DATA
MOV R2,#6
IM_101:
lCALL WAIT_RI
JC IM_10
CLR RI
MOV A,SBUF
MOV @R0,A
INC R0
DJNZ R2,IM_101
lCALL CHECK
jNb chr_ok,im_10
lCALL DELAY1000MS
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
sms_send:
MOV R0,#BUF_SEND
MOV DPTR,#TABLE_msglen
MOV R2,#23
SS_3:
CLR A
MOVC A,@A+DPTR
MOV @R0,A
INC DPTR
INC R0
DJNZ R2,SS_3
NOP
NOP
SS_4:
MOV R0,#BUF_SEND
MOV R2,#23
lCALL ATSEND
MOV R0,#BUF_DATA
MOV R2,#6
;LCALL DELAY10MS
;LCALL DELAY1000MS
;LCALL DELAY1000MS
SS_41:
lCALL WAIT_RI
JC SS_4
CLR RI
MOV A,SBUF
MOV @R0,A
;CJNE A,#3EH,TT
;SJMP $
TT:
INC R0
DJNZ R2,SS_41
MOV R0,#BUF_DATA ;!!!!!
INC R0
INC R0
MOV A,@R0
CJNE A,#3eH,SS_4
lCALL DELAY100MS
;lCALL CHECK
;JnB chr_OK,SS_4
;====================
;MOV A,@R0
;CJNE A,#3EH,ZTF0
;lCALL DELAY100MS
;MOV R0,#BUF_DATA
;mov a,r0
;add A,#8
;MOV R0,A
;MOV A,@R0
;CJNE A,#3eH,ss_4
lCALL DELAY10MS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV R0,#BUF_SEND
MOV DPTR,#TABLE_zhong
MOV R2,#6
SS_5:
CLR A
MOVC A,@A+DPTR
MOV @R0,A
INC DPTR
INC R0
DJNZ R2,SS_5
NOP
NOP
SS_6:
MOV R0,#BUF_SEND
MOV R2,#6
lCALL ATSEND
MOV R0,#BUF_DATA
MOV R2,#6
SS_61:
lCALL WAIT_RI
JC SS_6
CLR RI
MOV A,SBUF
MOV @R0,A
INC R0
DJNZ R2,SS_61
lCALL CHECK
JnB chr_OK,SS_6
lCALL DELAY10MS
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;串口中斷
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INT_232:
CLR ES ;關閉串口中斷
PUSH ACC ;保護現場
PUSH PSW
PUSH DPL
PUSH DPH
;--選擇1號工作區
SETB RS0
CLR RS1
JB RI,I_232_RCV
I_232_EOF:
CLR RS0
CLR RS1
POP DPH
POP DPL
POP PSW ;恢復現場
POP ACC
SETB ES ;開放串口中斷
RETI
I_232_RCV:
MOV A,SBUF
CLR RI
lJMP I_232_EOF
;-----------------------
; WAIT_RI:
;
;-----------------------
WAIT_RI:
MOV TH1,#00
MOV TL1,#00
CLR C
SETB TR1
NOP
NOP
WAITR_1:
lCALL WATCHDOG
NOP
JB RI,WAITR_2
NOP
NOP
JNB TF1,WAITR_1 ;等待中斷發送數據完畢,或超時
SETB C
WAITR_2:
CLR TR1
CLR TF1
CLR RI
RET
;-----------------------------------------
; AtSend:發送AT指令
; in -- R0:開始地址
; R2:發送的個數
;-----------------------------------------
AtSend:
lCALL WATCHDOG
CLR TI
CLR C
AS_1:
MOV TH1,#CONST_10MSH
MOV TL1,#CONST_10MSL
SETB TR1
MOV A,@R0
MOV SBUF,A
AS_2:
lCALL WATCHDOG
JB TI,AS_3
JNB TF1,AS_2
SETB C
CLR TR1
RET
AS_3:
CLR TI
CLR TR1
INC R0
DJNZ R2,AS_1
RET
;-------------------------------
; BYTESEND:在10MS內發送一個字節
;
; IN --ACC
; OUT--CY
;-------------------------------
BYTESEND:
MOV TH1,#CONST_10MSH
MOV TL1,#CONST_10MSL
CLR C
CLR TI
MOV SBUF,A
SETB TR1
BS_1:
lCALL WATCHDOG
NOP
JB TI,BS_2
NOP
NOP
JNB TF1,BS_1 ;等待中斷發送數據完畢,或超時
SETB C
BS_2:
CLR TR1
CLR TF1
CLR RI
CLR TI
LCALL DELAY1MS
nop
RET
;----------------------------------------
; Check: 檢查是否是"OK"或"CO"
; out- bit_ok=1 or bit_online=1
;----------------------------------------
CHECK:
LCALL WATCHDOG
clr chr_ok
MOV R0,#BUF_DATA ;!!!!!
INC R0
INC R0
CHK_R2:
MOV A,@R0
CJNE A,#4FH,CHK_eof
CHK_R4:
INC R0
mov a,@r0
cjne a,#4bh,chk_eof
SETB chr_ok
CHK_EOF:
RET
;-------------------------------------------
WATCHDOG:
; MOV WDTRST,#01EH
; MOV WDTRST,#0E1H
NOP
NOP
RET
;-------------------------------------------
; Delay1MS:
;
;-------------------------------------------
Delay1MS:
PUSH _R2
MOV _R2,#98
DM11_1:
LCALL WATCHDOG
DJNZ _R2,DM11_1
POP _R2
NOP
RET
;-------------------------------------------
; Delay100MS:
; in -- RCNT_MS:延時值MS (<256)
;
;-------------------------------------------
Delay10MS:
PUSH _R2
PUSH _R3
MOV _R2,#100
DM_1:
MOV _R3,#60
DM_2:
;lCALL WATCHDOG
;NOP
;NOP
DJNZ _R3,$
DJNZ _R2,DM_1
POP _R3
POP _R2
NOP
RET
;-------------------------------------------
; Delay100MS:
; in --
;
;-------------------------------------------
Delay100MS:
PUSH _R1
MOV _R1,#10
DM1_1:
lCALL DELAY10MS
DJNZ _R1,DM1_1
POP _R1
NOP
RET
;---------------------------------------------
delay1000ms:
lcall delay100ms
lcall delay100ms
lcall delay100ms
lcall delay100ms
lcall delay100ms
lcall delay100ms
lcall delay100ms
lcall delay100ms
lcall delay100ms
lcall delay100ms
ret
table_reset: db 'A','T','Z','0',0dh,0Ah
TABLE_gogsm: DB 'A','T','+','C','O','P','S','=','0',0DH,0AH
TABLE_setsms1: DB 'A','T','+','C','S','C','A','=','+','8','6','1'
DB '3','8','0','0','5','1','9','5','0','0',0DH,0AH
TABLE_SETSMS0: DB 'A','T','+','C','M','G','F','=','1',0DH,0AH
TABLE_SCOMRATE: DB 'A','T','+','I','P','R','=','9','6','0','0',0DH,0AH
table_msglen: db 'A','T','+','C','M','G','S','=','1','3','8','1'
db '5','0','1','1','7','4','1','5',,0dh
table_zhong: db 't','e','s','t',5eh,5ah
db '0','8','9','1','6','8','3','1','0','8','5'
db '0','9','1','0','5','F','0','1','1','0','0'
db '0','D','9','1','6','8','3','1','1','8','0'
db '5','7','1','1','4','F','5','0','0','0','8'
db '0','0','0','2','4','E','2','D',5EH,'Z'
; db 00H,08H,09H,01H,06H,08H,03H,01H,00H,08H,05H
; db 00H,09H,01H,00,05H,0FH,00H,01H,01H,00H,00H
; db 00H,0DH,09H,01H,06H,08H,03H,01H,01H,08H,00H,05H
; db 01H,04H,00H,08H,0FH,07H,00H,00H,00H,08H
; db 00H,00H,00H,02H,04H,0EH,02H,0DH,5EH,'z'
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -