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

📄 elc-1.asm

📁 该程序为测量交流电频率
💻 ASM
📖 第 1 页 / 共 3 页
字号:
	    	MOV	59H,#07		      	;100
	    	MOV	5AH,#0C8H
	    	MOV	5BH,#00H
	    	MOV	R1,#59H
	    	LCALL   FMUL
	    	MOV	56H,R4
	    	MOV	57H,R2
	    	MOV	58H,R3
	    	LCALL   FINT
	    	MOV	A,R3
	    	MOV	B,#10
	    	DIV	AB                      ;取得显示数据后两位
	    	MOVC    A,@A+DPTR
            	SETB    ACC.7                   ;添加小数点
            	MOV     DISPLAY3,A
            	MOV     A,B
            	MOVC    A,@A+DPTR
	    	MOV	DISPLAY4,A
	    	LCALL   DIS_DAT
	    	RET


DISP_FL6:   	LCALL 	FINT			;100>   >10
	    	MOV	A,R3
	    	MOV	B,#10
	    	DIV	AB                      ;取得显示数据的整数部分
	    	MOVC    A,@A+DPTR               ;送显示数据的前两位到寄存器
            	MOV     DISPLAY1,A
            	MOV     A,B
            	MOVC    A,@A+DPTR
            	SETB    ACC.7                   ;设置小数点
            	MOV	DISPLAY2,A
	    	MOV	R1,#5CH
	    	LCALL   INTF                    ;取显示数据的整数部分
	    	LCALL   FSUB                    ;取显示数据的小数部分
	    	MOV	56H,R4                  ;保存到60H
            	MOV	57H,R2
	    	MOV	58H,R3
	    	MOV	59H,#07		      	;置浮点数100
	    	MOV	5AH,#0C8H
            	MOV	5BH,#00H
	    	MOV	R0,#56H
	    	MOV	R1,#59H
	    	LCALL   FMUL                    ;显示数据的小数部分乘以100
	    	MOV	56H,R4
	    	MOV	57H,R2
	    	MOV	58H,R3
	    	LCALL   FINT                    ;取得显示数据后两位
	    	MOV	A,R3
	    	MOV	B,#10
	    	DIV	AB
            	MOVC    A,@A+DPTR               ;送显示数据到相应寄存器
           	MOV     DISPLAY3,A
            	MOV     A,B
            	MOVC    A,@A+DPTR
            	MOV     DISPLAY4,A
	    	LCALL   DIS_DAT
	    	RET

;**************************显示程序************************
DIS_DAT:    	;MOV   	SCON,#00H       	;设置串口工作方式0
            	CLR     OE
            	MOV     R1,#5
            	MOV     R0,#DISPLAY5            ;

DIS_DAT1:   	;MOV    SBUF,@R0       		;送显示数据的第四字节到SBUF发送,并启动发送,P3.1开始有CLK输出
	    	;JNB    TI,$                    ;发送完毕后TI置位
	    	;CLR    TI                      ;清标志位
            	MOV     R2,#8
            	MOV     A,@R0
DIS_DAT2:   	CLR     DSP_CLK
            	RLC     A
            	MOV     DSP_DAT,C
            	SETB    DSP_CLK
            	DJNZ    R2,DIS_DAT2
            	DEC     R0                  	;传输下一字节的地址
;	    	DEC     R1
	    	DJNZ    R1,DIS_DAT1             ;是否输出最后一个字节
	    	SETB    OE                      ;打开输出允许,显示数据
	    	NOP
	    	RET

;***********数码管段码译码表********************
SEGTAB:		DB 3FH,06H,5BH,4FH,66H    	;0,1,2,3,4
       		DB 6DH,7DH,07H,7FH,6FH          ;5,6,7,8,9

;************************延时子程序********************************
DELAY:     	MOV   	R4,#03H
AA2:       	MOV   	R5,#0FFH
AA1:       	MOV   	R6,#0FFH
AA:        	NOP
          	NOP
           	DJNZ  	R6,AA
           	DJNZ  	R5,AA1
           	DJNZ  	R4,AA2
           	RET 
			     
;************************闪烁显示程序**********************
DIS_FLASH:  	NOP
            	RET
PRO_ABN:	NOP
		RET


;******************************************************************************
;*                              浮点运算子程序库                              *
;******************************************************************************

;**********三字节浮点数转换为四字节浮点数*************
;R0放三字节浮点数首地址,R1放四字节浮点数首地址,R2放浮点数个数
FLOAT3TO4:  NOP
            INC	    R0			;(R0)(R0+1)(R0+2)是否为0
            MOV	    A,@R0
	    JNZ	    FLOAT3T2
	    INC	    R0
	    MOV	    A,@R0
	    JNZ	    FLOAT3T1
	    MOV	    @R1,#0
	    INC	    R1
            MOV	    @R1,#0
	    INC	    R1
	    MOV	    @R1,#0
	    INC	    R1
            MOV     @R1,#0
	    INC	    R1
	    INC     R0
	    DJNZ    R2,FLOAT3TO4	;判断转换结束否
	    RET
FLOAT3T1:   DEC	    R0
FLOAT3T2:   DEC     R0
            MOV	    A,@R0		;取三字节浮点数的第一个字节
	    INC	    R0			;三字节浮点数指针加1
	    MOV     B,A
            MOV     C,ACC.6
	    MOV	    ACC.7,C    		;阶码扩大到8位

	    ADD	    A,#01111110B	;加上偏移量变成移码
            MOV     C,B.7
	    RRC	    A			;循环右移,加回数符并保存最低位
	    MOV	    @R1,A		;保存四字节浮点数第一个字节
	    INC	    R1			;四字节浮点数指针加1
	    MOV	    A,@R0		;取三字节浮点数的第二个字节
	    INC	    R0			;三字节浮点数指针加1
	    MOV	    ACC.7,C		;最高位加上阶码的最后一位
	    MOV	    @R1,A		;保存四字节浮点数第二个字节
	    INC	    R1			;四字节浮点数指针加1
	    MOV	    A,@R0		;取三字节浮点数的第三个字节直接保存到四字节浮点数的第三字节
	    INC	    R0
	    MOV	    @R1,A
	    INC	    R1
	    MOV	    @R1,#00H		;四字节浮点数第四位补0
	    INC	    R1
	    DJNZ    R2,FLOAT3TO4	;判断转换结束否
	    RET

;***************四字节浮点数转换为三字节浮点数***************
;***************R0放三字节浮点数首地址,R1放四字节浮点数首地址,R2放浮点数个数**********
FLOAT4TO3:  NOP
            MOV      A,@R1
            JNZ      FLOAT4T4
            INC      R1
            MOV      A,@R1
            JNZ      FLOAT4T3
            INC      R1
            MOV      A,@R1
            JNZ      FLOAT4T2
            INC      R1
            MOV      A,@R1
            JNZ      FLOAT4T1
            MOV      @R0,#00H
            INC      R0
            MOV      @R0,#00H
            INC      R0
            MOV      @R0,#00H
            INC      R0
            INC      R1
            DJNZ     R2,FLOAT4TO3
            RET
FLOAT4T1:   DEC      R1
FLOAT4T2:   DEC      R1
FLOAT4T3:   DEC      R1
	    MOV	     A,@R1
FLOAT4T4:   INC	     R1
            MOV	     B,@R1
	    INC	     R1
	    MOV	     C,B.7
	    RLC	     A
            MOV      B.7,C
   	    ADD	     A,#10000010B
            MOV      C,ACC.7
            MOV	     ACC.6,C
            MOV      C,B.7
            MOV	     ACC.7,C
	    MOV	     @R0,A
	    INC	     R0
	    SETB     B.7
	    MOV	     @R0,B
	    INC      R0
	    MOV	     A,@R1
	    INC	     R1
	    MOV	     B,@R1
            INC      R1
	    MOV	     C,B.7
	    ADDC     A,#00H
	    MOV	     @R0,A
	    INC	     R0
	    DJNZ     R2,FLOAT4TO3
	    RET

;**************三字节浮点数->三字节整数****************
;**************R0放三字节浮点数首地址,R1放结果(三字节整数)首地址***************
F3INT:	MOV	A,@R0
      	JB	ACC.6,F3INT2
	CLR	ACC.7
	CLR	C
	SUBB	A,#25
	JNC	F3INT3			;数大于2的24次方转
        MOV     A,@R0
        CLR     ACC.7
	MOV	R7,A
	INC	R0
	MOV	A,@R0
	MOV	R5,A
	INC	R0
	MOV	A,@R0
	MOV	R6,A
	MOV	R2,#00H
	MOV	R3,#00H
	MOV	R4,#00H
F3INT1:	CLR	C
	MOV	A,R6
	RLC	A
	MOV	R6,A
	MOV	A,R5
	RLC	A
	MOV	R5,A
	MOV	A,R4
	RLC	A
	MOV	R4,A
	MOV	A,R3
	RLC	A
	MOV	R3,A
	MOV	A,R2
	RLC	A
	MOV	R2,A
	DJNZ	R7,F3INT1
        MOV     A,R2
	MOV	@R1,A
	INC	R1
        MOV     A,R3
	MOV	@R1,A
	INC	R1
        MOV     A,R4
	MOV	@R1,A
	RET

F3INT2:	MOV	@R1,#00H
	INC	R1
	MOV	@R1,#00H
	INC	R1
	MOV	@R1,#00H
	RET

F3INT3:	MOV	@R1,#0FFH
	INC	R1
	MOV	@R1,#0FFH
	INC	R1
	MOV	@R1,#0FFH
	RET
;*****************三字节整数转化为三字节浮点数*******************
;************R0放三字节整数首地址,R1放结果(三字节浮点数)首地址************
INT3F:  MOV     A,@R0
        MOV	R2,A
	INC	R0
        MOV     A,@R0
	MOV	R3,A
	INC	R0
        MOV     A,@R0
	MOV	R4,A
	DEC	R0
	DEC	R0
	MOV	B,#0
	MOV	R7,#24
INT3F1:	MOV	A,R2
	JB	ACC.7,INT3F2
	MOV	A,R4
	CLR	C
	RLC	A
	MOV	R4,A
	MOV	A,R3
	RLC	A
	MOV	R3,A
	MOV	A,R2
	RLC	A
	MOV	R2,A
	INC	B
	DJNZ	R7,INT3F1
INT3F2:	INC	R1
        MOV     A,R2
	MOV	@R1,A
	INC	R1
        MOV     A,R3
	MOV	@R1,A
	DEC	R1
	DEC	R1
	MOV	A,#24
	CLR	C
	SUBB	A,B
	MOV	@R1,A
	RET

;*********************三角正弦函数*************************************************
;*********R0放弧度(三字节浮点数)首地址,R1放结果(三字节浮点数)首地址***********
FSIN:	MOV	@R1,#2		;3.14159->(R1)
	INC	R1
	MOV	@R1,#0C9H
	INC	R1
	MOV	@R1,#10H
	DEC	R1
	DEC	R1
	LCALL	FDIV		;结果在R4R2R3;符号在FG00
	MOV	A,R0
	PUSH	ACC		;保存指针R0
	INC	SP
	MOV	A,SP
	INC	SP
	INC	SP
	XCH	A,R1
	MOV	R0,A
	MOV	A,R4
	CLR	ACC.7
	MOV	R4,A
	JZ	FSM1
	JNB	ACC.6,FSM3
FSM1:	MOV	R4,#40H
	MOV	R2,#0
	MOV	R3,#0
	SJMP	FSM4
FSM2:	CLR	C
	MOV	A,R2
	RRC	A
	MOV	R2,A
	MOV	A,R3
	RRC	A
	MOV	R3,A
	INC	R4
FSM3:	CJNE	R4,#16,FSM2
FSM4:	MOV	A,R3
	MOV	C,ACC.0
	MOV	FG03,C
	JNB	FG00,FSM5
	CPL	FG03
FSM5:	MOV	A,R4
	MOV	R6,A
	SETB	C
	CLR	PSW.5
	LCALL	FSDT
	MOV	A,R6
	MOV	C,FG00
	MOV	ACC.7,C
	MOV	R4,A
	LCALL	FSTR
	LCALL	FMUL
	MOV	A,R0
	XCH	A,R1
	DEC	A
	MOV	SP,A
	LCALL	FSTR
	POP	ACC
	PUSH	ACC
	MOV	R0,A
	LCALL	FSUB
	MOV	A,R4
	CLR	ACC.7
	MOV	R4,A
	LCALL	FSTR
	MOV	A,R1
	MOV	R0,A
	LJMP	FPLN
FSM6:	MOV	A,@R1
	MOV	C,FG03
	MOV	ACC.7,C
	MOV	@R1,A
	POP	ACC
	MOV	R0,A
	RET
DXSCSBG:DB	0F7H,0A8H,70H
	DB	7AH,0C6H,70H
	DB	0F9H,0C5H,68H
	DB	0FEH,0A5H,41H
	DB	0FAH,26H,0A0H
	DB	1,80H,0EH
	DB	0FBH,0,1CH
	DB	40H
