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