本人用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 |