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