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

📄 hex.asm

📁 单片机程序设计基础 随书光盘
💻 ASM
字号:
;和校验(HEX格式)检错码模拟通讯程序
SADDR	EQU	2000H	;原始数据区首址。
BADDR	EQU	3000H	;模拟发送缓冲区首址。
NUMBH	DATA	30H	;数据个数存放单元(高字节)。
NUMBL	DATA	31H	;数据个数存放单元(低字节)。
ERR	BIT	00H	;出错标志。

	ORG	0000H
	LJMP	TEST
	
	ORG	100H		;测试程序。
TEST:	MOV	NUMBH,#1	;原始数据有0126H字节。
	MOV	NUMBL,#26H	;
	MOV	R2,NUMBH
	MOV	R3,NUMBL
	MOV	DPTR,#DATS
	MOV	P2,#HIGH(SADDR)	;片外RAM中数据存放首址。
	MOV	R0,#LOW(SADDR)
	MOV	A,R3
	JZ	COPY
	INC	R2
COPY:	CLR	A
	MOVC	A,@A+DPTR	;将测试数据存放到片外RAM中。
	MOVX	@R0,A
	INC	DPTR
	INC	R0
	CJNE	R0,#0,COPY1
	INC	P2
COPY1:	DJNZ	R3,COPY
	DJNZ	R2,COPY
	MOV	DPTR,#SADDR	;原始数据首址。
	MOV	P2,#HIGH(BADDR)	;模拟发送缓冲区首址。
	MOV	R0,#LOW(BADDR)
	LCALL	TRANS		;模拟发送。
	LCALL	CLEAR		;将原始数据清除。
	MOV	P2,#HIGH(BADDR)	;模拟发送缓冲区首址。
	MOV	R0,#LOW(BADDR)
	LCALL	RECEV		;模拟接收。
	NOP			;原始数据应该无误恢复。
	NOP
	NOP
	MOV	P2,#HIGH(BADDR)	;在模拟通讯缓冲区制造一个差错。
	MOV	R0,#LOW(BADDR)+5
	MOV	R0,#5
	MOVX	A,@R0		
	XRL	A,#40H		
	MOVX	@R0,A		
	LCALL	CLEAR		;再将原始数据清除。
	MOV	P2,#HIGH(BADDR)	;再接收一次,应该能够发现差错(ERR=1)。
	MOV	R0,#LOW(BADDR)
	LCALL	RECEV
STOP:	LJMP	STOP

CLEAR:	MOV	DPTR,#2000H
	MOV	R2,#2
	MOV	R3,#0
	MOV	A,#0FFH
CL:	MOVX	@DPTR,A
	INC	DPTR
	DJNZ	R3,CL
	DJNZ	R2,CL
	RET

TRANS:	MOV	R2,#10H		;预定一组为16个字节。
	MOV	A, NUMBH
	JNZ	TRNS1		;尚未传送的数据超过256字节。
	MOV	A,NUMBL
	ANL	A,#0F0H
	JNZ	TRNS1		;尚未传送的数据超过16字节。
	MOV	R2,NUMBL	;传送最后不足16字节的数据。
TRNS1:	CLR	C		;计算这次传送后将剩下的字节数。
	MOV	A,NUMBL
	SUBB	A,R2
	MOV	NUMBL,A
	JNC	TRNS2
	DEC	NUMBH
TRNS2:	MOV	A,#3AH		;发送冒号,开始一组传送过程。
	LCALL	OUT1
	MOV	R3,#0		;累加和初始化。
	MOV	A,R2		;取本组发送数据量。
	JZ	TREND		;如为零,发送结束组。
	LCALL	OUTB		;发送本组数据字节数。
	MOV	A,DPH		;发送起始地址。
	LCALL	OUTB
	MOV	A,DPL
	LCALL	OUTB
	MOV	A,#00H		;发送数据标识。
	LCALL	OUTB
TRNS3:	MOVX	A,@DPTR		;发送本组数据。
	LCALL	OUTB
	INC	DPTR		;调整数据指针。
	DJNZ	R2,TRNS3	;发送完本组全部数据。
	MOV	A,R3		;取累加和。
	CPL	A		;取补。
	INC	A
	LCALL	OUTB		;发送校验字。
	MOV	A,#0DH		;发送回车换行符。
	LCALL	OUT1
	MOV	A,#0AH
	LCALL	OUT1
	SJMP	TRANS		;继续处理剩余数据。
TREND:	MOV	A,#00H		;发送结束组,数据字节数为零。
	LCALL	OUTB
	MOV	A,#00H		;地址为0000H。
	LCALL	OUTB
	MOV	A,#00H
	LCALL	OUTB
	MOV	A,#01H		;标识符为01H。
	LCALL	OUTB
	MOV	A,#0FFH		;校验字节为0FFH。
	LCALL	OUTB
	MOV	A,#0DH		;发送回车换行符。
	LCALL	OUT1
	MOV	A,#0AH
	LCALL	OUT1
	RET			;数据全部发送完毕。

OUTB:	MOV	B,A		;发送一个字节,暂存该字节内容。
	ADD	A,R3		;累加。
	MOV	R3,A
	MOV	A,B		;取该字节内容。
	SWAP	A		;先处理高四位。
	LCALL	OUT		;发送出去。
	MOV	A,B		;再发送低四位。
