📄 elc-1.asm
字号:
;**************************************************************************
;程序名称: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 + -