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

📄 dyb.asm

📁 是大三时学校经常让学生做的单片机的实验之一
💻 ASM
字号:
	ADCS	BIT	P1.4		;A/D转换数据输出使能
	ADDATA	BIT	P1.3		;A/D转换输出数据
	ADCLK	BIT	P1.2		;A/D转换时钟,即串行时钟
	ADTEMP	EQU	30H		;A/D转换输出数据暂存单元
	DATA1L	EQU	31H		;第一次采样数据低位
	DATA1H	EQU	32H		;第一次采样数据高2位
	DATA2L	EQU	33H		;第二次采样数据低位
	DATA2H	EQU	34H		;第二次采样数据高2位
	DATA3L	EQU	35H		;第三次采样数据低位
	DATA3H	EQU	36H		;第三次采样数据高2位

	VOLT1	EQU	37H		;电压值千分位
	VOLT2	EQU	38H		;电压值百分位
	VOLT3	EQU	39H		;电压值十分位
	VOLT4	EQU	3AH		;电压值个位

	DISP0	EQU	40H		;显示区
	DISP1	EQU	41H
	DISP2	EQU	42H
	DISP3	EQU	43H
	DISP4	EQU	44H
	DISP5	EQU	45H
	DISP6	EQU	46H
	DISP7	EQU	47H
	DISP8	EQU	48H
	DISP9	EQU	49H
	DISPA	EQU	4AH
	DISPB	EQU	4BH
	DISPC	EQU	4CH
	DISPD	EQU	4DH
	DISPE	EQU	4EH
	DISPF	EQU	4FH

;===========================================================================================================

	ORG	0000H
	LJMP	START

	ORG	3000H
START:	MOV	SP,#60H
	LCALL	INIT
LOOP:	LCALL	FILT
	LCALL	DTV
	LCALL	DISP
	SJMP	LOOP

;===========================================================================================================

FILT:	LCALL	AD			;软件滤波子程序
	MOV	DATA1L,R6
	MOV	DATA1H,R7
	ACALL	DL			;延时约2ms
	LCALL	AD
	MOV	DATA2L,R6
	MOV	DATA2H,R7
	ACALL	DL
	LCALL	AD
	MOV	DATA3L,R6
	MOV	DATA3H,R7
	ACALL	MFILT3
	RET

DL:	MOV	R2,#00H
DL1:	NOP
	NOP
	DJNZ	R2,DL1
	RET

MFILT3:					;3次采样中值滤波子程序
	CLR	C
	MOV	A,DATA1L		;DATA1<DATA2?
	SUBB	A,DATA2L
	MOV	A,DATA1H
	SUBB	A,DATA2H
	JC	M1
	MOV	A,DATA1H		;DATA1>=DATA2,则交换DATA1和DATA2
	XCH	A,DATA2H
	MOV	DATA1H,A
	MOV	A,DATA1L
	XCH	A,DATA2L
	MOV	DATA1L,A
M1:	CLR	C
	MOV	A,DATA2L		;DATA2<DATA3?
	SUBB	A,DATA3L
	MOV	A,DATA2H
	SUBB	A,DATA3H
	JC	M2			;DATA2<DATA3,排序结束
	MOV	A,DATA2H		;DATA2>=DATA3,则交换DATA2和DATA3
	XCH	A,DATA3H
	MOV	DATA2H,A
	MOV	A,DATA2L
	XCH	A,DATA3L
	MOV	DATA2L,A
	CLR	C
	MOV	A,DATA1L		;DATA1<DATA2?
	SUBB	A,DATA2L
	MOV	A,DATA1H
	SUBB	A,DATA2H
	JC	M2			;DATA1<DATA2,排序结束
	MOV	A,DATA1H		;DATA1>=DATA2,以DATA1为中值,将中值存放于DATA2中
	MOV	DATA2H,A
	MOV	A,DATA1L
	MOV	DATA2L,A
M2:	RET

;===========================================================================================================

AD:	MOV	R7,#00			;A/D转换子程序
	MOV	R6,#00
	MOV	R5,#00
	SETB	ADCS
	ACALL	ADDL			;ADCS处于高电平,延时以便进入稳定状态
	CLR	ADCS
	ACALL	ADDL			;ADCS处于低电平,延时以便进入稳定状态
	MOV	R5,#10
RR0:	SETB	ADCLK
	NOP
	CLR	ADCLK
	DJNZ	R5,RR0			;产生10个ADCLK周期,从第3个ADCLK周期开始采样,一直持续到第10个周期
	ACALL	ADDL			;模拟量转化为数字量过程
	MOV	ADTEMP,R7		;A/D转换的高两位保存在R7中,数字量传输过程
	ACALL	CIR
	MOV	R7,ADTEMP
	SETB	ADCLK
	NOP
	CLR	ADCLK
	MOV	ADTEMP,R7
	ACALL	CIR
	MOV	R7,ADTEMP
	MOV	R5,#8			;A/D转换的低位保存在R6中,数字量传输过程
RR2:	SETB	ADCLK
	NOP
	CLR	ADCLK
	MOV	ADTEMP,R6
	ACALL	CIR
	MOV	R6,ADTEMP
	DJNZ	R5,RR2
	RET

CIR:	CLR	C			;将A/D转换的数字量高位存入C中 
	MOV	C,ADDATA
	MOV	A,ADTEMP
	RLC	A			;将A/D转换的数字量高位左移
	MOV	ADTEMP,A
	RET

ADDL:	MOV	R2,#24			;延时子程序
ADDL1:	DJNZ	R2,$
	RET

;===========================================================================================================

DTV:	MOV	A,DATA2L		;软件滤波结果转化为电压值子程序
	MOV	B,#5
	MUL	AB
	MOV	R5,A
	MOV	R4,B
	MOV	A,DATA2H
	MOV	B,#5
	MUL	AB
	ADD	A,R4
	MOV	R4,A
	MOV	R0,#VOLT1
	LCALL	IBTD
	LCALL	MODF
	RET

IBTD:	MOV	B,#5			;双字节二进制整数转换成BCD码子程序
	MOV	R6,#0
	MOV	R7,#10
IBTL1:	MOV	R2,#0
	MOV	R3,#0
	PUSH	B
	ACALL	NDIV
	POP	B
	MOV	A,R3
	MOV	@R0,A
	INC	R0
	DJNZ	B,IBTL1
	RET

NDIV:	MOV	A,R3			
	CLR	C
	SUBB	A,R7
	MOV	A,R2
	SUBB	A,R6
	JNC	NDVE1
	MOV	B,#16
NDVL1:	CLR	C
	MOV	A,R5
	RLC	A
	MOV	R5,A
	MOV	A,R4
	RLC	A
	MOV	R4,A
	MOV	A,R3
	RLC	A
	MOV	R3,A
	XCH	A,R2
	RLC	A
	XCH	A,R2
	MOV	C,F0
	CLR	C
	SUBB	A,R7
	MOV	R1,A
	MOV	A,R2
	SUBB	A,R6
	JB	F0,NDVM1
	JC	NDVD1
NDVM1:	MOV	R2,A
	MOV	A,R1
	MOV	R3,A
	INC	R5
NDVD1:	DJNZ	B,NDVL1
	CLR	F0
	RET
NDVE1:	SETB	F0
	RET

MODF:	MOV	A,VOLT4
	MOV	B,#2
	MUL	AB
	MOV	B,A
	CLR	C
	MOV	A,VOLT2
	SUBB	A,B
	MOV	VOLT2,A
	JNC	EXIT
	ADD	A,#10
	MOV	VOLT2,A
	CLR	C
	MOV	A,VOLT3
	SUBB	A,#1
	MOV	VOLT3,A
	JNC	EXIT
	MOV	A,VOLT3
	ADD	A,#10
	MOV	VOLT3,A
	DEC	VOLT4
EXIT:	RET

;===========================================================================================================

INIT:					;液晶显示初始化子程序
	MOV	R1,#30H			;功能设置,显示一行,字符点阵字体5×8
	LCALL	WI
	MOV	R1,#01H			;清显示
	LCALL	BF
	LCALL	WI
	MOV	R1,#06H			;设置输入模式,完成一个字符码传送后,DDRAM地址指针AC自动加1
	LCALL	BF
	LCALL	WI
	MOV	R1,#0CH			;开显示
	LCALL	BF
	LCALL	WI
	MOV	R7,#16
	MOV	R0,#DISP0
INIT1:	MOV	A,#0CH
	MOV	@R0,A
	INC	R0
	DJNZ	R7,INIT1
	RET

DISP:	MOV	DISP5,VOLT4			;液晶显示子程序
	MOV	DISP6,#0AH
	MOV	DISP7,VOLT3
	MOV	DISP8,VOLT2
	MOV	DISP9,VOLT1
	MOV	DISPA,#0BH
	LCALL	WDD
	LCALL	DELAY
	LCALL	DELAY
	LCALL	DELAY
	LCALL	DELAY
	RET

WDD:	MOV	R5,#16
	MOV	R1,#80H			;DDRAM地址设置,显示字符码首地址为80H
	MOV	R0,#DISP0
	ACALL	BF
	ACALL	WI
WDD1:	MOV	A,@R0
	ACALL	GETSEG
	MOV	R2,A
	ACALL	BF
	ACALL	WD
	INC	R0
	DJNZ	R5,WDD1
	RET

BF:	CLR	A			;检测忙
	MOV	DPTR,#0A001H
	MOVX	A,@DPTR
	JB	ACC.7,BF
	RET

WI:	MOV	DPTR,#0A000H		;写指令到指令寄存器
	MOV	A,R1
	MOVX	@DPTR,A
	RET

WD:	MOV	DPTR,#0A002H		;写数据到数据寄存器	
	MOV	A,R2
	MOVX	@DPTR,A
	RET

GETSEG:	MOV 	DPTR,#TAB
	MOVC 	A,@A+DPTR
	RET

DELAY:	MOV	R7,#00H
	MOV	R6,#00H
DELAY1:	DJNZ	R6,DELAY1
	NOP
	NOP
	DJNZ	R7,DELAY1
	RET

	ORG	2000H
TAB:	DB	30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
	DB	2EH,56H,20H

;===========================================================================================================

	END

⌨️ 快捷键说明

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