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

📄 计算.asm

📁 用光电耦合器测量出重物下降过程中经过任何等距离且在同一垂直线上的三点时间间隔t1,t2,及距离h
💻 ASM
📖 第 1 页 / 共 2 页
字号:
 ;*****************单片机计算重力加速度g软件清单********************;

;总的公式为:2(S2*T1-S1*T2)/T1*T2(T1+T2)


	
	ORG	0000H
	LJMP	MAIN				;主程序

MAIN:	MOV	SP,#70H				;设置堆栈
	MOV	R0,#20H				;清内存
	CLR	A
CLRS:	MOV	@R0,A
	INC	R0
	CJNE 	R0,#80H,CLRS

	MOV	33H,#00				;T2
	MOV	34H,#12H
	MOV	35H,#39H

	MOV	36H,#00H			;T1
	MOV	37H,#20H
	MOV	38H,#71H

	MOV	R0,#33H
	LCALL	BTOF
	MOV	R0,#36H
	LCALL	BTOF

	MOV	R3,#3
	MOV	R0,#33H				;计算T1*T2
	MOV	R1,#30H
	LCALL	SHIFT				;R0的内容转移到R1?	MOV	R0,#30H
	MOV	R1,#36H
	LCALL	FMUL				;浮点数乘法
	MOV	R0,#30H
	;LCALL	FTOB
	MOV	R1,#39H				;T1*T2乘积放在39H,3AH,3BH
	MOV	R3,#3
	LCALL	SHIFT
	
	MOV	R0,#33H				;计算T1+T2
	MOV	R1,#30H
	MOV	R3,#3
	LCALL	SHIFT
	MOV	R0,#30H
	;LCALL	BTOF
	;MOV	R0,#36H
	;LCALL	BTOF
	MOV	R0,#30H
	MOV	R1,#36H
	LCALL	FADD				;浮点数加法
	MOV	R0,#30H
	MOV	R1,#3CH
	MOV	R3,#3
	LCALL	SHIFT				;T1+T2和放在3CH,3DH,3EH	
	
	LCALL	S1
	;MOV	R0,#36H
	MOV	R0,#45H
	LCALL	BTOF
	MOV	R0,#36H
	MOV	R1,#45H
	LCALL	FMUL
	;LCALL	FTOB
	MOV	R1,#30H
	MOV	R3,#3
	LCALL	SHIFT
	MOV	R0,#36H
	MOV	R1,#30H
	LCALL	FADD				;得到2*S2*T1在36H,37H,38H中

	LCALL	S1
	MOV	R0,#45H
	LCALL	BTOF
	MOV	R0,#33H
	MOV	R1,#45H
	LCALL	FMUL
	MOV	R1,#30H
	MOV	R3,#3
	LCALL	SHIFT
	MOV	R0,#33H
	MOV	R1,#30H
	LCALL	FADD				;得到2*S1*T2在33H,34H,35H中
	;LCALL	FTOB
	
	MOV	R0,#36H				;得到2(S2*T1-S1*T2)在36H,37H,38H中
	MOV	R1,#33H
	LCALL	FSUB

	MOV	R1,#39H
	LCALL	FDIV
	MOV	R1,#3CH
	LCALL	FDIV				
	LCALL	FTOB				;得到最终结果BCD码在36H,37H,38H中
	NOP
	NOP


	;MOV	R3,#3
	;MOV	R0,#36H
	;MOV	R1,#49H				;从49H单元开始存储
	;MOV	A,R1
	;ADD	A,NUM3
	;MOV	R1,A
	;LCALL	SHIFT
	;MOV	A,NUM3				;偏移量改变
	;ADD	A,#3
	;MOV	NUM3,A
	;LCALL	KEYIN
	;RET

S1:	MOV	R0,#45H				;假设S1=S2=0.5米
	MOV	A,#00H
	MOV	@R0,A
	INC	R0
	MOV	A,#50H
	MOV	@R0,A
	INC 	R0
	CLR	A
	MOV	@R0,A
	RET	
		
SHIFT:	MOV	A,@R0
	MOV	@R1,A
	INC	R0
	INC	R1
	DJNZ	R3,SHIFT
	RET					;得到最终结果BCD码在33H,34H,35H中
Z_THTL:	MOV	R0,#30H				;0.06553部分处理
	MOV	A,#7FH
	MOV	@R0,A
	INC	R0
	MOV	A,#65H
	MOV	@R0,A
	INC	R0
	MOV	A,#53H
	MOV	@R0,A
	MOV	R0,#30H
	LCALL	BTOF				;转换为二进制浮点操作数
	RET

L_THTL:	MOV	R0,#45H				;需要除1000000处理
	MOV	A,#07H
	MOV	@R0,A
	INC	R0
	MOV	A,#10H
	MOV	@R0,A
	INC	R0
	MOV	A,#00H
	MOV	@R0,A
	MOV	R0,#30H
	LCALL	BTOF				;转换为二进制浮点操作数
	RET
;(2)  标号;  FADD    功能;浮点数加法
;入口条件;被加数在[R0]中,加数在[R1]中。
;出口信息;OV=0时,和仍在[R0]中,OV=1时,溢出。
;影响资源;PSW、A、B、R2~R7、位1EH、1FH  堆栈需求;  6字节

FADD:	CLR	F0	;设立加法标志
	SJMP	AS	;计算代数和

;(3)  标号;  FSUB    功能;浮点数减法
;入口条件;被减数在[R0]中,减数在[R1]中。
;出口信息;OV=0时,差仍在[R0]中,OV=1时,溢出。
;影响资源;PSW、A、B、R2~R7、位1EH、1FH    堆栈需求;6字节

FSUB:	SETB	F0			;设立减法标志
AS:	LCALL	MVR1			;计算代数和。先将[R1]传送到第二工作区
	MOV	C,F0			;用加减标志来校正第二操作数的有效符号
	RRC	A
	XRL	A,@R1
	MOV	C,ACC.7
ASN:	MOV	1EH,C				;将第二操作数的有效符号存入位1EH中
	XRL	A,@R0				;与第一操作数的符号比较
	RLC	A
	MOV	F0,C				;保存比较结果
	LCALL	MVR0				;将[R0]传送到第一工作区中
	LCALL	AS1				;在工作寄存器中完成代数运算
MOV0:	INC	R0				;将结果传回到[R0]中的子程序入口
	INC	R0
	MOV	A,R4				;传回尾数的低字节
	MOV	@R0,A
	DEC	R0
	MOV	A,R3				;传回尾数的高字节
	MOV	@R0,A
	DEC	R0
	MOV	A,R2				;取结果的阶码
	MOV	C,1FH				;取结果的数符
	MOV	ACC.7,C				;拼入阶码中
	MOV	@R0,A
	CLR	ACC.7				;不考虑数符
	CLR	OV				;清除溢出标志
	CJNE	A,#3FH,MV01			;阶码是否上溢?
	SETB	OV				;设立溢出标志
MV01:	MOV	A,@R0				;取出带数符的阶码
	RET
MVR0:	MOV	A,@R0				;将[R0]传送到第一工作区中的子程序
	MOV	C,ACC.7				;将数符保存在位1FH中
	MOV	1FH,C
	MOV	C,ACC.6				;将阶码扩充为8bit补码
	MOV	ACC.7,C
	MOV	R2,A				;存放在R2中
	INC	R0
	MOV	A,@R0				;将尾数高字节存放在R3中
	MOV	R3,A
	INC	R0
	MOV	A,@R0				;将尾数低字节存放在R4中
	MOV	R4,A
	DEC	R0				;恢复数据指针
	DEC	R0
	RET
MVR1:	MOV	A,@R1				;将[R1]传送到第二工作区中的子程序
	MOV	C,ACC.7				;将数符保存在位1EH中
	MOV	1EH,C
	MOV	C,ACC.6				;将阶码扩充为8bit补码
	MOV	ACC.7,C
	MOV	R5,A				;存放在R5中
	INC	R1
	MOV	A,@R1				;将尾数高字节存放在R6中
	MOV	R6,A
	INC	R1
	MOV	A,@R1				;将尾数低字节存放在R7中
	MOV	R7,A
	DEC	R1				;恢复数据指针
	DEC	R1
	RET
AS1:	MOV	A,R6				;读取第二操作数尾数高字节
	ORL	A,R7
	JZ	AS2				;第二操作数为零,不必运算
	MOV	A,R3				;读取第一操作数尾数高字节
	ORL	A,R4
	JNZ	EQ1
	MOV	A,R6				;第一操作数为零,结果以第二操作数为准
	MOV	R3,A	
	MOV	A,R7
	MOV	R4,A
	MOV	A,R5
	MOV	R2,A
	MOV	C,1EH
	MOV	1FH,C
AS2:	RET
EQ1:	MOV	A,R2				;对阶,比较两个操作数的阶码
	XRL	A,R5
	JZ	AS4				;阶码相同,对阶结束
	JB	ACC.7,EQ3			;阶符互异
	MOV	A,R2				;阶符相同,比较大小
	CLR	C
	SUBB	A,R5
	JC	EQ4
EQ2:	CLR	C				;第二操作数右规一次
	MOV	A,R6				;尾数缩小一半
	RRC	A
	MOV	R6,A
	MOV	A,R7
	RRC	A
	MOV	R7,A
	INC	R5				;阶码加一
	ORL	A,R6				;尾数为零否?
	JNZ	EQ1				;尾数不为零,继续对阶
	MOV	A,R2				;尾数为零,提前结束对阶
	MOV	R5,A
	SJMP	AS4
EQ3:	MOV	A,R2				;判断第一操作数阶符
	JNB	ACC.7,EQ2			;如为正,右规第二操作数
EQ4:	CLR	C
	LCALL	RR1				;第一操作数右规一次
	ORL	A,R3				;尾数为零否?
	JNZ	EQ1				;不为零,继续对阶
	MOV	A,R5				;尾数为零,提前结束对阶
	MOV	R2,A
AS4:	JB	F0,AS5				;尾数加减判断
	MOV	A,R4				;尾数相加
	ADD	A,R7
	MOV	R4,A
	MOV	A,R3	
	ADDC	A,R6
	MOV	R3,A
	JNC	AS2
	LJMP	RR1				;有进位,右规一次
AS5:	CLR	C				;比较绝对值大小
	MOV	A,R4
	SUBB	A,R7
	MOV	B,A
	MOV	A,R3
	SUBB	A,R6
	JC	AS6
	MOV	R4,B				;第一尾数减第二尾数
	MOV	R3,A
	LJMP	RLN				;结果规格化
AS6:	CPL	1FH				;结果的符号与第一操作数相反
	CLR	C				;结果的绝对值为第二尾数减第一尾数
	MOV	A,R7
	SUBB	A,R4
	MOV	R4,A
	MOV	A,R6
	SUBB	A,R3
	MOV	R3,A
RLN:	MOV	A,R3				;浮点数规格化
	ORL	A,R4				;尾数为零否?
	JNZ	RLN1
	MOV	R2,#0C1H			;阶码取最小值
	RET     	
RLN1:	MOV	A,R3
	JB	ACC.7,RLN2			;尾数最高位为一否?
	CLR	C				;不为一,左规一次
	LCALL	RL1
	SJMP	RLN				;继续判断
RLN2:	CLR	OV				;规格化结束
	RET
RL1:	MOV	A,R4				;第一操作数左规一次
	RLC	A				;尾数扩大一倍
	MOV	R4,A
	MOV	A,R3
	RLC	A
	MOV	R3,A
	DEC	R2				;阶码减一
	CJNE	R2,#0C0H,RL1E			;阶码下溢否?
	CLR	A
	MOV	R3,A				;阶码下溢,操作数以零计
	MOV	R4,A
	MOV	R2,#0C1H
RL1E:	CLR	OV
	RET
RR1:	MOV	A,R3				;第一操作数右规一次
	RRC	A				;尾数缩小一半
	MOV	R3,A
	MOV	A,R4
	RRC	A
	MOV	R4,A
	INC	R2				;阶码加一
	CLR	OV				;清溢出标志
	CJNE	R2,#40H,RR1E			;阶码上溢否?
	MOV	R2,#3FH				;阶码溢出
	SETB	OV
RR1E:	RET

;(5)  标号;  FDIV    功能;浮点数除法
;入口条件;被除数在[R0]中,除数在[R1]中。
;出口信息;OV=0时,商仍在[R0]中,OV=1时,溢出。
;影响资源;PSW、A、B、R2~R7、位1EH、1FH   堆栈需求;  5字节

FDIV:	INC	R0
	MOV	A,@R0
	INC	R0
	ORL	A,@R0
	DEC	R0
	DEC	R0
	JNZ	DIV1
	MOV	@R0,#41H			;被除数为零,不必运算
	CLR	OV
	RET
DIV1:	INC	R1
	MOV	A,@R1
	INC	R1  	
	ORL	A,@R1
	DEC	R1
	DEC	R1  	
	JNZ	DIV2	
	SETB	OV				;除数为零,溢出
	RET     	
DIV2:	LCALL	MVR0				;将[R0]传送到第一工作区中
	MOV	A,@R0
	XRL	A,@R1				;比较两个操作数的符号
	RLC	A
	MOV	1FH,C				;保存结果的符号
	LCALL	MVR1				;将[R1]传送到第二工作区中
	LCALL	DIV3				;调用工作区浮点除法
	LJMP	MOV0				;回传结果
DIV3:	CLR	C				;比较尾数的大小
	MOV	A,R4
	SUBB	A,R7
	MOV	A,R3
	SUBB	A,R6
	JC	DIV4
	LCALL	RR1				;被除数右规一次
	SJMP	DIV3
DIV4:	CLR	A				;借用R0R1R2作工作寄存器
	XCH	A,R0				;清零并保护之
	PUSH	ACC
	CLR	A
	XCH	A,R1
	PUSH	ACC
	MOV	A,R2
	PUSH	ACC
	MOV	B,#10H				;除法运算,R3R4/R6R7-→R0R1
DIV5:	CLR	C
	MOV	A,R1
	RLC	A
	MOV	R1,A
	MOV	A,R0
	RLC	A
	MOV	R0,A
	MOV	A,R4
	RLC	A
	MOV	R4,A
	XCH	A,R3
	RLC	A
	XCH	A,R3
	MOV	F0,C
	CLR	C
	SUBB	A,R7
	MOV	R2,A
	MOV	A,R3
	SUBB	A,R6

⌨️ 快捷键说明

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