本人用tl16c554給at89s52擴(kuò)展四個(gè)串口,在編寫(xiě)簡(jiǎn)單的單片機(jī)發(fā)送程序的時(shí),遇到麻煩困擾了好久,還希望那位大俠指點(diǎn)一下:
以下是我的源程序:欲實(shí)現(xiàn)發(fā)送10個(gè)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的發(fā)送和接收 ,F(xiàn)CR1=1清除接收器FIFO,F(xiàn)CR2=1 清除發(fā)送器, (
bit6,bit7) =(0,1) 觸發(fā)能級(jí)為8個(gè)字節(jié)
MOV DPL,#03H ;指向LCR
MOV A,#8BH ; LCR7=1
MOVX @DPTR,A;DALB=1允許寫(xiě)入波特率因子
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;允許訪問(wèn)其他寄存器
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; 發(fā)送的第一個(gè)ASCII碼,對(duì)應(yīng)數(shù)字0
MOV R7,#08H;總共發(fā)送8個(gè)ASCII碼
MOV DPTR,#CSA;選通A通道
SEND1:
MOV DPL,#05H;讀線路狀態(tài)寄存器LSR
MOVX A,@DPTR
ANL A,#60H;提出LSR5,LSR6位
CJNE A,#60H,SEND1;若FIFO和TSR都為空則順序執(zhí)行,否則繼續(xù)讀LSR狀態(tài)
MOV DPL,#00H
MOV A,R0;將字節(jié)寫(xiě)入THR
MOVX @DPTR,A
;NOP
INC R0
DJNZ R7,SEND1
MOV DPTR,#CSB;S
; JMP $ ;不加這條指令時(shí),不斷發(fā)送數(shù)據(jù),加上時(shí)接受到的是亂碼,糾結(jié)中啊
QUIT:
END
;==========================================================================================================
不加jmp $時(shí),如附件中圖一所示:不段重復(fù)發(fā)送數(shù)據(jù)
加上時(shí),如圖二所示,接受到亂碼。
懇求哪位大俠指點(diǎn)一下啊
歡迎光臨 (http://www.torrancerestoration.com/bbs/) | Powered by Discuz! X3.1 |