📄 modemr.asm
字号:
;********************MODEMR********************
;本程序实现单片机控制MODEM接收数据,在4M的主频下波特率为9600。
;入口参数:接收数据首地址在SADR中,接收返回码缓冲区首地址在DADR中。
;出口参数:无。
;占用资源:W,STATUS,USART,023H,024H,028H~02AH,2重堆栈。
IFNDEF MODEMR1
#DEFINE MODEMR1
INCLUDE "DLYNMS.ASM"
SAVEW EQU 07FH ;现场保护中保存W的地址
SAVES EQU 07EH
GETATDATA1 ADDWF PCL,F
DT "ATZ0",D'13'
DT "ATM0E0N0S0=1" ;MODEM初始化
DT .13 ;确认
GETDATA6 ADDWF PCL,F
DT "CONNECT 9600",D'13',D'10'
GETDATA7 ADDWF PCL,F
DT "OK",0DH,0AH
MODEMR 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初始化
RETLW 0
;******************发送AT指令********************
SENDCMD BCF SOU,2
SENDCMD1 MOVF TEMP1,W
CALL GETATDATA1 ;取AT指令
MOVWF TXREG ;开始发送
SUBLW .13
BTFSC STATUS,Z
GOTO DONE31
BTFSS PIR1,TXIF
GOTO $-1
INCF TEMP1,F
GOTO SENDCMD1
DONE31 MOVF SOU,F
BTFSC STATUS,Z
GOTO DONE31
RETURN
;*****************接收中断服务程序***************
RCINT2 MOVWF SAVEW
SWAPF STATUS,W
CLRF STATUS
MOVWF SAVES ;保护现场
MOVF RCREG,W
MOVWF INDF
INCF FSR,F ;接收数据
SUBLW 0AH
BTFSS STATUS,Z
GOTO BACK3
MOVF DADR,W ;返回码缓冲区
MOVWF FSR ;恢复返回码缓冲区首地址
MOVLW .14
MOVWF TEMP2
CLRF TEMP3
NEXT79 MOVF TEMP3,W
CALL GETDATA6
SUBWF INDF,W
BTFSS STATUS,Z
GOTO NEXT80
INCF FSR,F
INCF TEMP3,F
DECFSZ TEMP2,F
GOTO NEXT79 ;判断是否返回"CONNECT"信号
BSF SOU,0 ;置联机标志
MOVF SADR,W ;数据缓冲区
MOVWF FSR
GOTO BACK3
NEXT80 MOVF DADR,W
MOVWF FSR
MOVLW .4
MOVWF TEMP2
CLRF TEMP3
NEXT81 MOVF TEMP3,W
CALL GETDATA7
SUBWF INDF,W
BTFSS STATUS,Z
GOTO BACK2
INCF FSR,F
INCF TEMP3,F
DECFSZ TEMP2,F
GOTO NEXT81 ;判断是否返回"OK"信号
BSF SOU,2
BACK2 MOVF DADR,W
MOVWF FSR
BACK3 SWAPF SAVES,W
MOVWF STATUS
SWAPF SAVEW,F
SWAPF SAVEW,W ;恢复现场
RETFIE
ENDIF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -