?? 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 + -