;*********************多项式计算子程序*******************************
;程序为三字节浮点数X的多项式计算子程序
;入口时,X存放于(R0)指向的内部RAM中,(R1)指向存放结果的内部RAM单元
;FPLN子程序中调用FABP和WDMUL等子程序,使用DPTR,A,R0-R7寄存器
;********************************************************************
FPLN:	MOV     DPTR,#DXSCSBG
	CLR	A
	MOVC	A,@A+DPTR
	MOV	R6,A
	INC	DPTR
	CLR	A
	MOVC	A,@A+DPTR
	MOV	R2,A
	INC	DPTR
	CLR	A
	MOVC	A,@A+DPTR
	MOV	R3,A
	INC	DPTR
FP1:	MOV	A,@R0
	XRL	A,R6
	MOV	C,ACC.7
	MOV	FG00,C
	INC	R0
	MOV	A,@R0
	MOV	R4,A
	INC	R0
	MOV	A,@R0
	MOV	R5,A
	DEC	R0
	DEC	R0
	LCALL	WDMUL
	MOV	A,R2
	JB	ACC.7,FP2
	MOV	A,R7
	RLC	A
	MOV	A,R3
	RLC	A
	MOV	R3,A
	MOV	A,R2
	RL	A
	MOV	R2,A
	DEC	R6
FP2:	MOV	A,R6
	ADD	A,@R0
	MOV	C,FG00
	MOV	ACC.7,C
	MOV	R6,A
	CLR	A
	MOVC	A,@A+DPTR
	MOV	R7,A
	INC	DPTR
	CLR	A
	MOVC	A,@A+DPTR
	MOV	R4,A
	INC	DPTR
	CLR	A
	MOVC	A,@A+DPTR
	MOV	R5,A
	INC	DPTR
	CLR	FG02
	LCALL	FABP
	MOV	A,R4
	MOV	R6,A
	CLR	A
	MOVC	A,@A+DPTR
	CJNE	A,#40H,FP1
	LCALL	FSTR
	INC	DPTR
	CLR	A
	LJMP	FSM6

;****************定点无符号双字节小数(纯小数)乘法子程序******************
;被乘数:R4(高位)R5(低位)
;乘数:R2(高位)R3(低位)
;结果返回:R2R3R7
;使用累加器A,寄存器B,R2,R3,R4,R5,R6,R7及标志位F0
;************************************************************************
WDMUL:	MOV	A,R3
	MOV	B,R5
	MUL	AB
	MOV	R7,B
	MOV	A,R3
	MOV	B,R4
	MUL	AB
	ADD	A,R7
	MOV	R7,A
	CLR	A
	ADDC	A,B
	MOV	R3,A
	MOV	A,R2
	MOV	B,R5
	MUL	AB
	ADD	A,R7
	MOV	R7,A
	MOV	A,R3
	ADDC	A,B
	MOV	R3,A
	MOV	PSW.5,C
	MOV	A,R2
	MOV	B,R4
	MUL	AB
	ADD	A,R3
	MOV	R3,A
	CLR	A
	ADDC	A,B
	MOV	C,PSW.5
	ADDC	A,#0
	MOV	R2,A
	RET
;*********************通用规格化子程序FSDT********************
;功能:使两操作数的阶码相等
;CY=0,F=0,则对R6(阶)R2R3进行右规一位操作,右移输入位为FG01
;CY=0,F=1,则对R7(阶)R4R5进行右规一位操作,右移输入位为FG01
;CY=1,则对R6(阶)R2R3进行左规格化,第一次左移输入位为FG01
;使用A,CY,F0,R0-R7
;**************************************************************
	NOP
	NOP
FSDT:	JC    FS2		;通用规格化子程序
	MOV   C,FG01
	JB    PSW.5,FS1
	MOV   A,R2
	RRC   A
	MOV   R2,A
	MOV   A,R3
	RRC   A
	MOV   R3,A
	INC   R6
	RET
FS1:	MOV   A,R4
	RRC   A
	MOV   R4,A
	MOV   A,R5
	RRC   A
	MOV   R5,A
	INC   R7
	RET
FS2:	MOV	A,R2
	JNZ	FS4
	CJNE  R3,#0,FS5
	MOV   R6,#41H
FS3:	RET
FS4:	JB    ACC.7,FS3
FS5:	MOV   C,PSW.5
	MOV   A,R3
	RLC   A
	MOV   R3,A
	MOV   A,R2
	RLC   A
	MOV   R2,A
	CLR   PSW.5
	DEC   R6
	SJMP  FS2

;**********************浮点数取数子程序**********************

⌨️ 快捷键说明

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