📄 2005-8-26.asm
字号:
;*************阀位控制器源程序(PIC16F873A)***************
ADCON1 EQU 9FH
ADCON0 EQU 1FH
ADRESH EQU 1EH
CCP1CON EQU 17H
CCP2CON EQU 1DH
CCPR1L EQU 15H
CCPR2L EQU 1BH
EECON1 EQU 18CH
EECON2 EQU 18DH
EEADR EQU 10DH
EEDATA EQU 10CH
EEPGD EQU 7H
GO EQU 2H
INTCON EQU 0BH
INTF EQU 1H
OPTION_REG EQU 81H
PR2 EQU 92H
PORTB EQU 06H
PORTC EQU 07H
PCL EQU 02H
RP0 EQU 5H
RP1 EQU 6H
STATUS EQU 03h
STATUS_TEMP EQU 23H
T2CON EQU 12H
TRISA EQU 85H
TRISB EQU 86H
TRISC EQU 87H
TMRO EQU 01H
W_TEMP EQU 24H
WREN EQU 2H
WR EQU 1H
RD EQU 0H
COUNT7 EQU 61H
DATE8 EQU 62H
COUNT6 EQU 63H ;设置延时
COUNT5 EQU 64H ;灯亮灭判断
COUNT4 EQU 65H ;灯闪烁间隔时间
COUNT2 EQU 66H ;计数寄存器
COUNT3 EQU 67H ;计数寄存器
DATE7 EQU 68H ;判控制信号暂存器
ADDR EQU 69H ;写EEPROM地址寄存器
FLAG EQU 6AH ;电机状态标志(再启动时用)
ACCALO EQU 6Bh ;存放除数低8位
ACCAHI EQU 6Ch ;存放除数高8位
ACCBLO EQU 6Dh ;存放被除数和商的低8位;乘法结果低8位
ACCBHI EQU 6Eh ;存放被除数和商的高8位;乘法结果高8位
ACCCLO EQU 6Fh ;存放余数低8位
ACCCHI EQU 70h ;存放余数高8位
ACCDLO EQU 71h ;临时寄存器
ACCDHI EQU 72h ;临时寄存器
TEMP EQU 73h ;临时寄存器
SIGN EQU 74h ;存放商的符号
MULCND EQU 75h ; 8 bit multiplicand
MULPLR EQU 76h ; 8 bit multiplier
COUNT EQU 77h ; loop counter
DATE1 EQU 78H ;零位参考电压寄存器地址
DATE2 EQU 79H ;满程参考电压寄存器地址
DATE3 EQU 7AH ;阀位电位器信号地址
DATE4 EQU 7BH ;控制信号暂存器地址
DATE5 EQU 7CH ;整定后的阀位信号暂存器地址
DATE6 EQU 7DH ;差值寄存器
TEMP1 EQU 7EH ;
COUNT1 EQU 7FH ;
ORG 000H
NOP
MAIN
;***********************初始化寄存值*******************************
BCF STATUS,RP1 ;选择体1
BSF STATUS,RP0
MOVLW 07H
MOVWF OPTION_REG
;***********************初始化PWM***********************************
MOVLW B'00110001' ;设置CCP1为输出
MOVWF TRISC
MOVLW 0XFF ;设定PWM周期为最大值FFH
MOVWF PR2
MOVLW B'00000001'
MOVWF TRISB ;RB0为输入,其他为输出
BCF STATUS,RP0 ;选择体0
MOVLW 0FFH
MOVWF PORTB ;初始化B口
MOVLW 05H
MOVWF COUNT4 ;设置灯闪烁初值
BSF FLAG,1 ;置第一次运行标志
BCF FLAG,2 ;清正向运行标志
BCF FLAG,3 ;清反向运行标志
BSF PORTC, 3 ;矢信号报警信号
MOVLW 0CH ;工作于PWM模式
MOVWF CCP1CON
MOVWF CCP2CON
CLRF CCPR1L
CLRF CCPR2L
CLRF T2CON ;设定TMR2;预分频比1:1
BSF T2CON,2 ;启动TMR2
MOVLW 0FFH
MOVWF COUNT2 ;控制信号设定完成后启动操作(延时采样)
MOVLW 03H
MOVWF COUNT3 ;同上
;***********************启动定时器0********************************
BCF INTCON,2
MOVLW 06H
MOVWF TMRO
;***********************初始化A/D转换(取阀位信号)*******************************
CLRF ADCON1 ;转换结果格式设置(传递出了实时的阀位信号DATE3)
BCF STATUS,RP0
START MOVLW 0C1H
MOVWF ADCON0 ;设置RC时钟源,使能ADC,AN0被选中
CALL DELAY20
BSF ADCON0,GO ;开始A/D转换
WAIT BTFSC ADCON0,GO ;等待转换结束
GOTO WAIT
MOVF ADRESH,W
MOVWF DATE3
MOVWF DATE8 ;暂存阀位信号
BSF PORTB,6 ;电机停止转动
BSF PORTB,7
BSF PORTB,4 ;开运行指示灯灭
BSF PORTB,5
CLRF ADDR ;读取满程和零点参考
CALL READ
MOVWF DATE1
MOVLW 01H
MOVWF ADDR
CALL READ
MOVWF DATE2
BCF STATUS,0 ;超出设定值的处理
SUBWF DATE3,W
BTFSS STATUS,0
GOTO RUN1
MOVF DATE2,W
MOVWF DATE3
;***********************脉宽计算************************************
RUN1 MOVF DATE1,W ;计算【(FF-33H)×(顺时值-零位参考)/(满程参考-零位参考)】+33H
BCF STATUS,0
SUBWF DATE3,W
BTFSS STATUS,0
MOVLW 00H
MOVWF MULCND ;瞬时值-零参考
MOVLW 0CCH
MOVWF MULPLR ;FF-33
CALL MUL
MOVF DATE1,W
SUBWF DATE2,W ;满程参考-零位参考
MOVWF ACCALO
CLRF ACCAHI
call div
movlw 33h
ADDWF ACCBLO,W ;取商的低8?
MOVWF CCPR1L
MOVWF CCPR2L
;************************取控制信号*******************************
MOVLW 0C9H
MOVWF ADCON0 ;设置RC时钟源,使能ADC,AN1被选中
CALL DELAY20
BSF ADCON0,GO ;开始A/D转换
WAIT1 BTFSC ADCON0,GO ;等待转换结束
GOTO WAIT1
MOVF ADRESH,W ;控制信号送W
BTFSS INTCON,2
GOTO Q1
DECFSZ COUNT2,F
GOTO Q1
DECFSZ COUNT3,F
GOTO Q1
;********灯闪烁控制********
DECFSZ COUNT4,F
GOTO Q2
MOVLW 05H
MOVWF COUNT4
BCF PORTB,1
DECFSZ COUNT5,F
BTFSS COUNT5,0
BSF PORTB,1
Q2 BCF STATUS,2
XORWF DATE7,F
BTFSC STATUS,2
MOVWF DATE4 ;将控制信号送DATE4
MOVWF DATE7
BCF INTCON,2
MOVLW 06H
MOVWF TMRO
MOVLW 0ffH
MOVWF COUNT2
MOVLW 3H
MOVWF COUNT3
;************************检测是否失信号******************************
Q1 MOVLW 19H
BCF STATUS,0
SUBWF DATE4,W
BTFSS STATUS,0
GOTO ERR ;报警
;************************取反馈信号**********************************
BSF PORTC, 3
MOVLW 0D1H
MOVWF ADCON0 ;设置RC时钟源,使能ADC,AN2被选中
CALL DELAY20
BSF ADCON0,GO ;开始A/D转换
WAIT2 BTFSC ADCON0,GO ;等待转换结束
GOTO WAIT2
MOVF ADRESH,W ;控制信号送W
MOVWF DATE5 ;将控制信号送DATE5
;***********************检测调零、调满***********************************
ZERO BTFSC PORTB,0
GOTO CAP
CALL DELAY20
BTFSC PORTB,0
GOTO CAP
MOVLW 35H
BCF STATUS,0
SUBWF DATE4,0
BTFSC STATUS,0
GOTO TEXT1
BCF PORTB,1 ;设置指示灯亮
MOVLW 64H
MOVWF COUNT6
call DELAY1
CLRF ADDR
CALL WRITE
BSF PORTB,1
GOTO CAP
TEXT1 MOVLW 0F0H
MOVWF TEMP1
MOVF DATE4,W
BCF STATUS,0
SUBWF TEMP1,W
BTFSC STATUS,0
GOTO CAP
BCF PORTB,1
MOVLW 64H
MOVWF COUNT6
call DELAY1
MOVLW 01H
MOVWF ADDR
CALL WRITE
BSF PORTB,1
;*******************比较取得电机运行状态*****************************
CAP BTFSS PORTB,0
GOTO CAP
CALL DELAY20
BTFSS PORTB,0
GOTO CAP
;******电机启动延时(第一次启动)********
BTFSS FLAG,1 ;第一次启动标志:FLAG.1=1第一次启动\FLAG.1=0非第一次启动
GOTO Q3
MOVLW 40H
MOVWF COUNT6
CALL DELAY1
BCF FLAG,1
;******判是正误差?是负误差?*******
Q3 MOVF DATE4,W
BCF STATUS,0 ;清C
SUBWF DATE5,W ;阀位信号-控制信号(W)
MOVWF DATE6 ;暂存
BTFSS STATUS,0 ;判断C
GOTO X1 ;若瞬时信号<控制信号,则开度较小,跳到判开运行
;*********电机关运行**********
BTFSS FLAG,0 ;电机状态标志:FLAG.0=1停\FLAG.0=0运行
GOTO K1 ;FLAG.0=0
BCF STATUS,0 ;判启动
MOVLW 4H ;启动误差
SUBWF DATE6,W
BTFSS STATUS,0
GOTO ADJUST ;误差<启动误差跳到Y1,不启动
MOVLW 019H
MOVWF COUNT6
CALL DELAY1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -