?? ht9032demo.txt
字號:
HT9032示例程序
這是使用了HT9032典型應用電路的持續,與PC的連接需要隔離
PWR_UP BIT P1.0 ;
RECE_IN BIT 7FH ;
T0_TIMER DATA 2BH ;5秒倒計時計數器
;-------------------------------;
ORG 0000H ;
ST: AJMP START ;程序入口
ORG 0003H ;
AJMP INT_0 ;振鈴中斷
ORG 000BH ;
AJMP T_0 ;定時中斷
ORG 0013H ;
AJMP INT_1 ;DTMF中斷
ORG 001BH ;
RETI ;
ORG 0023H ;
AJMP RECE ;串行接收中斷
;-------------------------------;
ORG 0030H ;
START:
MOV SP,#07H ;主程序
ACALL INIT ;
AJMP $ ;
INIT: ;
CLR PWR_UP
MOV TMOD,#21H ;T0為16位計數器,T1為波特率定時器,1200bps
MOV TH1,#0F8H ;3.58MHz晶體,1200bps
MOV TL1,#0F8H ;
MOV SCON,#40H ;8位UART,方式1
CLR RECE_IN ;
ACALL CLEAR_BUFF ;清除RAM內容
SETB IT0 ;設定為邊沿觸發方式中斷
SETB TR1 ;允許波特率計數器計數
; MOV A,7FH ;
; CJNE A,#0AAH,FOR1 ;冷、熱啟動檢測
; MOV A,7EH ;
; CJNE A,#055H,FOR1 ;
; AJMP FOR2 ;
;FOR1: ACALL SEND_MYID ;開機顯示
; MOV 7FH,#0AAH ;
; MOV 7EH,#055H ;
FOR2: SETB ET0 ;允許T0中斷
SETB EA ;開放總中斷
SETB EX0 ;允許振鈴中斷
RET ;
;-------------------------------;
SEND_MYID: ;開機顯示:
MOV DPTR,#TAB ;It's telephone Call-ID demodulator,
CLR A ;made by w557
SMID1: PUSH ACC ;
CLR TI ;
MOVC A,@A+DPTR ;
CJNE A,#0AAH,SMID2 ;
AJMP SMID3 ;
SMID2: MOV SBUF,A ;
JNB TI,$ ;
POP ACC ;
INC A ;
AJMP SMID1 ;
SMID3: POP ACC ;
CLR TI ;
RET ;
TAB: DB 020H ;起始符
DB 049H,074H,027H,073H,020H,074H,065H,06CH ;It's tel
DB 065H,070H,068H,06FH,06EH,065H,020H,043H ;ephone C
DB 061H,06CH,06CH,02DH,049H,044H,020H,064H ;all-ID d
DB 065H,06DH,06FH,064H,075H,06CH,061H,074H ;emodulat
DB 06FH,072H,02CH,06DH,061H,064H,065H,020H ;or,made
DB 062H,079H,020H,077H,035H,035H,037H,020H ;by w557
DB 0AAH ;結束符
;-------------------------------;
INT_0: ;振鈴中斷
clr ex0 ;
CLR RECE_IN ;
acall clear_buff ;
SETB REN ;允許串行接收
SETB ES ;開放串行中斷
MOV R3,#01H ;
MOV R0,#30H ;
MOV TH0,#00H ;
MOV TL0,#00H ;
MOV T0_TIMER,#20 ;4.5秒定時
SETB TR0 ;
RETI ;
;-------------------------------;
INT_1: ;
RETI ;
;-------------------------------;
T_0: CLR EX0 ;禁止振鈴中斷
CLR TR0 ;
T_0_5: MOV A,T0_TIMER ;
JNZ T_0_7 ;
T_0_6: ajmp send_pho ;
T_0_7: DEC T0_TIMER ;
SETB TR0 ;
RETI ;
;-------------------------------;
send_pho: ;接收到的數據傳送給PC機
jbc rece_in,send_pho_code
SSEND_P:clr ren ;
clr es ;
clr ie0 ;
setb ex0 ;
clr tr0 ;
reti ;
send_pho_code: ;
clr ex0 ;
clr ren ;
clr es ;
MOV R0,#31H ;
MOV A,@R0 ;讀取數據長度
INC A ;消息總長度為數據長度+3
INC A ;消息第1字符為消息類型
INC A ;消息第2字符為數據長度
;消息最后一個字符為校驗和
MOV R3,A ;
MOV R0,#30H ;
SEND_P: CLR TI ;
MOV A,@R0 ;
MOV SBUF,A ;
JNB TI,$ ;
INC R0 ;
DJNZ R3,SEND_P ;
CLR TI ;
CLR RI ;
ACALL CLEAR_BUFF ;
setb ex0 ;
reti ;
;-------------------------------;
CLEAR_BUFF: ;清除RAM內容
MOV R0,#30H ;
MOV R1,#30H ;
CL_BF: MOV @R0,#00H ;
INC R0 ;
DJNZ R1,CL_BF ;
RET ;
;-------------------------------;
RECE: ;串行中斷
CLR EX0 ;
CLR RI ;
CLR TI ;
MOV A,R3 ;
CJNE A,#01H,RECE_1 ;
MOV A,SBUF ;
CJNE A,#04H,RECE_0 ;收到的第一字符不為4,轉判斷是否為8
MOV 30H,A ;
INC R3 ;
AJMP RECE_RET ;
RECE_0: ;
CJNE A,#08H,SSEND_P ;收到的第一字符也不為8,則認為數據出錯
MOV 30H,A ;
INC R3 ;
AJMP RECE_RET ;
RECE_1: CJNE A,#02H,RECE_2 ;
MOV A,SBUF ;
MOV 31H,A ;
INC A ;
MOV R4,A ;獲取數據長度
INC R3 ;
MOV R0,#32H ;
AJMP RECE_RET ;
RECE_2: MOV A,SBUF ;
MOV @R0,A ;
INC R0 ;
DJNZ R4,RECE_RET ;
CLR EX0 ;
CLR TR0 ;
AJMP send_pho_code ;
;
RECE_RET: ;
SETB RECE_IN ;置數據收到標志
RETI ;
;-------------------------------;
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -