?? modemzj.asm
字號:
;以下是mcu所接modem呼叫pc機所接modem的程序
CHARNUM0 EQU 6H ;要發送字符串0的數量
CHARNUM1 EQU 7H ;要發送字符串1的數量
CHARNUM2 EQU 11H ;要發送字符串2的數量
CHARNUM3 EQU 3H ;要發送字符串3的數量
CHARNUM4 EQU 5H ;要發送字符串4的數量
CHARNUM5 EQU 7H ;發送緩沖區的長度()
CHARNUM6 EQU 10H ;接收緩沖區的長度()
CHARNUM7 EQU 30H ;接收結果碼緩沖區的長度
SENDBUF EQU 20H ;發送數據區首址()
RECBUF EQU 20H ;接收數據區首址()
COMMBUF EQU 30H ;接收AT命令執行后返回的結果碼的區域首址
TIME1 EQU 0FAH ;延時程序中用到的兩個變量
TIME2 EQU 0F9H
DDLJ EQU 5AH ;建立連接時用到的變量
DDJS EQU 06FH ;接收數據時用到的變量
;******************主程序
ORG 0000H
LJMP MAIN
ORG 0023H
LJMP SER ;轉至中斷服務程序
ORG 0030H
MAIN: MOV SCON,#50H ;將串行口設置為方式1,REN=1
MOV SP,#60H
MOV TMOD,#20H ;定時器1設為模式2
MOV TL1,#0F4H ;定時器初值,晶振為11.0592Mhz,波特率為2400bps
MOV TH1,#0F4H ;8位重裝值
SETB TR1 ;啟動定時器1
CLR PSW.5 ;
MOV R7,#00H
; CLR P0.0
SETB P1.1
SETB P1.2
;***************發送AT 命令
MOV R2,#CHARNUM0 ;要發送字符的數量
MOV R0,#0H
MOV DPTR,#CODE0 ;CODE0為發送字符的地址
MOV R1,#COMMBUF
MOV R4,#0H
SETB ES
CLR EA
AT0: ACALL LOOP ;transmiter for at command0
ACALL DELAY ;延時數秒,等待at命令的返回碼,進入中斷
ACALL DELAY
MOV R0,#COMMBUF ;結果碼的校驗
JIAOYAN0: MOV A,@R0
CJNE A,#4FH,JXJIAOYAN0 //轉向校驗
DEC R4
INC R0
MOV A,@R0
CJNE A,#4BH,JXJIAOYAN0
AJMP JXZX0 //
JXJIAOYAN0: DJNZ R4,JUMPER0 ;*要標志第一行命令發送不成功
AJMP ZHONGJI0
JUMPER0: INC R0
AJMP JIAOYAN0
ZHONGJI0: SETB PSW.5
LJMP GUAXIAN
; LJMP GUAXIAN
JXZX1: MOV R2,#CHARNUM2 ;要發送字符的數量
MOV R0,#0H
MOV DPTR,#CODE2 ;CODE1為發送字符的地址
MOV R1,#COMMBUF
MOV R4,#0H
CLR EA
MOV R6,#DDLJ
AT2: ACALL LOOP
DENGDAILJ: ACALL DELAY ;延時數秒,等待at命令的返回碼,進入中斷
DJNZ R6,DENGDAILJ
MOV R0,#COMMBUF ;結果碼的校驗
JIAOYAN2: MOV A,@R0
CJNE A,#43H,JXJIAOYAN2
DEC R4
INC R0
MOV A,@R0
CJNE A,#4FH,JXJIAOYAN2
AJMP SOUT
JXJIAOYAN2: DJNZ R4,JUMPER2
AJMP ZHONGJI2
JUMPER2: INC R0
AJMP JIAOYAN2
ZHONGJI2: SETB PSW.5
LJMP GUAXIAN ;*
SOUT: MOV R1,#SENDBUF ;發送數據區的首址20H
MOV DPTR,#STRING
MOV R3,#00H
MOV R4,#CHARNUM5 ;發送緩沖區的長度7H
SOUTSUN: MOV A,R3
MOVC A,@A+DPTR
MOV @R1,A
INC R1
INC R3
DJNZ R4,SOUTSUN
MOV R1,#SENDBUF
MOV R4,CHARNUM5
ACALL SEND
ACALL DELAY
ACALL DELAY
;MOV R6,#DDJS ;DDJS接收數據時用到的變量06FH???????
;MOV R1,#RECBUF ;接收數區的首址20H
;MOV R4,#0H
;DENGDAIJS: LCALL DELAY
;DJNZ R6,DENGDAIJS
GUAXIAN: MOV R2,#CHARNUM3 ;;transmiter for at command3
MOV R0,#0H
MOV DPTR,#CODE3 ;!!
ACALL LOOP
ACALL DELAY
ACALL DELAY
MOV R2,#CHARNUM4
MOV R0,#0H
MOV DPTR,#CODE4
MOV R1,#COMMBUF
MOV R4,#0H
CLR EA
ACALL LOOP
ACALL DELAY
ACALL DELAY
MOV R0,#COMMBUF ;結果碼的校驗
JIAOYAN3: MOV A,@R0
CJNE A,#4FH,JXJIAOYAN3
DEC R4
INC R0
MOV A,@R0
CJNE A,#4BH,JXJIAOYAN3
AJMP JIESHU
JXJIAOYAN3: DJNZ R4,JUMPER3
AJMP JIESHU
JUMPER3: INC R0
AJMP JIAOYAN3
;*
JIESHU: JNB PSW.5 ,JIESHU1
CLR P1.1
AJMP JIESHU2
JIESHU1: CJNE R7,#0FFH,JIESHU2
CLR P1.2
JIESHU2: SJMP JIESHU2 ;*
LOOP: CLR TI
MOV A,R0
MOVC A,@A+DPTR
MOV SBUF,A
JNB TI,$
;-----------------------------------這還應該有一個判斷SBUF是否為空的子程序
INC R0
DJNZ R2,LOOP
CLR TI
SETB EA
RET
;****************中斷服務程序
SER: CLR EA
JB RI,JUST ;RI=1,為接收中斷
SJMP OVER
JUST: MOV A,SBUF
MOV @R1,A
INC R1
INC R4 ;記錄接收到字符的數量
CLR RI
OVER: SETB EA
RETI ;中斷返回
;****************發送子程序
SEND: CLR TI
CLR EA
MOV A,@R1 ;取發送數據到A
MOV SBUF,A ;發送ASCII碼
INC R1 ;修改發送數據指針
JNB TI,$
;-----------------------------------再這還應該有一個判斷SBUF是否為空的子程序
DJNZ R4,C2
JMP CLOSE1
C2: AJMP SEND
CLOSE1: CLR EA
CLR TI;=====================
MOV R7,#0FFH
RET
;*****************延時子程序
DELAY: MOV R3,#TIME1
LOOP2: MOV R5,#TIME2
NOP
NOP
LOOP1: NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R5,LOOP1
DJNZ R3,LOOP2 ;延時時間等于(4+10*TIME2+20*TIME1)*機器周期
RET
CODE0: DB 'A','T','F','E',0AH,0DH ;恢復出廠設置
CODE2: DB 'A','T','X','4','D','T','9','W','4','7','8','7','4','9','5',0AH,0DH ;先進行dialtone信號和busy信號的探測,
;然后撥號.
CODE3: DB '+','+','+' ;由on-line狀態返回到command狀態
CODE4: DB 'A','T','H',0AH,0DH ;掛機,結束通話
STRING: DB 59H,75H,65H,46H,61H,6dH,65H
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -