?? hm8.asm
字號:
;8比特漢明碼模擬通訊程序
SADDR EQU 2000H ;原始數據區首址。
DADDR EQU 2040H ;模擬接收數據區首址。
BUF EQU 2100H ;模擬發送緩沖區首址。
NUMB DATA 30H ;數據個數存放單元。
ERR BIT 00H ;出錯標志。
ORG 0000H
LJMP TEST
ORG 100H
TEST: MOV NUMB,#20H ;原始數據個數。
MOV R3,#20H
MOV DPTR,#DATS
MOV P2,#HIGH(SADDR) ;片外RAM中數據存放首址。
MOV R0,#LOW(SADDR)
COPY: CLR A
MOVC A,@A+DPTR ;將測試數據存放到片外RAM中。
MOVX @R0,A
INC DPTR
INC R0
DJNZ R3,COPY
MOV DPTR,#SADDR ;原始數據首址。
MOV P2,#HIGH(BUF) ;模擬發送緩沖區首址。
MOV R0,#LOW(BUF)
LCALL TRANS ;用查表法生成漢明碼模擬發送。
MOV DPTR,#DADDR ;模擬接收數據保存區首址。
MOV P2,#HIGH(BUF) ;模擬發送緩沖區首址。
MOV R0,#LOW(BUF)
LCALL RECEV ;模擬接收,數據應該正確。
MOV DPTR,#DADDR ;模擬接收數據保存區首址。
MOV P2,#HIGH(BUF) ;模擬發送緩沖區首址。
MOV R0,#LOW(BUF)
LCALL RECEV2 ;用查表法再接收一次,應該取得同樣的效果。
MOV P2,#HIGH(BUF) ;在模擬通訊緩沖區子制造一個差錯。
MOV R0,#LOW(BUF)+5 ;
MOVX A,@R0 ;
XRL A,#02H ;
MOVX @R0,A ;
MOV DPTR,#DADDR ;模擬接收數據保存區首址。
MOV P2,#HIGH(BUF) ;模擬發送緩沖區首址。
MOV R0,#LOW(BUF)
LCALL RECEV ;再接收一次,應該能夠糾正這個差錯。
MOV P2,#HIGH(BUF) ;模擬發送緩沖區首址。
MOV R0,#LOW(BUF)+6 ;在模擬通訊緩沖區子制造兩個差錯。
MOVX A,@R0 ;
XRL A,#11H ;
MOVX @R0,A ;
MOV DPTR,#DADDR ;模擬接收數據保存區首址。
MOV P2,#HIGH(BUF) ;模擬發送緩沖區首址。
MOV R0,#LOW(BUF)
LCALL RECEV ;再接收一次,這兩個差錯將被發現。
STOP: LJMP STOP ;
TRANS: MOV A,NUMB ;取數據個數。
MOV R2,A ;暫存。
LCALL OUTB ;將數據長度發送出去。
TRNS: MOVX A,@DPTR ;讀取一個字節數據。
LCALL OUTB ;發送出去。
INC DPTR ;調整數據指針。
DJNZ R2,TRNS ;發送完全部數據。
RET ;發送結束。
OUTB: MOV R3,A ;暫存。
SWAP A ;準備發送高四位。
LCALL OUT ;發送出去。
MOV A,R3 ;準備發送低四位。
OUT: ANL A,#0FH ;取低四位十六進制數。
ADD A,#2 ;調整查表位置。
MOVC A,@A+PC ;查表。
SJMP OUT1
DB 00H,71H,0B2H,0C3H;十六個8比特漢明碼。
DB 0D4H,0A5H,66H,17H
DB 0E8H,99H,5AH,2BH
DB 3CH,4DH,8EH,0FFH
OUT1: MOVX @R0,A ;模擬輸出到緩沖區。
INC R0
RET
RECEV: CLR ERR ;出錯標志初始化。
LCALL INBY ;從串行口輸入一個字節。
MOV NUMB,A ;保存數據長度。
MOV R2,A
RECV: LCALL INBY ;從串行口輸入一個字節。
MOVX @DPTR,A ;存入數據區。
INC DPTR ;調整數據指針。
DJNZ R2,RECV ;輸入全部數據。
RET ;接收結束。
INBY: LCALL INB ;從串行口輸入四位信息。
SWAP A ;高四位。
MOV R3,A ;暫存。
LCALL INB ;再從串行口輸入四位信息。
ORL A,R3 ;低四位與高四位拼接成一個字節。
RET
INB: MOVX A,@R0 ;從緩沖區讀取一個數據。
INC R0
MOV C,PSW.0 ;保存全字節偶校驗結果。
MOV F0,C
ANL A,#7FH ;取7比特漢明碼。
MOV R4,A ;暫存。
ANL A,#4DH ;對D1、D3、D5、D7進行偶校驗。
MOV C,PSW.0 ;取校驗結果(C1)。
MOV B.0,C ;存入C1中。
MOV A,R4 ;取接收到的漢明碼。
ANL A,#2BH ;對D2、D3、D6、D7進行偶校驗。
MOV C,PSW.0 ;取校驗結果(C2)。
MOV B.1,C ;存入C2中。
MOV A,R4 ;取接收到的漢明碼。
ANL A,#17H ;對D4、D5、D6、D7進行偶校驗。
MOV C,PSW.0 ;取校驗結果(C3)。
MOV B.2,C ;存入C3中。
MOV A,B ;取三個校驗結果。
ANL A,#7
JZ CHG4 ;漢明碼無差錯,信息有效。
JB F0,CHG ;差錯判斷。
SETB ERR ;發現兩個差錯,設立出錯標志。
CHG: INC A
MOVC A,@A+PC ;一個差錯,查表得到糾錯位置碼。
SJMP CHG1
DB 40H,20H,08H,10H
DB 04H,02H,01H
CHG1: XRL A,R4 ;糾錯處理。
MOV R4,A ;保存糾錯后的漢明碼。
CHG4: MOV A,R4 ;取正確的漢明碼。
ANL A,#0FH ;分離出4比特信息位。
RET
RECEV2: CLR ERR ;出錯標志初始化。
LCALL INBY2 ;從串行口輸入一個字節。
MOV NUMB,A ;保存數據長度。
MOV R2,A
RECV2: LCALL INBY2 ;從串行口輸入一個字節。
MOVX @DPTR,A ;存入數據區。
INC DPTR ;調整數據指針。
DJNZ R2,RECV2 ;輸入全部數據。
RET ;接收結束。
INBY2: LCALL INB2 ;從串行口輸入四位信息。
SWAP A ;高四位。
MOV R3,A ;暫存。
LCALL INB2 ;再從串行口輸入四位信息。
ORL A,R3 ;低四位與高四位拼接成一個字節。
RET
INB2: MOVX A,@R0 ;從串行口讀取一個數據。
INC R0
PUSH DPH
PUSH DPL
MOV DPTR,#LISB ;DPTR指向譯碼表。
MOVC A,@A+DPTR ;查譯碼表。
JNB ACC.7,INE
SETB ERR ;發現兩個差錯,設立出錯標志。
INE: POP DPL
POP DPH
RET
DATS: DB 00H,01H,02H,03H,04H,05H,06H,07H
DB 08H,09H,0AH,0BH,0CH,0DH,0EH,0FH
DB 10H,11H,12H,13H,14H,15H,16H,17H
DB 18H,19H,1AH,1BH,1CH,1DH,1EH,1FH
LISB: DB 0,0,0,0FFH,0,0FFH,0FFH,7 ;256字節譯碼表。
DB 0,0FFH,0FFH,0BH,0FFH,0DH,0EH,0FFH
DB 0,0FFH,0FFH,7,0FFH,7,7,7
DB 0FFH,9,0AH,0FFH,0CH,0FFH,0FFH,07
DB 0,0FFH,0FFH,0BH,0FFH,5,6,0FFH
DB 0FFH,0BH,0BH,0BH,0CH,0FFH,0FFH,0BH
DB 0FFH,1,2,0FFH,0CH,0FFH,0FFH,7,0CH
DB 0FFH,0FFH,0BH,0CH,0CH,0CH,0FFH
DB 0,0FFH,0FFH,3,0FFH,0DH,6,0FFH,0FFH
DB 0DH,0AH,0FFH,0DH,0DH,0FFH,0DH
DB 0FFH,1,0AH,0FFH,4,0FFH,0FFH,7
DB 0AH,0FFH,0AH,0AH,0FFH,0DH,0AH,0FFH
DB 0FFH,1,6,0FFH,6,0FFH,6,6
DB 8,0FFH,0FFH,0BH,0FFH,0DH,6,0FFH
DB 1,1,0FFH,1,0FFH,1,6,0FFH,0FFH
DB 1,0AH,0FFH,0CH,0FFH,0FFH,0FH
DB 0,0FFH,0FFH,3,0FFH,5,0EH,0FFH
DB 0FFH,9,0EH,0FFH,0EH,0FFH,0EH,0EH
DB 0FFH,9,2,0FFH,4,0FFH,0FFH,7
DB 9,9,0FFH,9,0FFH,9,0EH,0FFH
DB 0FFH,5,2,0FFH,5,5,0FFH,5
DB 8,0FFH,0FFH,0BH,0FFH,5,0EH,0FFH
DB 2,0FFH,2,2,0FFH,5,2,0FFH
DB 0FFH,9,2,0FFH,0CH,0FFH,0FFH,0FH
DB 0FFH,3,3,3,4,0FFH,0FFH,3
DB 8,0FFH,0FFH,3,0FFH,0DH,0EH,0FFH
DB 4,0FFH,0FFH,3,4,4,4,0FFH
DB 0FFH,9,0AH,0FFH,4,0FFH,0FFH,0FH
DB 8,0FFH,0FFH,3,0FFH,5,6,0FFH
DB 8,8,8,0FFH,8,0FFH,0FFH,0FH
DB 0FFH,1,2,0FFH,4,0FFH,0FFH,0FH
DB 8,0FFH,0FFH,0FH,0FFH,0FH,0FH,0FH
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -