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

📄 electromotionbicyclepic16f72.asm

📁 基于MICROCHIP PIC16F系列电动自行车控制源码.
💻 ASM
📖 第 1 页 / 共 3 页
字号:
           BSF      STATUS,RP0
           BCF      PIE1,ADIE      ;禁止AD采样中断
           BCF      STATUS,RP0
           BCF      INTCON,INTE    ;关RB0中断
           MOVLW    FULLPWM         ;PWM输出全高
           MOVWF    CCPR1L
           BCF      T1CON,TMR1ON   ;关闭手柄采样
  BREAK2   BTFSC    ADCON0,GO      ;正在进行AD采样?
           GOTO     BREAK2          ;是,等待AD采样完毕
           BCF      ADCON0,CHS0
           BCF      ADCON0,CHS1    ;选择0采样通道,准备采样手柄电压
           BCF      PIR1,ADIF      ;清AD采样中断标志位
           MOVLW    0X06            ;延时
           MOVWF    COUNT
   BREAK3  DECFSZ   COUNT
           GOTO     BREAK3
  BREAK5   BSF      ADCON0,GO      ;采样TS值
  BREAK4   BTFSS    PIR1,ADIF      ;采样完毕?
           GOTO     BREAK4
           BCF      PIR1,ADIF
           BCF      STATUS,C   
           MOVF     ADRESH,0       ;当前TS值送被减数
           MOVWF    ACCbHI
           MOVLW    TSONH           ;1.5 V所对应的采样值送减数
           MOVWF    ACCaHI
           MOVLW    TSONL
           MOVWF    ACCaLO
           CALL     D_sub           ;当前TS值减1.5V
           MOVLW    FULLPWM
           MOVWF    CCPR1L
           CLRWDT
           BTFSS    ACCbHI,7       ;当前电压值大于1.5V?
           GOTO     BREAK5          ;是,重新采样
           BTFSC    PORTB,0
           GOTO     BREAK5
           BSF      FLAG1,OFF      ;否,置相应的标志位
           RETURN                   ;返回   
;*******************************
 OUT_PWM   BCF      FLAG1,PWM      ;清相应的标志位
           MOVF     TSH,0          ;将调速手柄采样值送至被加数
           MOVWF    ACCaHI
           MOVF     TSL,0
           MOVWF    ACCaLO
           MOVLW    0XFF            ;FF1F补码为0XE1,即1.1 V
           MOVWF    ACCbHI
           MOVLW    0X1F         
           MOVWF    ACCbLO
           CALL     D_add
     
           BTFSS    ACCbHI,7       ;TS>1.1V?
           GOTO     PWM1            ;是,转PWM1
           MOVLW    FULLPWM         ;否则输出全高
           MOVWF    CCPR1L
           RETURN
    PWM1   MOVLW    0XFD            ;0X27B=3.1V
           MOVWF    ACCbHI
           MOVLW    0X85
           MOVWF    ACCbLO
           BTFSC    ACCbHI,7       ;TS>3.1V?
           GOTO     PWM3
    PWM2   CLRF     CCPR1L
           BCF      CCP1CON,4
           BCF      CCP1CON,5
           RETURN
    PWM3   MOVLW    0X0FF           ;1.1 V对应的采样值补码送加数   
           MOVWF    ACCbHI         
           MOVLW    0X1F
           MOVWF    ACCbLO
           CALL     D_add           ;TS-1.1V
           CLRF     ACCaHI          ;系数K=56=38H送乘数
           MOVLW    0X3F
           MOVWF    ACCaLO
           CALL     D_mpy           ;得到放大128倍的低电平时间K*(TS-1.1V)
           MOVF     ACCcHI,0       ;将结果取出
           MOVWF    ACCaHI
           MOVF     ACCcLO,0
           MOVWF    ACCaLO   
           MOVLW    0X64            ;PWM周期T减去低电平时间,得到高电平时间
           MOVWF    ACCbHI
           CLRF     ACCbLO 
           CALL     D_sub         
           BTFSC    ACCbHI,7       ;低电平时间是否大于周期?
           GOTO     PWM2            ;是,输出全压
           RLF      ACCbLO          ;否则,输出与低电平时间对应的高电平时间
           RLF      ACCbHI
           MOVF     ACCbHI,0       ;D10~D2位送CCPR1L
           MOVWF    CCPR1L
           BCF      CCP1CON,5      ;D0位送CCP1CON5
           BTFSC    ACCbLO,7
           BSF      CCP1CON,5
           BCF      CCP1CON,4      ;D.1位送CCP1CON4      
           BTFSC    ACCbLO,6
           BSF      CCP1CON,4
           RETURN                   ;返回
;*******************************
   BRAKE   CALL     PUSH            ;保存现场
           BCF      STATUS,RP0     ;回存储区0
           BSF      FLAG1,SHUTDOWN ;置相应标志位
           BCF      INTCON,INTF    ;清中断标志位
           CALL     POP             ;恢复现场
           RETFIE                   ;中断返回
;********************************
   POWER   BCF      FLAG1,LOWPOWER;清相应的标志位
           MOVF     VOLTAGEH,0
           MOVWF    ACCaHI
           MOVF     VOLTAGEL,0
           MOVWF    ACCaLO
           MOVLW    VOLOFFH
           MOVWF    ACCbHI
           MOVLW    VOLOFFL
           MOVWF    ACCbLO
           CALL     D_sub
           BTFSC    ACCbLO,7       ;判断当前电池电压值是否低于保护电压(32V)
           RETURN                   ;不是,返回
           BCF      INTCON,INTE
           BCF      T1CON,TMR1ON   ;关闭电流采样
           MOVLW    FULLPWM
           MOVWF    CCPR1L
           RETURN                   ;返回
;***************************************************
  SAMPLE   MOVLW    AND             ;
           MOVWF    STATE1          ;暂存状态值
           MOVLW    0X08
           MOVWF    DELAY
    DEL1   DECFSZ   DELAY          
           GOTO     DEL1
           MOVLW    AND             ;
           MOVWF    STATE2
           MOVLW    0X06            
           MOVWF    DELAY
     DEL2  DECFSZ   DELAY
           GOTO     DEL2
           MOVLW    AND             ;
           MOVWF    STATE3
           XORWF    STATE1,0       ;与第一次状态相同吗?
           BTFSC    STATUS,Z
           RETURN                   ;相同则返回
           MOVF     STATE2,0       ;否则再与第二次状态相比较
           XORWF    STATE3,0
           BTFSS    STATUS,Z      
           GOTO     SAMPLE          ;
           MOVF     STATE2,0       ;第三次状态与第二次相同,则将正确状态赋予STATE1并
           MOVWF    STATE1          ;返回
           RETURN
;******************************************************
  OUTPUT   SWAPF    STATE1,1       ;
           BCF      STATUS,C       ;清C位,
           RRF      STATE1,0       ;
           CALL     OUT_TABLE       ;查表,
           MOVWF    PORTC           ;将输出值输出,
           RETURN
;**********************************************************
   SAMPRB  CALL     PUSH            ;现场保护 
           BCF      STATUS,RP0
           CALL     SAMPLE          ;采样RB口状态
           CALL     OUTPUT          ;根据RB口状态触发相应的MOSFET
           CALL     POP             ;恢复现场
           BCF      INTCON,RBIF    ;清RB口电平变化中断标志
           RETFIE                   ;中断返回
;************ AD采样中断服务程序***************
     AD    CALL     PUSH            ;保护现场
           BTFSC    FLAG1,VOLTAGE  ;是电压采样?
           GOTO     SET_VOL         ;是,作相应的处理
   SET_TS  BCF      ADCON0,CHS0    ;AD采样值是TS,则选择1采样通道
           INCF     COUNT_VOL       ;电压采样周期寄存器值加1
           BTFSS    STATUS,Z       ;电压采样周期到?
           GOTO     AD4
           BCF      ADCON0,CHS0    ;是,选择2采样通道
           BSF      ADCON0,CHS1
           BSF      FLAG1,VOLTAGE  ;置相应的标志位   
      AD4  BCF      PIR1,ADIF      ;清AD中断标志
           MOVF     ADRESH,0       ;采样值送寄存器暂存
           MOVWF    TSH
           BSF      STATUS,RP0
           MOVF     ADRESL,0
           BCF      STATUS,RP0
           MOVWF    TSL
           BSF      FLAG1,PWM
           BTFSS    FLAG1,VOLTAGE  ;是否需要进行电压采样?
           GOTO     AD6
           MOVLW    0X05            ;是,延时后采样电压
           MOVWF    TEMP1
      AD5  DECFSZ   TEMP1
           GOTO     AD5
           BSF      ADCON0,GO
     AD6   CALL     POP             ;恢复现场,中断返回
           RETFIE
  SET_VOL  BCF      ADCON0,CHS1    ;如果采样值为电压值,则选择0通道
           BCF      ADCON0,CHS0
           BCF      PIR1,ADIF      ;清中断标志位
           BCF      FLAG1,VOLTAGE  ;清相应标志位
           MOVF     ADRESH,0       ;将采样结果放入被减数寄存器
           MOVWF    VOLTAGEH
           BSF      STATUS,RP0
           MOVF     ADRESL,0
           BCF      STATUS,RP0
           MOVWF    VOLTAGEL
           BSF      FLAG1,LOWPOWER ;是,置相应标志位
           CALL     POP             ;中断返回
           RETFIE
;*************************************************
    PUSH   MOVWF    W_STACK         ;暂存W寄存器
           MOVF     STATUS,0       ;暂存STATUS寄存器
           MOVWF    ST_STACK
           RETURN                   ;子程序返回
;******************************************
     POP   MOVF     ST_STACK,0     ;恢复STATUS寄存器值
           MOVWF    STATUS
           MOVF     W_STACK,0      ;恢复W寄存器值
           RETURN                   ; 子程序返回
;*********************************************
   SETUP   MOVLW    .15             ;初始化TEMP      
           MOVWF    TEMP
           MOVF     ACCbHI,0       ;ACCb送ACCd
           MOVWF    ACCdHI
           CLRF     ACCbHI          ;清ACCb
           CLRF     ACCbLO
           RETLW    0
;********************************************
   S_SIGN  MOVF     ACCaHI,0       ;ACCaHI异或ACCbHI,结果送SIGN单元
           XORWF    ACCbHI,0
           MOVWF    SIGN         
           BTFSS    ACCbHI,7       ;ACCb为负?
           GOTO     CHEK_A          ;否,检查ACCa
           CALL     NEG_B
  CHEK_A   BTFSS    ACCaHI,7       ;ACCa为负?
           RETLW    0               ;ACCa和ACCb均为负,返回
           GOTO     NEG_A           ;ACCa为负,取补
           GOTO     MAIN
;***********************************************************
           END                      ;程序结束
;**********************************************************

⌨️ 快捷键说明

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