在编写串口测试的时候,遇到了这样的问题,调试了好几遍,都没找到问题出在哪儿,很困惑,希望有人能指点下。
源程序如下:
ORG 0000H
JMP START
ORG 0030H
START:
MOV SP,#30H
MOV SCON,#50H ;串行口工作模式1,接收使能
MOV TMOD,#20H ;Timer 1 工作模式2
MOV TH1,#0FDH ;波特率9600
MOV TL1,#0FDH ;启动Timer 1
SETB TR1
CLR RS1 ;小数部分原来数值
CLR RS0
MOV R0,#0
MOV R1,#1
MOV R2,#2
MOV R3,#3
MOV R4,#4
CLR RS1 ;整数部分原来数值
SETB RS0
MOV R0,#10H ;该位为0,在该位后面显示小数点
MOV R1,#1
MOV R2,#2
MOV R3,#3
MOV R4,#4
MOV R5,#0
MOV R6,#0
MOV R7,#0
MOV 7FH,R7 ;整数部分转移到内存区
MOV 7EH,R6
MOV 7DH,R5
MOV 7CH,R4
MOV 7BH,R3
MOV 7AH,R2
MOV 79H,R1
MOV 78H,R0 ;此位含小数点
CLR RS1
CLR RS0
MOV 77H,R4 ;小数部分转移到内存区
MOV 76H,R3
MOV 75H,R2
MOV 74H,R1
MOV 73H,R0
SETB RS1
CLR RS0
MOV B,#13 ;B存放当前转移的第几个字节
MOV R0,#7FH ;R0中存放当前要转换的数据的地址 7FH-73H
MOV R1,#72H ;R1中存放当前数据要转移到的地址 72H-66H
HEX2ASCII:
MOV A,R0
CJNE A,#78H,NDOT ;如果该位后不显示小数,则跳到NDOT
JMP DOT_ALERT ;该位后要显示小数,跳到DOT_ALERT
NDOT: ;该位后不显示小数
MOV A,@R0
ORL A,#30H
MOV @R1,A
DEC R0
DEC R1
DJNZ B,HEX2ASCII
JMP ZERO_DEL ;转化完毕
DOT_ALERT: ;该位后显示小数点
MOV A,@R0 ;转化该位
ORL A,#30H
MOV @R1,A
DEC R1
MOV @R1,#2EH ;该位后显示小数点
DEC R0
DEC R1
DJNZ B,HEX2ASCII
ZERO_DEL:
;控制最前面的0不显示
MOV R0,#72H
MOV R1,#14
ZERO_LOOP:
MOV A,R1
CJNE A,#7,ZERO_NEXT
JMP DIS_ASCII
ZERO_NEXT:
MOV A,@R0
CJNE A,#30H,DIS_ASCII
DEC R0
DJNZ R1,ZERO_LOOP
DIS_ASCII:
MOV A,@R0
MOV SBUF,A ;发送数据
JBC TI,DIS_ASCII ;若没有发送完,继续发送
LCALL DIS_DELAY ;发送完一个ASCII码后,延时0.1ms
SETB RS1
CLR RS0
DJNZ R1,DIS_NEXT ;发送下一位
SJMP $
DIS_NEXT:
DEC R0
JMP DIS_ASCII
DIS_DELAY: ;延时0.1ms
SETB RS1
SETB RS0
MOV R3,#48
DJNZ R3,$
DJNZ R2,DIS_DELAY
RET
;---------------------------------------------------------------------------
END |