本人用tl16c554给at89s52扩展四个串口,在编写简单的单片机发送程序的时,遇到麻烦困扰了好久,还希望那位大侠指点一下:
以下是我的源程序:欲实现发送10个ASCII码
CSA EQU 0000H CSB EQU 2000H CSC EQU 4000H CSD EQU 6000H ORG 0000H LJMP MAIN MAIN: LCALL INITIAL LJMP SEND LJMP QUIT INITIAL: LCALL TL16C554 RET
TL16C554: MOV DPTR,#CSA ; UARTA LCALL INITIAL1 MOV DPTR,#CSB LCALL INITIAL1 MOV DPTR,#CSC LCALL INITIAL1 RET INITIAL1: MOV DPL,#03H ;DPTR指向LCR MOV A,#0BH ; MOVX @DPTR,A ; (LCR0,LCR1)=(1,1),8data bits, LCR2=0,1 stop bit,LCR3=1,Parity Enabled
,LCR4=0, Odd Parity ;LCR5=0,Stick parity disabled,LCR6=0,Break disabled,LCR7=0,Access Receiver
Buffer MOV DPL,#02H;DPTR指向 FCR MOV A,#87H MOVX @DPTR,A;FCR0=1,使能FIFO的发送和接收 ,FCR1=1清除接收器FIFO,FCR2=1 清除发送器, (
bit6,bit7) =(0,1) 触发能级为8个字节 MOV DPL,#03H ;指向LCR MOV A,#8BH ; LCR7=1
MOVX @DPTR,A;DALB=1允许写入波特率因子 MOV DPL,#00H ;指向DLL MOV A,#1AH MOVX @DPTR,A MOV DPL,#01H ;指向DLM MOV A,#00H MOVX @DPTR,A ;拨特率为19200 MOV DPL,#03H;指向LCR
MOV A,#0BH ;DALB =0 ; MOVX @DPTR,A;允许访问其他寄存器 MOV DPL,#04H;指向MCR MOV A,#08H MOVX @DPTR,A;MCR3=1外部串行中断使能 MOV DPL,#01H;指向IER MOV A,#00H MOVX @DPTR,A;中断使能 ;RET SEND: MOV R0,#65H; 发送的第一个ASCII码,对应数字0 MOV R7,#08H;总共发送8个ASCII码 MOV DPTR,#CSA;选通A通道 SEND1: MOV DPL,#05H;读线路状态寄存器LSR MOVX A,@DPTR ANL A,#60H;提出LSR5,LSR6位 CJNE A,#60H,SEND1;若FIFO和TSR都为空则顺序执行,否则继续读LSR状态 MOV DPL,#00H MOV A,R0;将字节写入THR MOVX @DPTR,A ;NOP INC R0 DJNZ R7,SEND1 MOV DPTR,#CSB;S ; JMP $ ;不加这条指令时,不断发送数据,加上时接受到的是乱码,纠结中啊
QUIT: END ;==========================================================================================================
不加jmp $时,如附件中图一所示:不段重复发送数据
加上时,如图二所示,接受到乱码。
恳求哪位大侠指点一下啊
邮箱:yuguolincsu@126.com |