汇编编写的模拟串口通信程序
T2作为波特率控制
UART_RXD 是硬中断0或1口,如果能进入中断,说明该线有一个起始位产生,进入中断后调
用下面的接收程序。退出硬中断之前还需要将硬中断标志重新复位。
UART_TXD 是任何其它IO即可。
UART_SEND:
PUSH IE
PUSH DPH
PUSH DPL
PUSH PSW
PUSH 00H
PUSH ACC
CLR EA
SETB UART_TXD ;START BIT
MOV R0,A
CLR TR2 ;TR2置1,计数器2启动,时间计数启动。
MOV A,RCAP2L;计数器2重新装载值
MOV TL2,A ;置计数器2初值 ;T2需要重新装载
MOV A,DPH
MOV A,RCAP2H
MOV TH2,A
MOV A,R0
SETB TR2 ;TR2置1,计数器
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2
CLR UART_TXD ;START BIT
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2
MOV R0,#08H
UART_SEND_LOOP:
RRC A
MOV UART_TXD,C ;8 BIT
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2
DJNZ R0,UART_SEND_LOOP
SETB UART_TXD ;END BIT
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2
POP ACC
POP 00H
POP PSW
POP DPL
POP DPH
POP IE
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
UART_REC:
PUSH IE
PUSH DPH
PUSH DPL
CLR EA
CLR TR2 ;TR2置1,计数器2启动,时间计数启动。
MOV A,RCAP2L;计数器2重新装载值
MOV TL2,A ;置计数器2初值 ;T2需要重新装载
MOV A,DPH
MOV A,RCAP2H
MOV TH2,A
JB UART_RXD,$ ;REC
SETB TR2 ;TR2置1,计数器2启动,时间计数启动。
JNB TF2,$
CLR TF2 ;0.5 BIT
JNB TF2,$
CLR TF2 ;1 BIT
JNB TF2,$
CLR TF2 ;1.5 BIT
MOV C,UART_RXD
MOV ACC.0,C
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2 ;2.5
MOV C,UART_RXD
MOV ACC.1,C
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2 ;3.5
MOV C,UART_RXD
MOV ACC.2,C
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2 ;4.5
MOV C,UART_RXD
MOV ACC.3,C
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2 ;5.5
MOV C,UART_RXD
MOV ACC.4,C
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2 ;6.5
MOV C,UART_RXD
MOV ACC.5,C
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2 ;7.5
MOV C,UART_RXD
MOV ACC.6,C
JNB TF2,$
CLR TF2
JNB TF2,$
CLR TF2 ;8.5
MOV C,UART_RXD
MOV ACC.7,C
JNB TF2,$
CLR TF2 ;9.5
JNB UART_RXD,$ ;等待停止位,并重新复位计数器
SETB UART_RXD
POP DPL
POP DPH
POP IE
RET