?? 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 + -