汇编编写的模拟串口通信程序 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 |