本人用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 $时,如附件中图一所示:不段重复发送数据
加上时,如图二所示,接受到乱码。
恳求哪位大侠指点一下啊
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |