📄 16f72.asm
字号:
《电动自行车控制器》源程序;
list p=pic16f72
include p16f72.inc
count equ 20h ;定义一个计数变量寄存器
n1 equ 21h
n2 equ 22h
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口数据寄存器
ra5 equ 05h ;定义C口BIT6位
ra2 equ 0h
rb2 equ 2h
ra0 equ 0h
rc0 equ 0h
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
movwf trisb
movwf temp
movlw 0x7b
movwf trisc
movlw 0xff
movwf trisa
banksel portc
bsf portc,7
movlw 0x00
movwf portb
;初始化A/D转换
banksel adcon1 ;转换结果右对齐、设4个A/D通道、选择VDD和VSS做参考源
movlw 0x04
movwf adcon1
;初始化PWM模块
banksel pr2
movlw 06fh ;设定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
movlw 7h ;设定TMR2;预分频比1∶1,后分频比1∶1,暂不启动
movwf t2con ;开启TMR2
fangfei
;防飞保护
movlw 59h ;选中AN3
movwf adcon0
call adc
bcf status,0h
sublw 30h
btfss status,0h
goto fangfei
btfss portc,rc0
goto fangfei
bsf portb,rb2
pwm
;刹车检测
btfss porta,ra5
call stop
call edis
btfsc status,0h
goto pwm
call edis1
btfsc temp,0
goto pwm
btfss portc,rc0
call over
bsf portb,rb2
t2over1
movlw 59h ;选中AN3
movwf adcon0
call adc
bcf status,0h
sublw 30h
btfsc status,0h
goto baohu2
movf adres,w
movwf count
movlw 2fh
subwf count,0
movwf ccpr1l ;刷新脉宽
goto pwm
;刹车子程序
stop movlw 0x00
movwf ccpr1l
loop btfss porta,ra5
goto loop
return
baohu2 movlw 0x00
movwf ccpr1l
loop2 btfss portc,rc0
goto loop3
return
loop3 btfsc portc,rc0
return
call delay1.7ms
btfsc portc,rc0
return
btfsc portc,rc0
return
bcf portb,rb2
btfss portc,rc0
goto loop3
bsf portb,rb2
return
;过载检测子程序
over movlw 59h ;选中AN3
movwf adcon0
call adc
bcf status,0h
sublw 80h ;电压值调整
btfsc status,0H ;是否过载
goto baohu
return
baohu btfsc portc,rc0
return
btfsc portc,rc0
return
call delay1.7ms
btfsc portc,rc0
return
btfsc portc,rc0
return
movlw 0x00
movwf ccpr1l
bcf portb,rb2
loop1 btfss portc,rc0
goto loop1
return
;电量检测子程序
edis movlw 49h ;选择时钟源为f/8允许ADC工作、选中AN3(电量)
movwf adcon0
call adc
bcf status,0h
sublw 99h ;极限电压3.16V=9eh 3.3V=0a5h
btfss status,0h
return
movlw 0h
movwf ccpr1l
bsf temp,0
return
edis1 movlw 49h ;选择时钟源为f/8允许ADC工作、选中AN3(电量)
movwf adcon0
call adc
bcf status,0h
sublw 0a5h ;极限电压3.16V=9eh 3.3V=0a5h
btfsc status,0h
goto edis11
bcf temp,0
return
edis11 movlw 0h
btfsc temp,0
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
delay1.7ms
movlw 0x11
movwf n1
loop11 movlw 0x19
movwf n2
loop22 decfsz n2,1
goto loop22
decfsz n1,1
goto loop11
return
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -