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

📄 ddzxc.asm

📁 电动自行车控制器程序利用PIC16F72
💻 ASM
字号:
《电动自行车控制器》源程序;
           list    p=pic16f72
           include p16f72.inc
           count   equ    20h       ;定义一个计数变量寄存器
           pcl     equ    02h       ;定义程序计数器低字节寄存器地址
           f       equ    01h       ;定义目标寄存器为RAM的指示符
           pir1    equ    0ch       ;定义第一中断标准位 
           tmr2if  equ    1h        ;定义中断标志TMR2中断
           adif    equ    6h        ;定义中断标志位位地址
           go      equ    2h        ;定义ADC控制寄存器位地址   
           status  equ    03h       ;定义状态寄存器   
           rp0     equ    05h       ;定义状态寄存器中的页选位RP0
           trisa   equ    85h
           trisb   equ    86h       ;定义B口方向寄存器
           trisc   equ    87h
           porta   equ    05h
           portb   equ    06h       ;定义B口数据寄存器
           portc   equ    07h       ;定义C口数据寄存器
           rc6     equ    06h       ;定义C口BIT6位
           tmr2on  equ    02h       ;定义TMR2开启位的位
           adcon0  equ    1fh       ;定义ADC控制寄存器0
           adcon1  equ    9fh       ;定义ADC控制寄存器1
           ccp1con equ    17h       ;定义CCP1控制寄存器
           t2con   equ    12h       ;定义TMR2控制寄存器
           pr2     equ    92h       ;定义TMR2周期寄存器
           ccpr1l  equ    15h       ;定义CCP1寄存器低字节寄存器
           adres   equ    1eh
           temp    equ    71h       ;定义缓存存储器地址
           t1      equ    72h
           org     000h             ;定义程序存放的起始地址
           nop                      ;放置一个ICE必须的空操作指令
start
;初始化I/O口
           bsf     status,rp0       ;设文件寄存器为体1
           movlw   0x00             ;设端口B为输出
           movwf   trisb
           movlw   0xf0             ;设置C口低4位为输出,高4位为输入
           movwf   trisc
;初始化A/D转换
           movlw   02h              ;转换结果右对齐、设6个A/D通道、选择VDD和VSS做参考源
           movwf   adcon1          
;初始化PWM模块
           banksel pr2
           movlw   0ffh             ;设定PWM的频率(频率为3.90625K,分频比为1∶1)
           movwf   pr2
           bcf     status,rp0       ;设文件寄存器为体0
           clrf    ccpr1l
           banksel ccp1con
           movlw   0ch              ;设定CPP1模块为PWM输出、脉宽低2位固定为00
           movwf   ccp1con
           banksel t2con
           clrf    t2con            ;设定TMR2;预分频比1∶1,后分频比1∶1,暂不启动
           bsf     t2con,tmr2on     ;开启TMR2
brake 
;刹车检测
           btfss   portc,rc6
           call    stop 
;电量检测 
           call    edis
;过载检测
           call    over
;检测助力信号   
           movlw   61h
           movwf   adcon0
           call    adc
           movwf   f
           movlw   61h
           movwf   adcon0
           call    adc
           xorwf   f,1h
           btfsc   status,2h
           goto    pwm
           movlw   40h
           movwf   ccpr1l
           goto    brake     
pwm 
;刹车检测
           btfss   portc,rc6
           call    stop 
;电量检测 
           call    edis
;过载检测
           call    over 
t2over1   
           movlw   59h              ;选中AN3
           movwf   adcon0
           call    adc
           bcf     status,0h
           sublw   23h
           btfsc   status,0h
           goto    brake
           movf    adres,w
           movwf   ccpr1l           ;刷新脉宽
           goto    t2over1
;刹车子程序
stop       movlw   0x00
           movwf   ccpr1l
loop       btfss   portc,rc6
           goto    loop
           return                
;过载检测子程序
over       movlw   49h              ;选择时钟源为f/8允许ADC工作、选中AN3(过载)
           movwf   adcon0
           call    adc
           movwf   f
           movlw   060h             ;2V电压数字量送W
           bcf     status,0h
           subwf   f,01h            ;电压值调整
           btfss   status,0H        ;是否过载 
           return  
           movlw   0h
           movwf   ccpr1l
           return
  
;电量检测子程序
edis       movlw   41h              ;选择时钟源为f/8允许ADC工作、选中AN0(电量)
           movwf   adcon0
           call    adc
           movwf   temp
           movwf   f
           movlw   0b4h             ;3.6V电压数字量送W
           bcf     status,0h
           subwf   f,0h             ;电压值调整
           btfss   status,0H
           goto    x1
           movlw   07h
           call    conver
           return
x1         movf    temp,1
           movlw   0a5h             ;3.3V电压数字量送W
           bcf     status,0h
           subwf   f,1h             ;电压值调整
           btfss   status,0H        
           goto    start
           movlw   0eh
           andwf   f,1h
           bcf     status,0h
           rrf     f,0h             ;右移一位
           xorlw   0h
           btfss   status,2h
           bsf     portc,03h        ;点亮黄灯(需充电)
           call    conver           ;调显示查表子程序
           movwf   portb            ;送B口显示
           movf    temp,0h
           sublw   9eh              ;极限电压3.16V
           btfss   status,2h
           return  
           movlw   0h
           movwf   ccpr1l
           return
;A/D转换子程序
adc        call    delay20
           bsf     adcon0,go        ;启动A/D转换
wait       btfsc   adcon0,go        ;转换是否完毕
           goto    wait
           movf    adres,w          ;转换完毕,把A/D结果读入W
           return
;延时子程序
delay20				                ; 2 Tcy for call
	       movlw	0x05		    ; 1 Tcy
	       movwf	count		    ; \
D20Loop				                ;  \ 3 * 5
	       decfsz	count,F		    ;  / or 15 Tcy
	       goto	    D20Loop		    ; /
           return			        ; 2 Tcy for return
;电量指示显示值表
conver     addwf   pcl,1
           retlw   B'10000000'
           retlw   B'11000000'
           retlw   B'11100000'
           retlw   B'11110000'
           retlw   B'11111000'
           retlw   B'11111100'
           retlw   B'11111110'
           retlw   B'11111111'
end

⌨️ 快捷键说明

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