?? hm7.asm
字號:
;7比特漢明碼模擬通訊程序
SADDR EQU 2000H ;原始數據區首址。
DADDR EQU 2040H ;模擬接收數據區首址。
BUF1 EQU 2100H ;模擬發送緩沖區1首址。
BUF2 EQU 2180H ;模擬發送緩沖區2首址。
NUMB DATA 30H ;數據個數存放單元。
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(BUF1) ;模擬發送緩沖區1首址。
MOV R0,#LOW(BUF1)
LCALL TRANS1 ;用計算法生成漢明碼模擬發送。
MOV DPTR,#SADDR ;原始數據首址。
MOV P2,#HIGH(BUF2) ;模擬發送緩沖區2首址。
MOV R0,#LOW(BUF2)
MOV NUMB,#20H ;原始數據個數。
LCALL TRANS2 ;用查表法生成漢明碼模擬發送。
NOP ;兩種方法應該生成相同的漢明碼。
NOP
NOP
MOV DPTR,#DADDR ;模擬接收數據保存區首址。
MOV P2,#HIGH(BUF1) ;模擬發送緩沖區1首址。
MOV R0,#LOW(BUF1)
LCALL RECEV ;模擬接收,數據應該正確。
MOV P2,#HIGH(BUF1) ;在模擬通訊緩沖區制造一個差錯。
MOV R0,#LOW(BUF1)+5
MOVX A,@R0 ;
XRL A,#02H ;
MOVX @R0,A ;
MOV DPTR,#DADDR ;模擬接收數據保存區首址。
MOV P2,#HIGH(BUF1) ;模擬發送緩沖區1首址。
MOV R0,#LOW(BUF1)
LCALL RECEV ;再接收一次,應該能夠糾正這個差錯。
MOV P2,#HIGH(BUF1) ;在模擬通訊緩沖區制造兩個差錯。
MOV R0,#LOW(BUF1)+6
MOVX A,@R0 ;
XRL A,#11H ;
MOVX @R0,A ;
MOV DPTR,#DADDR ;再接收一次,這個差錯將被錯誤地“糾正”。
MOV R0,#LOW(BUF1)
LCALL RECEV ;
STOP: LJMP STOP ;
TRANS1: MOV A,NUMB ;取數據個數。
MOV R2,A ;暫存。
LCALL OUTB1 ;將數據長度發送出去。
TRNS1: MOVX A,@DPTR ;讀取一個字節數據。
LCALL OUTB1 ;發送出去。
INC DPTR ;調整數據指針。
DJNZ R2,TRNS1;發送完全部數據。
RET ;發送結束。
OUTB1: MOV R3,A ;暫存。
SWAP A ;準備發送高四位。
LCALL OUT1 ;發送出去。
MOV A,R3 ;準備發送低四位。
OUT1: ANL A,#0FH ;取低四位十六進制數。
MOV B,A ;暫存。
ANL A,#0DH ;對D3、D5、D7進行偶校驗。
MOV C,PSW.0 ;取校驗結果。
MOV B.6,C ;存入D1中。
MOV A,B
ANL A,#0BH ;對D3、D6、D7進行偶校驗。
MOV C,PSW.0 ;取校驗結果。
MOV B.5,C ;存入D2中。
MOV A,B
ANL A,#07H ;對D5、D6、D7進行偶校驗。
MOV C,PSW.0 ;取校驗結果。
MOV B.4,C ;存入D4中。
MOV A,B ;取合成的漢明碼。
MOVX @R0,A ;模擬發送到緩沖區。
INC R0
RET
TRANS2: MOV A,NUMB ;取數據個數。
MOV R2,A ;暫存。
LCALL OUTB2 ;將數據長度發送出去。
TRNS2: MOVX A,@DPTR ;讀取一個字節數據。
LCALL OUTB2 ;發送出去。
INC DPTR ;調整數據指針。
DJNZ R2,TRNS2 ;發送完全部數據。
RET ;發送結束。
OUTB2: MOV R3,A ;暫存。
SWAP A ;準備發送高四位。
LCALL OUT2 ;發送出去。
MOV A,R3 ;準備發送低四位。
OUT2: ANL A,#0FH ;取低四位十六進制數。
ADD A,#2 ;調整查表位置。
MOVC A,@A+PC ;查表。
SJMP OUT3
DB 00H,71H,32H,43H ;十六個漢明碼。
DB 54H,25H,66H,17H
DB 68H,19H,5AH,2BH
DB 3CH,4DH,0EH,7FH
OUT3: MOVX @R0,A ;模擬發送到緩沖區。
INC R0
RET
RECEV: 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 ;
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 ;無差錯。
INC A
MOVC A,@A+PC ;查表得到糾錯位置碼。
SJMP CHG
DB 40H,20H,08H,10H
DB 04H,02H,01H
CHG: XRL A,R4 ;糾錯處理。
MOV R4,A ;保存糾錯后的漢明碼。
CHG4: MOV A,R4 ;取正確的漢明碼。
ANL A,#0FH ;分離出4比特信息位。
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
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -