⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hm7.asm

📁 在定时器中断中做LED的PWM输出 AT89C2051实现A/D转换的C51程序 单片机开发系统 指令系统 程序设计 定时与中断 系统扩展 接口技术 串行口
💻 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 + -