📄 ddzxc.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 + -