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

📄 2005-8-26.asm

📁 阀位控制器源程序 利用PIC16F873A
💻 ASM
📖 第 1 页 / 共 2 页
字号:

;*************阀位控制器源程序(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 + -