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