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

📄 elc-1.asm

📁 该程序为测量交流电频率
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;**************************************************************************
;程序名称:ELC-1
;程序说明:
;作者:刘东
;日期:2007-9
;**************************************************************************
;***********赋值定义***********
SW              EQU     P1.0  		;断路器输出控制
					
KEY             EQU     P1.1            ;按键输入

OE              EQU     P1.2            ;显示输出允许(CD4094)
DSP_DAT         EQU     P3.0
DSP_CLK         EQU     P3.1

WDI             EQU     P1.3            ;看门狗的喂狗时钟

SDO             EQU     P1.4            ;CS5460与单片机的SPI通信
SDI             EQU     P1.5            ;
SCLK            EQU     P1.6            ;
;**********位标志定义**********         ;
FG00		BIT	20H.0		;FABP、FMUL、FDIV,FPLN,FSIN
FG01		BIT	20H.1		;FSDT、FABP、FDIV
FG02		BIT	20H.2		;FABP、FADD、FSUB、FINT
FG03		BIT	20H.3		;FSIN
FG04		BIT	20H.4		;INTF、FINT、FBTD
FG05		BIT	20H.5		;
FG06		BIT	20H.6		;FBTD
FG07		BIT	20H.7		;FBTD

FIR_INT         BIT     21H.0           ;是否为采集的第一个周期标志位
F_EXINT0        BIT     21H.1           ;中断0标志
F_ZERO          BIT     21H.2           ;定时器0溢出标志(0频率标志)
FQYF		BIT	21H.3		;是否为歧异频率标志,1为是,0否

FRCH		BIT	21H.4		;频率变化标志
F_SUDD		BIT	21H.5		;信号突然断线
FRUP		BIT	21H.6		;频率上升标志
FRDW		BIT	21H.7		;频率下降标志
F_LOOP          BIT     22H.0           ;循环显示F,I,V
F_FRE           BIT     22H.1           ;固定显示频率
F_I             BIT     22H.2           ;固定显示电流
F_V             BIT     22H.3           ;固定显示电压
ABNOR           BIT     23H.4           ;异常频率标志

;*********特殊字节定义*********         ;
PERIOD1		EQU	30H		;电机周期(高字节)
PERIOD2		EQU	31H		;电机周期(中字节)
PERIOD3		EQU	32H		;电机周期(低字节)
COUNT		EQU	33H		;频率测量计数器
CLCS		EQU	34H		;测量次数初值
QYCS		EQU	35H		;歧义频率连续次数
TIME0		EQU	36H		;定时器0高位
DISPLAY1	EQU	37H		;显示第一字节寄存器
DISPLAY2	EQU	38H		;显示第二字节寄存器
DISPLAY3	EQU	39H		;显示第三字节寄存器
DISPLAY4	EQU	3AH		;显示第四字节寄存器
DISPLAY5        EQU     3BH             ;显示第五字节寄存器

;******测量结果保存寄存器******         ;
FREQUE		EQU	80H		;测量的频率寄存器(三字节)
FREQU1		EQU	83H		;第一次测量的结果(三字节)
FRE_MAX		EQU	86H		;最大频率(三字节)
COMP_FRE	EQU	89H		;比较用的频率,判断上升和下降用

;*******************************************************************************
		ORG	0000H           	;
	    	JMP	MAIN            	;

	    	ORG	0003H	        	;外部中断0
	    	SJMP    EX_INT0         	;
	    	RETI                    	;

	    	ORG	000BH			;定时器0
	    	SJMP    TIMER0          	;
 	    	RETI                    	;

;***********中断0程序**********                 ;
EX_INT0:    	CLR     TR0  			;停止定时
            	JB      FIR_INT,EX_INT01      	;检测是否为第一次触发,是则跳转
            	MOV     PERIOD3,TL0           	;不是第一次触发,则将测得的值读出
            	MOV     PERIOD2,TH0           	;
	    	MOV     PERIOD1,TIME0         	;
            	MOV     TL0,#0FH              	;重新设置初值(带补偿)
            	MOV     TH0,#0H               	;0
            	MOV     TIME0,#0H             	;
            	SETB    F_EXINT0              	;设立中断标志位,频率计算程序进行处理
            	SETB    TR0                   	;开启定时器0
            	RETI                            ;

EX_INT01:   	CLR     FIR_INT               	;是第一次触发,则不定时,清第一次触发标志
           	MOV	TL0,#0BH              	;设置周期计数初值(低位)
           	MOV	TH0,#0H               	;                  中位
	    	MOV     TIME0,#0H             	;                  高位
            	SETB    TR0                   	;开启定时器0
	    	RETI

;*****定时器0中断处理程序******               	;
TIMER0:     	PUSH    ACC                   	;
	    	PUSH    PSW                   	;
            	INC	TIME0                 	;溢出加一
            	MOV	A,TIME0               	;
	    	CLR	C                     	;
	    	SUBB    A,#64H             ;<---;比较测量周期高字节与设定值(3s)大小
	    	JB	ACC.5,TIMER01         	;测量周期高字节大于设定值时,则认为为0频率
	    	SETB    F_ZERO			;置0频率标志
TIMER01:    	POP    	PSW                   	;
	    	POP     ACC                   	;
	    	RETI 



;*********************主程序*************************
MAIN:	    	MOV	SP,#07H
	    	LCALL   INIT		      	;初始化
MAIN1:		LCALL	PRO_FRE
		MOV     DISPLAY5,#0FEH   	;LED显示频率(FD为电流,FB为电压)	
		MOV	R0,#FREQUE
		LCALL	DISP_FLT
		LCALL 	DELAY
		SJMP	MAIN1

;************初始化************
INIT:      	MOV	TCON,#00000001B		;设置外部中断0为跳变触发方式
            	MOV	TMOD,#00010001B   	;定时器模式,采用工作方式1
            	;MOV     SCON,#00H             	;设置串口工作方式0
			
            	SETB    FIR_INT               	;第一次中断标志
            	MOV     R0,#FREQUE            	;初始化频率为0
            	MOV     @R0,#00H         	;
           	INC     R0                    	;
            	MOV   	@R0,#00H               	;
            	INC     R0                    	;
            	MOV     @R0,#00H               
            	CLR     OE                    	;置显示初值
            	SETB    EX0                   	;开外部中断
            	SETB    ET0                   	;开定时器0
            	SETB    EA                    	;开中断总开关
            	RET

;频率部分
;***************************计算频率程序********************************
PRO_FRE:    ;JB	      F_ZERO,PRO_FRE1	      ;0频率转
	    JB	      F_EXINT0,PRO_FRE3	      ;有外部0中断转
	    RET

PRO_FRE1:                                     ;判断是否突然断信号
            MOV	      R0,#COMP_FRE	      ;R0放比较频率首地址
	    MOV	      70H,#5		      ;被比较值为20HZ(浮点数),变化大于20HZ,则认为是信号是突然断
	    MOV	      71H,#0A0h
	    MOV	      72H,#0
	    MOV	      R1,#70H                 ;
	    LCALL     FSUB                    ;调用浮点数减法,差在R4R2R3中
            MOV	      A,R4                    ;读取结果符号位字节
	    JB	      ACC.7,PRO_FRE2	      ;非突然断信号跳转
	    SETB      F_SUDD                  ;突然信号则置标志位
	    LCALL     PRO_ABN                 ;突然信号调用处理程序

	    CLR	      TR0
	    CLR	      F_ZERO
	    RET


PRO_FRE2:   CLR	      TR0                     ;0频率则频率寄存器置0
	    MOV	      TIME0,#0
	    MOV	      TH0,#0
	    MOV	      TL0,#0
	    MOV	      R0,#FREQUE
	    MOV	      @R0,#0
	    INC	      R0
            MOV	      @R0,#0
	    INC	      R0
  	    MOV	      @R0,#0
            MOV	      R0,#FREQU1
	    MOV	      @R0,#0
	    INC	      R0
	    MOV	      @R0,#0
	    INC	      R0
	    MOV	      @R0,#0
	    MOV	      COUNT,#0                ;重设初值
	    CLR	      EX0
	    MOV	      PERIOD1,#0
	    MOV       PERIOD2,#0
	    MOV	      PERIOD3,#0
	    CLR	      TCON.1                  ;外部中断0标志位
	    CLR	      F_ZERO
	    CLR	      F_EXINT0
	    SETB      FIR_INT
	    SETB      EX0                     ;重测
	    RET

PRO_FRE3:   CLR	      F_EXINT0
	    CLR	      EX0
	    MOV	      40H,PERIOD1             ;读取计数值
	    MOV	      41H,PERIOD2
	    MOV	      42H,PERIOD3
	    SETB      EX0
            MOV       A,PERIOD1
            JB        ACC.5,PRO_FRE2          ;值过大,重新计数
	    MOV       A,40H
	    JNZ	      PRO_FRE4		      ;周期不为0转
	    MOV	      A,41H
	    JNZ	      PRO_FRE4		      ;周期不为0转
	    MOV	      A,42H
            JNZ	      PRO_FRE4		      ;周期不为0转
	    SJMP      PRO_FRE2                ;周期为0,跳转

