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

📄 tm1zd.asm

📁 键盘控制小灯的亮
💻 ASM
字号:
include p16f877a.inc 
 INDF         EQU 0X00
 FSR          EQU 0X04
 XIANSHU      EQU 0X20;限制速度值
 QIANYA       EQU 0X21;欠压值
 A_D_Status   EQU 0X22;速值
 HR           EQU 0X23;模拟霍尔信号值
;20H~27H存放各路模拟值.
;28H存放前一通道值.
;29H存模拟通道数. 
;2AH\2BH单元为速度值.
;38H单元存放临时模拟值 
 TSH           EQU 0X2A ;手柄电压高位寄存器
 TSL           EQU 0X2B ;手柄电压低位寄存器
 DEYH          EQU 0X2B
 DEYL          EQU 0X2C
 ;DEY           EQU 0X2D
W_TEMP         EQU 0X2E
STATUS_TEMP    EQU 0X2F
 ;F0            EQU 0X30 ;低
 ;F1            EQU 0X31 ;中
 ;F2            EQU 0X32 ;高
 FLAG1         EQU 0X33 ;标志寄存器
 ACCALO        EQU 0X34
 ACCAHI        EQU 0X35
 ACCBLO        EQU 0X36
 ACCBHI        EQU 0X37
 ACCCLO        EQU 0X38
 ;ACCCHI        EQU 0X39
 ACCDLO        EQU 0X3A
 ACCDHI        EQU 0X3B
 PRD           EQU 0X3C
 DEYH1         EQU 0X3D
 DEYL1         EQU 0X3E
 TEMP          EQU 0X3F
 SIGN          EQU 0X40
 COUNT         EQU 0X41
 VOLTAGEH      EQU 0X42
 VOLTAGEL      EQU 0X43
 TEMP1         EQU 0X44
 COUNT_VOL     EQU 0X45
;***********标志寄存器位定义以及程序中常数定义**********
 CONSTANT      VOLTAGE=0
 CONSTANT      PWM=1
 CONSTANT      LOWPOWER=2
 CONSTANT      SHUDOWN=3
 CONSTANT      OFF=4
 CONSTANT      FULLPWM=0X05;当PWM输出全高时,输入CCPR1L中的值

 CONSTANT      VOLOFFH=0X02;当电池电压低于24AH时,低压保护2.86V/31.5V
 CONSTANT      VOLOFFL=0X4A;

 CONSTANT      VOLONH=0X00;当电池电压大于003AH时,允许电机重新开机3V/33V
 CONSTANT      VOLONL=0X66;

 CONSTANT      TSONH=0X00 ;刹车后手柄复位值低于03AH,则允许电机重新启动
 CONSTANT      TSONL=0X3A ;37H 或38H
 ORG 0X00
 NOP
 GOTO MAIN

 ;************************
;中断矢量入口程序
;************************
 ORG 0X04
 GOTO Intservice
 ORG 0X30
 ;************************
Initial 

;*******存储体1*******
 banksel TRISA
; CLRF  INTCON          ;禁止所有中断
 BCF   OPTION_REG,6   ; 下降沿触发
 BCF   OPTION_REG,7   ;启用内部弱上拉功能电路 
 MOVLW 0XFB
 movwf TRISC          
 ;BSF   TRISC,1       ;设置RC1为输入口,其他为输出口,其中RC2为PWM输出口
 MOVLW 0XFF
 MOVWF TRISA
 MOVWF TRISB
 MOVLW 0X00
 MOVWF TRISD
 MOVLW 0X07
 MOVWF TRISE
 
                      ;banksel PR2
 movlw 0x4D           ;设定PWM频率初始值16kHZ*******
 movwf PR2
                      ; banksel ADCON1
 movlw B'10000010'    ;设定转换通道,转换值右移RA模拟输入,RE输入
 movwf ADCON1         ;以Vdd和Vss为参考

 BSF PIE1,ADIE
 BCF PIE2,CCP2IE
 
 ;*******以下为存储体0*******
 banksel PORTD
 MOVLW 0X00
 MOVWF PORTD           ;由于D口上电复位的不确定性,必须关闭所有MOS管
 MOVLW 0XFF
 MOVWF PORTB
 
 MOVLW FULLPWM         ;初始化PWM工作寄存器,使PWM占空比为0
 MOVWF CCPR1L          ;输出电压为0
 MOVLW 0x01
 MOVWF T2CON           ;D6-D3后分平频器分频比1:1,D2-D0预分频器分频比1:4
 MOVLW 0x0c
 MOVWF CCP1CON         ;设定PWM模式
 MOVLW 0X0B            ;CCP2工作于特殊事件触发方式,用于采样AD周期寄存器
 MOVWF CCP2CON
 MOVLW 0X91
 MOVWF ADCON0           ;选择AD转换时钟为F/32,AN2通道,并使A/D转换允许
 CLRF  TMR2            ;清除TMR2记数值
 CLRF  TMR1H            ;清除TMR1记数值
 CLRF  TMR1L            
 CLRF  T1CON            ;TMR1预分频为1,工作于定时方式 
 
 MOVLW 0X08
 MOVWF CCPR2H           ;F5FF初始化A/D采样周期寄存器T=512us
 MOVLW 0X00
 MOVWF CCPR2L   
        
 MOVLW 0XDB
 MOVWF INTCON           ;开总中断、外围中断、INT中断及RB口电平变化中断允许
 ;BSF INTCON,4          ;允许外部INT0IE中断
 ;BSF INTCON,3          ;允许外部 RBIE 电平变化中断
 ;BCF INTCON,1          ;清外部INTF中断标志位
 ;BCF INTCON,0          ;清外部RBIF中断标志位
 ;BSF INTCON,PEIE       ;允许第二级的中断请求
 ;BSF INTCON,GIE        ;将中断的总开关打开,使中断可以产生
 ;banksel PORTD         ;初始化子程序
 CLRF  FLAG1
 CLRF  COUNT_VOL
 BSF T1CON,TMR1ON       ;开CCP2,对手柄进行等间隔采样
 BSF T2CON,TMR2ON       ;开CCP1(使用PWM调速功能)
 return
;************************
;    中断服务程序
;************************
Intservice
 
 MOVWF W_TEMP        ;将W寄存器的内容保存
 SWAPF STATUS,W      ;将STATUS寄存器高低字节的内容交换
 MOVWF STATUS_TEMP   ;存入STATUS_TEMP变量中
 MOVF  PORTD,W
 MOVWF PRD
SERVE1
 BTFSC PIR1,ADIF      ;INT0标志位?
 GOTO  ADZD           ;是
 BTFSC INTCON,1       ;INT0标志位?
 GOTO  INTSERVE1      ;是
 BTFSC INTCON,0       ;RBIF标志位?
 GOTO  RB4ZD          ;RB4中断
SERVE2 
 MOVF  PRD ,W
 MOVWF PORTD
 SWAPF STATUS_TEMP,W
 MOVWF STATUS
 SWAPF W_TEMP,F
 SWAPF W_TEMP,W
 RETFIE
;**********************
;**********************
MAIN
 CALL Initial            ;调用初始话程序
 
MAIN1
 MOVLW 0X00
 MOVWF PORTD
 BTFSS FLAG1,PWM
 GOTO  NEXT1
 CALL  OUT_PWM
 BCF   FLAG1,PWM
NEXT1
 BTFSS FLAG1,LOWPOWER
 GOTO MAIN1
 CALL POWER
 BTFSC FLAG1,OFF
 GOTO  MAIN
 GOTO  MAIN1
POWER
 BCF   FLAG1,OFF
 MOVLW 0X0F
 MOVWF PORTD
 RETURN
OUT_PWM
 MOVLW 0XFF
 MOVWF PORTD
 RETURN

;**********************************
;外部中断INT0服务子程序
;**********************************
INTSERVE1
 BCF  INTCON,1       ;清INT0标志位
INT01
 BTFSC PORTB,0
 GOTO  SERVE1        ;恢复正常为1,表示启动结束,返回主程序
 MOVLW 0XF0          ;若为0,则输出无效控制字
 MOVWF PORTD         ;
 GOTO  INT01         ;测试是否恢复正常值? 
  
;**********************************
;RB4中断
;**********************************
RB4ZD
 banksel PORTD
 BSF PORTD,7   
 BCF INTCON,0         ;RB4IF清除溢出标志    
 GOTO SERVE2          ;测试为干扰,则返回
         
;*********AD采样中断服务程序***************
ADZD
 BTFSC FLAG1,VOLTAGE  ;是电压采样吗?
 GOTO  SET_VOLTAGE    ;是,做相应的处理
SET_TS
 BCF  ADCON0,CHS0
 BSF  ADCON0,CHS1     ;不是,则调速选择2采样通道
 INCF COUNT_VOL       ;电压采样周期寄存器值加1
 BTFSS STATUS,Z
 GOTO  AD4            ;没有呢,采样速度
 BSF   ADCON0,CHS0
 BCF   ADCON0,CHS1    ;到了,选择通道1(电压)
 BSF   FLAG1,VOLTAGE  ;置相应的标志位
AD4
 BCF PIR1,ADIF
 ;BCF PIR1,TMR1IF
 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
 ;BCF  STATUS,C
 RRF  TSH
 RRF  TSL
 RRF  TSH
 RRF  TSL

;************************

 ;banksel CCPR1L
 movf TSL,W
 movwf CCPR1L         ;更新工作周期的命令值

 ;BSF T1CON,TMR1ON     ;开CCP2,对手柄进行等间隔采样

 GOTO SERVE2          ;恢复现场,中断返回 
;*****************************
;
;*****************************
SET_VOLTAGE
 BCF ADCON0,CHS0
 BSF ADCON0,CHS1      ;选择2采样通道(调速)
 BCF PIR1,ADIF
 ;BCF PIR1,TMR1IF
 BCF FLAG1,VOLTAGE
 MOVF ADRESH,0
 MOVWF VOLTAGEH
 BSF STATUS,RP0
 MOVF ADRESL,0
 BCF STATUS,RP0
 MOVWF VOLTAGEL
 BSF FLAG1,LOWPOWER
 GOTO SERVE2          ;恢复现场,中断返回
 END

⌨️ 快捷键说明

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