OUT:	ANL	A,#0FH		;将十六进制数转换成ASCII码。
	ADD	A,#90H
	DA	A
	ADDC	A,#40H
	DA	A
OUT1:	MOVX	@R0,A		;输出到模拟发送缓冲区。
	INC	R0
	CJNE	R0,#0,OUTE
	INC	P2
OUTE:	RET

RECEV:	CLR	ERR		;出错标志初始化。
RECV:	LCALL	READB		;等待串行口接收到数据。
	CJNE	A,#3AH,RECV	;等待分组开始的冒号。
	MOV	R3,#0		;本组“累加和”初始化。
	LCALL	INBY		;从串行口输入一个字节数据。
	MOV	R2,A		;本组数据字节数。
	LCALL	INBY		;从串行口输入一个字节数据。
	MOV	DPH,A		;本组数据存放地址的高字节。
	LCALL	INBY		;从串行口输入一个字节数据。
	MOV	DPL,A		;本组数据存放地址的低字节。
	LCALL	INBY		;从串行口输入一个字节数据。
	MOV	R4,A		;本组标识码。
	MOV	A,R2
	JZ	REC4
REC1:	LCALL	INBY		;从串行口输入一个字节数据。
	MOVX	@DPTR,A		;存入数据区。
	INC	DPTR		;调整储存指针。
	DJNZ	R2,REC1		;数据部分接收完毕否?
REC4:	LCALL	INBY		;从串行口输入一个字节数据。
	MOV	A,R3		;取校验结果。
	JZ	REC5		;校验出错否?
	SETB	ERR		;校验出错,设立出错标志。
REC5:	MOV	A,R4		;本组标识判断。
	JZ	RECV		;非结束组,继续接收下一组数据。
	RET			;全部数据接收完毕。

INBY:	LCALL	INB		;先从串行口输入四位信息。
	SWAP	A		;高四位。
	MOV	B,A		;暂存。
	LCALL	INB		;再从串行口输入四位信息。
	ORL	A,B		;低四位与高四位拼接成一个字节。
	XCH	A,R3		;计算累加和。
	ADD	A,R3
	XCH	A,R3
	RET

INB:	LCALL	READB		;
	ANL	A,#7FH		;除去偶校验位,恢复原ASCII码。
	CLR	C		;将ASCII码转换为十六进制数。
	SUBB	A,#30H
	JNB	ACC.4,INE
	SUBB	A,#7
INE:	RET

READB:	MOVX	A,@R0
	INC	R0
	CJNE	R0,#0,REND
	INC	P2
REND:	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
	DB	20H,21H,22H,23H,24H,25H,26H,27H
	DB	28H,29H,2AH,2BH,2CH,2DH,2EH,2FH
	DB	30H,31H,32H,33H,34H,35H,36H,37H
	DB	38H,39H,3AH,3BH,3CH,3DH,3EH,3FH
	DB	40H,41H,42H,43H,44H,45H,46H,47H
	DB	48H,49H,4AH,4BH,4CH,4DH,4EH,4FH
	DB	50H,51H,52H,53H,54H,55H,56H,57H
	DB	58H,59H,5AH,5BH,5CH,5DH,5EH,5FH
	DB	60H,61H,62H,63H,64H,65H,66H,67H
	DB	68H,69H,6AH,6BH,6CH,6DH,6EH,6FH
	DB	70H,71H,72H,73H,74H,75H,76H,77H
	DB	78H,79H,7AH,7BH,7CH,7DH,7EH,7FH
	DB	80H,81H,82H,83H,84H,85H,86H,87H
	DB	88H,89H,8AH,8BH,8CH,8DH,8EH,8FH
	DB	90H,91H,92H,93H,94H,95H,96H,97H
	DB	98H,99H,9AH,9BH,9CH,9DH,9EH,9FH
	DB	0A0H,0A1H,0A2H,0A3H,0A4H,0A5H,0A6H,0A7H
	DB	0A8H,0A9H,0AAH,0ABH,0ACH,0ADH,0AEH,0AFH
	DB	0B0H,0B1H,0B2H,0B3H,0B4H,0B5H,0B6H,0B7H
	DB	0B8H,0B9H,0BAH,0BBH,0BCH,0BDH,0BEH,0BFH
	DB	0C0H,0C1H,0C2H,0C3H,0C4H,0C5H,0C6H,0C7H
	DB	0C8H,0C9H,0CAH,0CBH,0CCH,0CDH,0CEH,0CFH
	DB	0D0H,0D1H,0D2H,0D3H,0D4H,0D5H,0D6H,0D7H
	DB	0D8H,0D9H,0DAH,0DBH,0DCH,0DDH,0DEH,0DFH
	DB	0E0H,0E1H,0E2H,0E3H,0E4H,0E5H,0E6H,0E7H
	DB	0E8H,0E9H,0EAH,0EBH,0ECH,0EDH,0EEH,0EFH
	DB	0F0H,0F1H,0F2H,0F3H,0F4H,0F5H,0F6H,0F7H
	DB	0F8H,0F9H,0FAH,0FBH,0FCH,0FDH,0FEH,0FFH
	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
	DB	20H,21H,22H,23H,24H,25H

	END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -