我需要解决一个AT89S52与PC机的串口通信问题,AT89S52接收串口调试程序发来的字符,向PC机发送一串固定字
ORG0000HAJMPMAINORG0023HLJMPCOMPROORG0100HMAIN:MOVTMOD,#20H;定时器T1工作模式2,MOVTL1,#0E6H;波...
ORG 0000H
AJMP MAIN
ORG 0023H
LJMP COMPRO
ORG 0100H
MAIN: MOV TMOD,#20H ;定时器T1工作模式2,
MOV TL1,#0E6H ;波特率1200BPS,初值230D
MOV TH1,#0E6H
MOV SCON,#50H ;串口工作模式1,REN=1,无奇偶校验
; CLR RI
; CLR TI
SETB TR1
SETB EA
SETB ES ;打开串行口中断
WAIT: JB P3.3,$ ;S3没按下为高电平,等待
ACALL DELAY
JB P3.3,$
MOV A,#20H
MOV SBUF,A ;发送空格
MOV DPTR,#TDATA ;将要发送的数据表地址给DPTR
XY: MOV A,#00H
MOVC A,@A+DPTR
CJNE A,#0FFH,XY ;判断有没发完
SJMP WAIT
TDATA: DB 'AT89S52--PC!',0AH,0FFH
;要发送的信息,0AH换行的ASCII码,0FFH为设定的信息结束标志
DELAY: MOV R7,#0 ;延时,时间未精确估计,用于键盘去抖
DEL: MOV R6,#0 ;本设计中几十毫秒至几秒均无所谓
DJNZ R6,$
DJNZ R7,DEL
RET
;串行通信中断处理程序
COMPRO: JNB TI,RECV ;判断是接受中断还是发送中断的标志,从而进行对应的处理
CLR TI ;发送中断处理,首先清标志位
MOV A,#00H
MOVC A,@A+DPTR
CJNE A,#0FFH,TXDA ;判断是否为信息结束标志,否则发送
SJMP RETURN ;是结束标志退出中断
TXDA: MOV SBUF,A
INC DPTR ;发送后,数据指针+1,指向要发送的下一字节数据
SJMP RETURN
RECV: CLR RI ;接收中断处理,首先清标志位
MOV A,SBUF
MOV R5,A
ANL A,#0FH ;取低4位显示
ADD A,#13 ;加上本条指令与显示码表格首地址间的间隔
MOVC A,@A+PC
MOV P2,A ;十六进制的低位用数码管L2显示
MOV A,R5
SWAP A
ANL A,#0FH
ADD A,#4H
MOVC A,@A+PC
MOV P0,A ;十六进制的高位用数码管L1显示
SJMP RETURN
DIS: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH
;共阳数码管0-F的显示码
RETURN: NOP
RETI
END
AT89S52接收的字符通过两个LED显示,分别共阳联在P0、P2口上。
源程序用汇编编的。
总是不成功,请看看问题出在哪里? 展开
AJMP MAIN
ORG 0023H
LJMP COMPRO
ORG 0100H
MAIN: MOV TMOD,#20H ;定时器T1工作模式2,
MOV TL1,#0E6H ;波特率1200BPS,初值230D
MOV TH1,#0E6H
MOV SCON,#50H ;串口工作模式1,REN=1,无奇偶校验
; CLR RI
; CLR TI
SETB TR1
SETB EA
SETB ES ;打开串行口中断
WAIT: JB P3.3,$ ;S3没按下为高电平,等待
ACALL DELAY
JB P3.3,$
MOV A,#20H
MOV SBUF,A ;发送空格
MOV DPTR,#TDATA ;将要发送的数据表地址给DPTR
XY: MOV A,#00H
MOVC A,@A+DPTR
CJNE A,#0FFH,XY ;判断有没发完
SJMP WAIT
TDATA: DB 'AT89S52--PC!',0AH,0FFH
;要发送的信息,0AH换行的ASCII码,0FFH为设定的信息结束标志
DELAY: MOV R7,#0 ;延时,时间未精确估计,用于键盘去抖
DEL: MOV R6,#0 ;本设计中几十毫秒至几秒均无所谓
DJNZ R6,$
DJNZ R7,DEL
RET
;串行通信中断处理程序
COMPRO: JNB TI,RECV ;判断是接受中断还是发送中断的标志,从而进行对应的处理
CLR TI ;发送中断处理,首先清标志位
MOV A,#00H
MOVC A,@A+DPTR
CJNE A,#0FFH,TXDA ;判断是否为信息结束标志,否则发送
SJMP RETURN ;是结束标志退出中断
TXDA: MOV SBUF,A
INC DPTR ;发送后,数据指针+1,指向要发送的下一字节数据
SJMP RETURN
RECV: CLR RI ;接收中断处理,首先清标志位
MOV A,SBUF
MOV R5,A
ANL A,#0FH ;取低4位显示
ADD A,#13 ;加上本条指令与显示码表格首地址间的间隔
MOVC A,@A+PC
MOV P2,A ;十六进制的低位用数码管L2显示
MOV A,R5
SWAP A
ANL A,#0FH
ADD A,#4H
MOVC A,@A+PC
MOV P0,A ;十六进制的高位用数码管L1显示
SJMP RETURN
DIS: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH
;共阳数码管0-F的显示码
RETURN: NOP
RETI
END
AT89S52接收的字符通过两个LED显示,分别共阳联在P0、P2口上。
源程序用汇编编的。
总是不成功,请看看问题出在哪里? 展开
2个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询