📄 modemt.asm
字号:
;********************MODEMT********************
;本程序实现单片机控制MODEM拨号和发送数据,在4M的主频下波特率为9600。
;入口参数:待发送数据在首地址在SADR中,接收缓冲区首地址在DADR中。
;出口参数:若联机成功,W=0,否则,W=0FFH。
;占用资源:W,STATUS,TMR1,USART,023H,024H,028H~02AH,2重堆栈。
;说 明:发送数据首地址在SADR中,数据结束符为0AH(换行符)。
IFNDEF MODEMT1
#DEFINE MODEMT1
INCLUDE "DLYNMS.ASM"
SAVEW EQU 07FH ;现场保护中保存W的地址
SAVES EQU 07EH
GETATDATA ADDWF PCL,F
DT "ATZ0",D'13'
DT "ATM0E0N0S0=1" ;MODEM初始化
DT .13 ;确认
DT "ATH0",D'13' ;挂机
DT "ATDTXXXXX" ;拨号命令,X可为任意号码
DT .13
GETDATA3 ADDWF PCL,F
DT "CONNECT 9600",D'13',D'10'
GETDATA4 ADDWF PCL,F
DT "NO CARRIER",D'13',D'10'
GETDATA5 ADDWF PCL,F
DT "OK",0DH,0AH
MODEMT MOVF DADR,W ;接收数据缓冲区首地址
MOVWF FSR
CLRF SOU
BSF STATUS,RP0
MOVLW 19H
MOVWF SPBRG
BSF TXSTA,BRGH ;高速模式,波特率为9600
BCF TXSTA,SYNC ;异步模式
BCF TXSTA,TX9 ;发送8位数据
BSF TXSTA,TXEN ;使能发送功能
BSF PIE1,RCIE ;开串行口中断
BCF PIE1,TXIE
BCF STATUS,RP0
BCF RCSTA,RX9 ;接收8位数据
BSF RCSTA,SPEN ;使能串行口
BSF RCSTA,CREN ;开始连续接收
BCF PIR1,RCIF ;清中断标志
BSF INTCON,PEIE
BSF INTCON,GIE
CLRF TEMP1
CALL SENDCMD ;发送ATZ命令
MOVLW .5
MOVWF TEMP1
CALL SENDCMD ;MODEM初始化
MOVLW .23
MOVWF TEMP1
CALL SENDCMD ;拨号命令
LOOP114 BTFSC SOU,1
RETLW 0FFH ;联机失败,带错误码返回
BTFSS SOU,0
GOTO LOOP114 ;等待联机信号
MOVF SADR,W ;发送数据缓冲区首地址
MOVWF FSR
NEXT72 MOVF INDF,W
MOVWF TXREG
INCF FSR,F
BTFSS PIR1,TXIF
GOTO $-1
SUBLW 0AH ;遇到换行符则数据块发送结束
BTFSS STATUS,Z
GOTO NEXT72
CLRF SOU
CALL DLYNMS
CALL DLYNMS
CALL DLYNMS
CALL DLYNMS ;延时1S
MOVF DADR,W
MOVWF FSR
CLRF SOU
MOVLW .3
MOVWF TEMP1
MOVLW '+'
LOOP113 MOVWF TXREG ;断开连线并进入命令状态
NOP
BTFSS PIR1,TXIF
GOTO $-1
DECFSZ TEMP1,F
GOTO LOOP113
BTFSS SOU,2
GOTO $-1
MOVLW .18
MOVWF TEMP1
CALL SENDCMD ;挂机
RETLW 0
;******************发送AT指令********************
SENDCMD BCF SOU,2
SENDCMD1 MOVF TEMP1,W
CALL GETATDATA ;取AT指令
MOVWF TXREG ;开始发送
SUBLW .13
BTFSC STATUS,Z
GOTO DONE30
BTFSS PIR1,TXIF
GOTO $-1
INCF TEMP1,F
GOTO SENDCMD1
DONE30 MOVF SOU,F
BTFSC STATUS,Z
GOTO DONE30
RETURN
;*****************接收中断服务程序***************
RCINT1 MOVWF SAVEW
SWAPF STATUS,W
CLRF STATUS
MOVWF SAVES ;保护现场
MOVF RCREG,W
MOVWF INDF
INCF FSR,F ;接收数据
SUBLW 0AH
BTFSS STATUS,Z
GOTO BACK
MOVF DADR,W
MOVWF FSR ;恢复数据缓冲区首地址
MOVLW .14
MOVWF TEMP2
CLRF TEMP3
NEXT77 MOVF TEMP3,W
CALL GETDATA3
SUBWF INDF,W
BTFSS STATUS,Z
GOTO NEXT74
INCF FSR,F
INCF TEMP3,F
DECFSZ TEMP2,F
GOTO NEXT77 ;判断是否返回"CONNECT"信号
BSF SOU,0 ;置联机标志
GOTO BACK1
NEXT74 MOVF DADR,W
MOVWF FSR
MOVLW .12
MOVWF TEMP2
CLRF TEMP3
NEXT73 MOVF TEMP3,W
CALL GETDATA4
SUBWF INDF,W
BTFSS STATUS,Z
GOTO NEXT75
INCF FSR,F
INCF TEMP3,F
DECFSZ TEMP2,F
GOTO NEXT73 ;判断是否返回"NO CARRIER"信号
BSF SOU,1 ;置联机标志
GOTO BACK1
NEXT75 MOVF DADR,W
MOVWF FSR
MOVLW .4
MOVWF TEMP2
CLRF TEMP3
NEXT76 MOVF TEMP3,W
CALL GETDATA5
SUBWF INDF,W
BTFSS STATUS,Z
GOTO BACK1
INCF FSR,F
INCF TEMP3,F
DECFSZ TEMP2,F
GOTO NEXT76 ;判断是否返回"OK"信号
BSF SOU,2
BACK1 MOVF DADR,W
MOVWF FSR
BACK SWAPF SAVES,W
MOVWF STATUS
SWAPF SAVEW,F
SWAPF SAVEW,W ;恢复现场
RETFIE
ENDIF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -