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

📄 queue.asm

📁 在定时器中断中做LED的PWM输出 AT89C2051实现A/D转换的C51程序 单片机开发系统 指令系统 程序设计 定时与中断 系统扩展 接口技术 串行口
💻 ASM
字号:
;循环队列有关算法
FRONT	EQU	2000H	;循环队列存储空间的起始地址。
N	EQU	200	;数组数据元素的个数(不超过255)。
F	DATA	3EH	;队首指针的存放单元。
R	DATA	3FH	;队尾指针的存放单元。
XH	DATA	30H	;待入队数据高字节的存放单元。
XL	DATA	31H	;待入队数据低字节的存放单元。

	ORG	0000H
	LJMP	TEST
	
	ORG	100H
TEST:	LCALL	SETNULL	;初始化空队
	MOV	XH,#5AH
	MOV	XL,#6CH	
	LCALL	DATAIN	;数据5A6CH入队
	MOV	XH,#3CH
	MOV	XL,#8AH	
	LCALL	DATAIN	;数据3C8AH入队
	MOV	XH,#13H
	MOV	XL,#4EH	
	LCALL	DATAIN	;数据134EH入队
	MOV	XH,#9FH
	MOV	XL,#3DH	
	LCALL	DATAIN	;数据9F3DH入队
	LCALL	DATAOUT	;数据5A6CH出队
	LCALL	DATAOUT	;数据3C8AH出队
	LCALL	DATAOUT	;数据134EH出队
STOP:	LJMP	STOP	;队列中还剩一个数据9F3DH

SETNULL:MOV	A,#N	;初始化空队,取双字节数组的大小。
	DEC	A	;减一,指向数组的最后一个单元。
	MOV	F,A	;使队首指针指向数组的最后一个单元。
	MOV	R,A	;使队尾指针也指向数组的最后一个单元。
	RET		;设置好空队列。

DATAIN:	MOV	A,R	;数据入队,先取队尾指针的当前值。
	INC	A	;后移一个单元。
	CJNE	A,#N,DIN1;超范围否?
	CLR	A	;返回起始端。
DIN1:	CJNE	A,F,DIN2;满队否?
	SETB	C	;满队,入队失败。
	SJMP	DINE	;结束。
DIN2:	MOV	R,A	;新队尾有效。
	MOV	DPTR,#FRONT;取起始地址。
	CLR	C	;计算偏移量,求得新队尾的绝对地址。
	RLC	A
	JNC	DIN3
	INC	DPH
DIN3:	ADD	A,DPL
	MOV	DPL,A
	CLR	A
	ADDC	A,DPH
	MOV	DPH,A
	MOV	A,XH	;取待入队数据的高字节。
	MOVX	@DPTR,A	;排入队尾。
	INC	DPTR	;调整地址。
	MOV	A,XL	;取待入队数据的低字节。
	MOVX	@DPTR,A	;排入队尾。
	CLR	C	;入队成功。
DINE:	RET		;结束。

DATAOUT:MOV	A,F	;数据出队,先取队首指针的当前值。
	CJNE	A,R,DOUT1;空队否?
	SETB	C	;空队,出队失败。
	SJMP	DOUTE	;结束。
DOUT1:	INC	A	;后移一个单元。
	CJNE	A,#N,DOUT2;超范围否?
	CLR	A	;返回起始端。
DOUT2:	MOV	F,A	;新队首有效。
	MOV	DPTR,#FRONT;取起始地址。
	CLR	C	;计算偏移量,求得原队首的绝对地址。
	RLC	A	
	JNC	DOUT3
	INC	DPH
DOUT3:	ADD	A,DPL
	MOV	DPL,A
	CLR	A
	ADDC	A,DPH
	MOV	DPH,A
	MOVX	A,@DPTR	;取待出队数据的高字节。
	MOV	XH,A	;放入存放单元。
	INC	DPTR	;调整地址。
	MOVX	A,@DPTR	;取待出队数据的低字节。
	MOV	XL,A	;放入存放单元。
	CLR	C	;出队成功。
DOUTE:	RET		;结束。
	END







⌨️ 快捷键说明

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