PRO_FRE4:   LCALL     QCQYPL                  ;判断是否有歧异频率
	    JNB	      FQYF,PRO_FRE5           ;非歧异频率转
	    RET


PRO_FRE5:   MOV	      A,PERIOD1
	    JZ	      PRO_FRE6		      ;>15转	测量6次
	    CLR	      C
	    SUBB      A,#3
	    JC	      PRO_FRE7		      ;>5转	测量2次
	    MOV	      CLCS,#1                 ;小于5转,测量1次
	    SJMP      PRO_FRE8

PRO_FRE6:   MOV	      CLCS,#6                 ;置测量次数6
	    SJMP      PRO_FRE8

PRO_FRE7:   MOV	      CLCS,#2                 ;置测量次数2

PRO_FRE8:   MOV	      R0,#43H
	    MOV	      R1,#FREQU1
	    LCALL     FADD                    ;调用浮点数加法程序
	    MOV	      A,R4                    ;结果放在FREQU1中
	    MOV	      @R1,A
	    INC	      R1
	    MOV	      A,R2
	    MOV	      @R1,A
	    INC	      R1
	    MOV       A,R3
	    MOV	      @R1,A
	    INC	      COUNT                    ;测量计数器加一
	    MOV	      A,COUNT                  ;比较采集次数是否达到预设值
	    CLR	      C
	    SUBB      A,CLCS
	    JNC	      PRO_FRE9                 ;
	    RET
PRO_FRE9:   CLR	      FG04                     ;设立INTF函数操作数的符号位
            MOV	      R2,#0                    ;R2R3为操作数的值
	    MOV       R3,COUNT
	    MOV	      R1,#46H                  ;转化后存放结果的首地址
	    LCALL     INTF                     ;将除数转化为浮点数
	    MOV	      R0,#FREQU1               ;取出多次测量值的总和
	    LCALL     FDIV                     ;计算平均周期
	    MOV	      R0,#FREQUE               ;结果放入FREQUE寄存器中,为频率计数的浮点值
	    MOV	      A,R4
	    MOV	      @R0,A
	    INC	      R0
	    MOV	      A,R2
	    MOV	      @R0,A
	    INC	      R0
	    MOV	      A,R3
	    MOV	      @R0,A

            MOV       R1,#FREQU1               ;清0,以便重新测量
	    MOV	      @R1,#0
	    INC	      R1
	    MOV	      @R1,#0
	    INC	      R1
    	    MOV	      @R1,#0
	    MOV	      COUNT,#0

	    RET


;**************************比较频率***********************************
CMP_FRE:    NOP
CMP_FRE1:   MOV	      R0,#FREQUE              ;比较测得的频率与最大频率
	    MOV	      R1,#FRE_MAX
	    LCALL     FSUB
	    MOV	      A,R4
	    JB        ACC.7,CMP_FRE3          ;比最大频率小,跳转
	    MOV	      A,@R0		      ;比最大频率大,则保存最大频率
	    MOV	      @R1,A                   ;将R0中的值保存到R1(高字节)
	    INC	      R0
	    INC	      R1
	    MOV	      A,@R0                   ;中字节
	    MOV	      @R1,A
	    INC	      R0
	    INC	      R1
	    MOV	      A,@R0                   ;低字节
	    MOV	      @R1,A


CMP_FRE3:   MOV	      R0,#FREQUE              ;比较测得的频率与比较频率
	    MOV	      R1,#COMP_FRE
	    LCALL     FSUB
	    MOV	      43H,#7FH		      ;0.5
	    MOV	      44H,#80H
	    MOV	      45H,#00H
	    MOV	      A,R4
	    JNB	      ACC.7,CMP_FRE5	      ;差为正跳转
	    CLR	      ACC.7		      ;差为负,取绝对值
	    MOV	      40H,A                   ;结果放入40H为首地址的三字节存储器
	    MOV	      41H,R2
	    MOV	      42H,R3
	    MOV	      R0,#40H
	    MOV	      R1,#43H
	    LCALL     FSUB                    ;将结果与0.5比较
	    MOV	      A,R4
	    JB	      ACC.7,CMP_FRE4	      ;没超过范围(0.5)转
	    SETB      FRDW		      ;负,超出范围,置降频率标志
	    CLR	      FRUP		      ;清升频率标志
	    MOV	      R1,#COMP_FRE            ;设置下一次的比较频率
	    MOV	      R0,#FREQUE
	    MOV	      A,@R0
	    MOV	      @R1,A
	    INC	      R0
	    INC	      R1
	    MOV	      A,@R0
	    MOV	      @R1,A
	    INC	      R0
	    INC	      R1
	    MOV	      A,@R0
	    MOV	      @R1,A
CMP_FRE4:   NOP
	    RET


CMP_FRE5:   MOV	      40H,A		        ;差为正
	    MOV	      41H,R2
	    MOV	      42H,R3
	    MOV	      R0,#40H
	    MOV	      R1,#43H
	    LCALL     FSUB
	    MOV	      A,R4
	    JB	      ACC.7,CMP_FRE6		;没超过范围转
	    CLR	      FRDW
	    SETB      FRUP			;正超出范围,置升频率标志
	    MOV	      R1,#COMP_FRE
	    MOV	      R0,#FREQUE
	    MOV	      A,@R0
	    MOV	      @R1,A
	    INC	      R0
	    INC	      R1
	    MOV	      A,@R0
	    MOV	      @R1,A
	    INC	      R0
	    INC	      R1
	    MOV	      A,@R0
	    MOV	      @R1,A
CMP_FRE6:   NOP
	    RET

;**************************去除歧异频率程序*****************************
QCQYPL:     MOV	      R0,#40H                   ;三字节整数首地址
	    MOV	      R1,#43H                   ;三字节浮点数首地址
	    LCALL     INT3F                     ;三字节整数转化为三字节浮点数
	    MOV	      46H,#20		        ;1,000,000
	    MOV	      47H,#0F4H
	    MOV	      48H,#24H
	    MOV	      R0,#46H
	    MOV	      R1,#43H
	    LCALL     FDIV                      ;频率浮点数形式
	    MOV	      43H,R4                    ;保存在43H开始的存储单元
	    MOV	      44H,R2
	    MOV	      45H,R3

	    MOV	      A,PERIOD1
	    CLR	      C
	    SUBB      A,#3                       ;5HZ
	    JC	      QCQYPL6                    ;大于5HZ跳转
	    CLR	      FQYF                       ;清歧异频率标志位
	    RET

QCQYPL6:    MOV	      R0,#43H
	    MOV	      R1,#FREQUE
	    LCALL     FSUB                       ;现在的频率减去上次的频率,即频率的变化值
	    MOV	      A,R4
	    CLR	      ACC.7                      ;取绝对值
	    MOV	      50H,A                      ;存放与50H为首地址的单元
	    MOV	      51H,R2
	    MOV	      52H,R3

	    MOV	      A,R2
	    JNZ	      QCQYPL1                     ;不为0跳转QCQYPL1
	    MOV	      A,R3
	    JNZ	      QCQYPL1                     ;不为0跳转QCQYPL1
	    SJMP      QCQYPL2                     ;为0,则跳转QCQYPL2

QCQYPL1:    MOV	      R0,#50H                     ;被除数(频率变化值)
	    LCALL     FDIV                        ;变化值除以上次频率
	    JC	      QCQYPL2                     ;除数(上一次频率)为0跳转
	    MOV	      50H,R4                      ;结果放于50H开始的存储单元
	    MOV	      51H,R2
	    MOV	      52H,R3

 	    MOV	      53H,#00		         ;0.5
	    MOV	      54H,#80H
	    MOV	      55H,#00H

	    MOV	      R0,#50H                    ;被减数为频率变化率
	    MOV	      R1,#53H                    ;减数为0.5
	    LCALL     FSUB
	    MOV	      A,R4
	    JNB	      ACC.7,QCQYPL3              ;标志位未置位时跳转,即变化率大于0.5
QCQYPL2:    MOV	      QYCS,#0                    ;变化率小于0.5,则歧异频率连续次数置0
	    CLR	      FQYF                       ;清歧异频率标志位
	    RET

QCQYPL3:    INC	      QYCS                       ;频率变化率大于0.5,则加歧异频率次数加一
	    MOV	      A,QYCS
	    CLR	      C
	    SUBB      A,#3                       ;歧异频率连续次数是否大于3次
	    JNC	      QCQYPL4                    ;不大于3次,则跳QCQYPL4
	    SETB      FQYF                       ;大于3次,则置歧异频率标志位
	    RET

QCQYPL4:    CLR	      FQYF                       ;歧异频率连续次数小于3次,清标志位
	    MOV	      QYCS,#0                    ;次数重置0
     	    RET


;***********************显示部分*********************
;显示R0所指单元的浮点数
DISP_FLT:   	MOV  	DPTR,#SEGTAB           	;段码地址
            	MOV	56H,#10			;1000   ;程序入口
	    	MOV	57H,#0FAH
	    	MOV	58H,#00H
	    	MOV	R1,#56H
	    	LCALL   FSUB
	    	MOV	A,R4
	    	JB	ACC.7,DISP_FL1
	    	LJMP    DISP_FL4		;>1000转

DISP_FL1:   	MOV	59H,#07			;100
	    	MOV	5AH,#0C8H
	    	MOV	5BH,#00H
	    	MOV	R1,#59H
	    	LCALL   FSUB
	    	MOV	A,R4
	    	JB	ACC.7,DISP_FL2
	    	LJMP    DISP_FL5		;>100转

DISP_FL2:   	MOV	59H,#04			;10
	    	MOV	5AH,#0A0H
	    	MOV	5BH,#00H
	    	MOV	R1,#59H
	    	LCALL   FSUB
	    	MOV	A,R4
	    	JB	ACC.7,DISP_FL3
	    	LJMP    DISP_FL6		;>10转

DISP_FL3:   	LCALL 	FINT			;<10
	    	MOV	A,R3
	    	MOV	DISPLAY1,#3FH           ;置0
	    	MOVC    A,@A+DPTR
            	SETB    ACC.7
            	MOV     DISPLAY2,A

	    	MOV	R1,#5CH                 ;同DISP_FL6
	    	LCALL   INTF
	    	LCALL   FSUB
	    	MOV	56H,R4
	    	MOV	57H,R2
	    	MOV	58H,R3
	    	MOV	R0,#56H
	    	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
            	MOV     DISPLAY3,A
	    	MOV	A,B
            	MOVC    A,@A+DPTR
            	MOV     DISPLAY4,A
	    	LCALL   DIS_DAT
	    	RET

DISP_FL4:   	MOV	59H,#07		      	;100
	    	MOV	5AH,#0C8H
	    	MOV	5BH,#00H		;>1000
	    	MOV	R1,#59H
	    	LCALL   FDIV                    ;显示的数除以100
	    	MOV	56H,R4                  ;结果保存在60H为首地址的单元
	    	MOV	57H,R2
	    	MOV	58H,R3
	    	MOV	R0,#56H                 ;以R0为首地址的寄存器中的值为显示数据除以100后的浮点数
	    	LCALL   FINT                    ;将除得的数据转换为整数
	    	MOV	A,R3                    ;取得显示数据的前两位
	    	MOV	B,#10
	    	DIV	AB                      ;商为显示数据第一位,余数为显示数据第二位
	    	MOVC    A,@A+DPTR               ;送显示数据到寄存器
            	MOV     DISPLAY1,A
	    	MOV	A,B
            	MOVC    A,@A+DPTR
            	MOV     DISPLAY2,A               ;
	    	MOV	R1,#5CH
	    	LCALL   INTF                    ;双字节整数转化为三字节浮点数
	    	LCALL   FSUB                    ;结果为显示数据除以100的浮点数的小数部分
	    	MOV	56H,R4
	    	MOV	57H,R2
	    	MOV	58H,R3
	    	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                      ;A为显示数据的第三位,余数为第四位
	    	MOVC    A,@A+DPTR               ;送显示数据到寄存器
            	MOV     DISPLAY3,A
	    	MOV	A,B
            	MOVC    A,@A+DPTR
            	MOV     DISPLAY4,A
	    	LCALL   DIS_DAT
	    	RET


DISP_FL5:   	MOV	59H,#04		      	;10
	    	MOV	5AH,#0A0H
	    	MOV	5BH,#00H		;1000>   >100
	    	MOV	R1,#59H
	    	LCALL   FDIV                    ;将显示数据转化为带两位整数的浮点数
	    	MOV	56H,R4
	    	MOV	57H,R2
	    	MOV	58H,R3
	    	MOV	R0,#56H
	    	LCALL   FINT                    ;取得显示数据的前两位
	    	MOV	A,R3
	    	MOV	B,#10
	    	DIV	AB
	    	MOVC    A,@A+DPTR
            	MOV     DISPLAY1,A
	    	MOV	A,B
            	MOVC    A,@A+DPTR
            	MOV     DISPLAY2,A
	    	MOV	R1,#5CH
	    	LCALL   INTF
	    	LCALL   FSUB                    ;取显示数据除以10后的小数部分
	    	MOV	56H,R4
	    	MOV	57H,R2
	    	MOV	58H,R3

⌨️ 快捷键说明

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