📄 withpc.asm
字号:
ORG 0000H
AJMP MAIN
ORG 0023H
AJMP RECE
ORG 0040H
MAIN:MOV SP,#60H
MOV SCON,#50H ;串口初始化
MOV TMOD,#20H
MOV TH1,#0F3H
MOV TL1,#0F3H
MOV PCON,#00H ;设置波特率
SETB TR1 ;启动定时器1
SETB EA ;开放中断
SETB ES ;开放串行中断
L3: CLR 00H
CLR 01H
CLR 02H
CLR 03H
MOV R6,#00H
MOV DPTR,#1000H
L2: JB 03H,L1
SJMP L2
L1: ACALL SEND
AJMP L3
SEND:MOV A,#3FH
MOV SBUF,A
JNB TI,$
CLR TI ;发‘?’号,即3FH
JNB RI,$
CLR RI
MOV A,SBUF
CJNE A,#2EH,SEND ;应答信号是‘.’,即2EH,则发字节数
MOV A,R7
MOV R3,A ;暂存总字节数
MOV SBUF,A
JNB TI,$
CLR TI
MOV R6,#00H
MOV DPTR,#1000H
SEND1:MOVX A,@DPTR
MOV SBUF,A ;发送一个字符
JNB TI,$
CLR TI
ADD A,R6 ;计算校验和
MOV R6,A
INC DPTR
DJNZ R7,SEND1 ;计数器(R7)不为零则转SEND1
MOV A,R6
MOV SBUF,A
JNB TI,$
CLR TI ;发送校验和
JNB RI,$
CLR RI
MOV A,SBUF
CJNE A,#46H,SEND2 ;如收到应答是‘F’,即46H,则重发数据
RET
SEND2:MOV DPTR,#1000H
MOV R6,#00H
MOV A,R3
MOV R7,A
AJMP SEND1
RECE: CLR ES
CLR RI
JB 00H,RECE1
MOV A,SBUF
CJNE A,#3FH,RECE2 ;收的不是‘?’号则退出
MOV A,#2EH
MOV SBUF,A
JNB TI,$
CLR TI ;发送应答信号‘.’,即2EH
SETB 00H
SETB ES
RETI
RECE2: MOV A,#24H
MOV SBUF,A
JNB TI,$
CLR TI ;发送应答信号‘$’,即24H
SETB ES
RETI
RECE1: JB 01H,RECE4
MOV A,SBUF ;接收字节数
MOV R7,A
MOV R3,A ;暂存总字节数
SETB 01H
SETB ES
RETI
RECE4: JB 02H,RECE5
MOV A,SBUF ;接收一字符
MOVX @DPTR,A ;存入外RAM中
ADD A,R6
MOV R6,A
INC DPTR
DJNZ R7,RECE7
SETB 02H
RECE7: SETB ES
RETI
RECE5: MOV A,SBUF
CJNE A,06H,RECE8 ;06H为R6的字节地址
MOV A,#4FH ;校验和不正确,重发数据
MOV SBUF,A
JNB TI,$
CLR TI ;校验正确发‘0’,即4FH
SETB 03H
SETB ES
RETI
RECE8: MOV DPTR,#1000H
MOV R6,#00H
MOV A,R3
MOV R7,A
MOV A,#46H
MOV SBUF,A
JNB TI,$
CLR TI ;校验不正确,发‘F’,即46H
CLR 02H
SETB ES
RETI
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -