?? mt8880
字號:
;這些是程序中MT8880相關操作的函數源代碼可能一些地方需要整理一下
;I/O口使用情況:
P_DT EQU P0 ;MT8880的數據線(低4位有效)
P_CLK EQU P1.0 ;輸出MT8880的時鐘clock2
P_RW EQU P1.1 ;輸出MT8880的讀寫選擇(1:讀,0:寫)
P_CS EQU P1.2 ;輸出MT8880的片選
P_RS EQU P1.3 ;輸出MT8880的寄存器選擇(1:控制,0:數據)
P_HOOK EQU P1.4 ;輸出電話線路接入控制(0:接起線路,1:斷開線路)
P_PHON EQU P1.5 ;輸出電話機接入控制(0:接入話機,1:斷開話機)
P_LED EQU P1.6 ;輸出發光二極管控制(0:亮,1:滅)
P_RING EQU P1.7 ;輸入電話線路響鈴(0:有響鈴)
P_BELL EQU P2.3 ;輸出接電話提示鈴聲控制(0:響)
P_IRQ EQU P2.7 ;輸入MT8880的中斷
P_PHST EQU P3.6 ;輸入電話機狀態(0:電話機目前拿起,1:放下)
;================================================================
;ADDRESS: RAM內存地址說明:
SPADR EQU 60H ;SP Init Address 堆棧區底
DT_BUF_ EQU 5FH ;數據緩沖區頂
DT_BUF EQU 40H ;數據緩沖區底
MT_TMP EQU 34H ;MT8880臨時變量
MT_8B EQU 33H ;MT8880臨時變量
;----------------------------------------------------------------
;ID ADRESSES: 標志位的位地址:(字節地址對應20H-2FH)
ERRID EQU 0BH ;函數調用錯誤返回標志(1:錯誤)
RSID EQU 0AH ;讀寫MT8880的寄存器地址(1:控制,0:數據)
BIT7ID EQU 07H ;位變量的7位
BIT6ID EQU 06H ;位變量的6位
BIT5ID EQU 05H ;位變量的5位
BIT4ID EQU 04H ;位變量的4位
BIT3ID EQU 03H ;位變量的3位
BIT2ID EQU 02H ;位變量的2位
BIT1ID EQU 01H ;位變量的1位
BIT0ID EQU 00H ;位變量的0位
BIT_VAR EQU 20H ;位變量字節地址
;---------------------------------------------------------------
;VAR: 寄存器變量說明:
;R0: 緩沖區指針
;R1: 數據緩沖區專用指針
;R2:
;R3:
;R4:
;R5: 讀寫MT8880的數據(低4位有效)
;R6: 輔助計數器
;R7: 計數器
;B: 位計數器
;--------------------------------------------------------------
;CONST: 常量說明:
REDAIL EQU 10 ;重撥次數
;==============================================================
;SUB: 子程序說明:
;READMT_SUB 讀MT8880函數
;WRITEMT_SUB 寫MT8880函數
;SMTIN_SUB 初始化MT8880為接收函數
;SMTOUT_SUB 初始化MT8880為發送函數
;SMTCHK_SUB 初始化MT8880為檢測函數
;CHKCP_SUB MT8880檢測聲音函數(ERRID=0則有聲音)
;DAIL_SUB MT8880撥號函數
;=============================================================
;讀MT8880函數:
READMT_SUB: CLR P_CLK
SETB P_CS
SETB P_RS
JB RSID,READMT_RS
CLR P_RS
READMT_RS: SETB P_RW
CLR P_CS
SETB P_CLK
NOP
MOV A,P_DT
ANL A,#0FH ;低4位有效
MOV R5,A
CLR P_CLK
SETB P_CS
RET
;-----------------------------------------------------------
;寫MT8880函數:
WRITEMT_SUB: CLR P_CLK
SETB P_CS
MOV A,P_DT
ANL A,#0F0H
ORL A,#0FH ;將數據線置為輸入
MOV P_DT,A
SETB P_RS
JB RSID,WRITEMT_RS
CLR P_RS
WRITEMT_RS: CLR P_RW
CLR P_CS
MOV A,R5
ANL A,#0FH ;數據只有低4位有效
MOV R5,A
MOV A,P_DT
ANL A,#0F0H
ORL A,R5
MOV P_DT,A
SETB P_CLK
NOP
CLR P_CLK
SETB P_CS
MOV A,P_DT
ANL A,#0F0H
ORL A,#0FH ;將數據線置為輸入
MOV P_DT,A
RET
;-----------------------------------------------------------------
;初始化MT8880為接收函數:
SMTIN_SUB: SETB RSID
LCALL READMT_SUB ;READ STATUS REGISTER
MOV R5,#0
LCALL WRITEMT_SUB ;WRITE TO
CONTROL REGISTER:
MOV R5,#0
LCALL WRITEMT_SUB ;WRITE TO
CONTROL REGISTER
MOV R5,#8
LCALL WRITEMT_SUB ;WRITE TO
CONTROL REGISTER
MOV R5,#0
LCALL WRITEMT_SUB ;WRITE TO
CONTROL REGISTER
LCALL READMT_SUB ;READ STATUS REGISTER
CLR RSID
LCALL READMT_SUB ;READ DATA REGISTER
SETB RSID
LCALL READMT_SUB ;READ STATUS REGISTER
RET
;---------------------------------------------------------------
;初始化MT8880為發送函數:
SMTOUT_SUB: SETB RSID
MOV R5,#03H
LCALL WRITEMT_SUB
MOV R5,#03H
LCALL WRITEMT_SUB
MOV R5,#0BH
LCALL WRITEMT_SUB
MOV R5,#01H
LCALL WRITEMT_SUB
LCALL READMT_SUB ;READ STATUS REGISTER
CLR RSID
LCALL READMT_SUB ;READ DATA REGISTER
SETB RSID
LCALL READMT_SUB ;READ STATUS REGISTER
RET
;---------------------------------------------------------------
;初始化MT8880為發送函數:
SMTOUT1_SUB: SETB RSID
MOV R5,#03H
LCALL WRITEMT_SUB
MOV R5,#03H
LCALL WRITEMT_SUB
MOV R5,#0BH
LCALL WRITEMT_SUB
MOV R5,#00H
LCALL WRITEMT_SUB
LCALL READMT_SUB ;READ STATUS REGISTER
CLR RSID
LCALL READMT_SUB ;READ DATA REGISTER
SETB RSID
LCALL READMT_SUB ;READ STATUS REGISTER
RET
;------------------------------------------------------------
;初始化MT8880為檢測函數:
SMTCHK_SUB: SETB RSID
MOV R5,#06H
LCALL WRITEMT_SUB
MOV R5,#06H
LCALL WRITEMT_SUB
MOV R5,#06H
LCALL WRITEMT_SUB
MOV R5,#06H
LCALL WRITEMT_SUB
LCALL READMT_SUB ;READ STATUS REGISTER
CLR RSID
LCALL READMT_SUB ;READ DATA REGISTER
SETB RSID
LCALL READMT_SUB ;READ STATUS REGISTER
RET
;-----------------------------------------------------------
;MT8880檢測聲音函數(ERRID=0則有聲音):
CHKCP_SUB: LCALL SMTCHK_SUB
CLR ERRID ;先設為有聲音
SETB P_IRQ ;設置檢測中斷為輸入
MOV R5,#255 ;檢測255次
MOV BIT_VAR,#0
CHKCP_1: JB P_IRQ,CHKCP_N
INC BIT_VAR ;為低,加低計數
CHKCP_N: DJNZ R5,CHKCP_1
JB BIT7ID,CHKCP_Y ;255次中,至少128次為低才算
SETB ERRID ;無聲音
CHKCP_Y: RET
;--------------------------------------------------------
;MT8880撥號函數:
DAIL_SUB: LCALL SMTOUT1_SUB ;初始化MT8880為發送
MOV R0,#DT_BUF
DAIL_1: JNB STAID,DAIL_E ;不在撥號狀態,退出
MOV A,@R0
ANL A,#0FH ;數據只有低4位有效
JZ DAIL_E ;為0,則結束
CJNE A,#0DH,DAIL_12 ;1101,短延時?
MOV N_1S,#0 ;清秒計數
DAIL_11: JNB STAID,DAIL_E ;不在撥號狀態,退出
MOV A,N_1S
XRL A,SDT_VAR
JNZ DAIL_11 ;沒到時間,等待
SJMP DAIL_1E ;時間到,繼續
DAIL_12: CJNE A,#0EH,DAIL_14 ;1110,長延時?
MOV N_1S,#0 ;清秒計數
DAIL_13: JNB STAID,DAIL_E ;不在撥號狀態,退出
MOV A,N_1S
XRL A,DDT_VAR
JNZ DAIL_13 ;沒到時間,等待
SJMP DAIL_1E ;時間到,繼續
DAIL_14: MOV R5,A
CLR RSID
LCALL WRITEMT_SUB ;發數據
LCALL SMTOUT_SUB ;初始化MT8880為發送
MOV D_100MS,#5 ;等待0.5秒
LCALL DELAY3_SUB ;等待發送DTMF
LCALL SMTOUT1_SUB ;初始化MT8880為發送
MOV D_100MS,#3 ;等待0.3秒
LCALL DELAY3_SUB ;等待發送DTMF
DAIL_1E: INC R0
CJNE R0,#DT_BUF_,DAIL_1 ;沒到緩沖區末,則繼續
DAIL_E: LCALL SMTCHK_SUB ;初始化MT8880為接收
RET
;------------------------------------------------------------
LCALL SMTCHK_SUB ;初始化MT8880為檢測
;-----------------------------------------------------------
;接電話
MAIN_IN: JNB P_RING,$ ;等待鈴聲停
LCALL DELAY3_SUB ;等待0.1秒
LCALL DELAY3_SUB ;等待0.1秒
CLR P_HOOK ;接起電話
CLR P_LED ;發光二極管亮
MOV D_100MS,#30
LCALL DELAY3_SUB ;等待3秒
CLR JIN2ID ;第1次#號
LCALL SMTOUT1_SUB ;初始化MT8880為發送
MOV A,#0CH ;'#'號
MOV R5,A
CLR RSID
LCALL WRITEMT_SUB ;發碼
LCALL SMTOUT_SUB ;初始化MT8880為發送
MOV D_100MS,#10
LCALL DELAY3_SUB ;等待1秒
LCALL SMTOUT1_SUB ;初始化MT8880為發送
LCALL DELAY3_SUB ;等待0.1秒
LCALL SMTIN_SUB ;初始化MT8880為接收
MOV N_1S,#0 ;1秒計數器清0
SETB GETMID ;接收狀態標志:正在接收
MAIN_IN1: MOV A,N_1S
ANL A,#0F8H ;大于7秒?
JNZ MAIN_PH_ ;是,轉接電話
SETB RSID
LCALL READMT_SUB ;讀狀態
MOV A,R5
ANL A,#04H
JZ MAIN_IN1 ;沒有DTMF數據,繼續等
CLR RSID ;有DTMF數據
LCALL READMT_SUB ;讀DTMF數據
MOV A,R5
LCALL INBUF_SUB ;存入數據緩沖區
;--------------------------------------------------------
;撥號處理過程
MAIN_OUT: DEC A
MOV DTM_VAR,A ;撥號次數減1
MOV D_100MS,#20
LCALL DELAY3_SUB ;等待2秒
CLR P_HOOK ;接起電話
CLR P_LED ;發光二極管亮
MOV D_100MS,#10
LCALL DELAY3_SUB ;等待1秒
MOV N_1S,#0 ;1秒計數器清0
MAIN_OUT0: LCALL CHKCP_SUB ;檢測撥號音
JNB ERRID,MAIN_OUT1 ;有撥號音
MOV A,N_1S
CJNE A,#3,MAIN_OUT0 ;不足3秒沒有撥號音,繼續檢測
SJMP MAIN_OUTE ;大于3秒,失敗
MAIN_OUT1: LCALL DAIL_SUB ;撥號
JNB DDATID,MAIN_OUTE ;撥號后要采集數據?
SETB GETMID ;接收狀態標志:正在接收,以防PC機中途取走數據
LCALL SMTIN_SUB ;是,初始化MT8880為接收
MOV N_1S,#0 ;1秒計數器清0
CLR FSTID ;清第1位數據標志(臨時)
MAIN_OUT2: JNB STAID,MAIN_OUTE ;不在撥號狀態(PC機終止命令),退出
MOV A,N_1S
CJNE A,#5,MAIN_OUT3 ;不大于5秒,繼續
SJMP MAIN_OUTE ;大于5秒,接收結束
MAIN_OUT3: SETB RSID
LCALL READMT_SUB ;讀狀態
MOV A,R5
ANL A,#04H
JZ MAIN_OUT2 ;沒有DTMF數據,繼續等
CLR RSID ;有DTMF數據
LCALL READMT_SUB ;讀DTMF數據
MOV A,R5
LCALL INBUF_SUB ;存入數據緩沖區
MAIN_OUTE: SETB P_HOOK ;掛斷電話
SETB P_LED ;發光二極管滅
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -