Автор работы: Пользователь скрыл имя, 09 Апреля 2014 в 14:52, курсовая работа
В номенклатуре Microchip Technology Inc. представлен широкий спектр 8-и, 16-и и 32-битных микроконтроллеров и цифровых сигнальных контроллеров под маркой PIC. Отличительной особенностью PIC-контроллеров является хорошая преемственность различных семейств. Это и программная совместимость (единая бесплатная среда разработки MPLAB IDE), и совместимость по выводам, по периферии, по напряжениям питания, по средствам разработки, по библиотекам и стекам наиболее популярных коммуникационных протоколов.
1. Общие сведенья о семействе PIC микроконтроллеров фирмы Microchip…………………….………………………………………………….5
1.1.Краткая характеристика микроконтроллеров семейства PIC16CXXX...9
1.1.1 Микроконтроллеры семейства PIC16CXXX……………………….......9
1.1.2 Микроконтроллеры подгруппы PIC16F8X……...……………………11
1.2. Программное обеспечение MPLAB ……………………………………15
2. Разработка принципиальной электрической схемы……………………..17
3. Разработка и отладка программного обеспечения………………………17
3.1. Листинг программы …………………………………………………………..
Список использованной литературы....……………………………………..…….
w_temp EQU 0x0C ; variable used for context saving
status_temp EQU 0x0D ; variable used for context saving
cblock 0x0E
cnt0, cnt1, cnt2 ; счетчики для программируемой задержки
key_tmp,scan ; для хранения кода нажатой клавиши
cnt_body0,cnt_body1 ; счетчики числа проходов
cnt_adc ; счетчик измерения АЦП
flags ; внутренние флаги (см ниже)
cod0,cod1,cod2 ; вводимый код
endc
razr equ 0 ; флаг разряда батареи (1-разряжена) flags
sost equ 1 ; состояние замка (1-закрыт)
; ******************************
; *********** РАСПРЕДЕЛЕНИЕ ПАМЯТИ ЕЕ
******************************
; ******************************
addr_cod equ 0 ; начало кода открывания
addr_razr equ 0x10 ; граница напряжения разряда
; ******************************
; ********** РАСПРЕДЕЛЕНИЕ ПОРТОВ ******************************
; ******************************
psnd equ PORTA ; выход светодиода
snd equ 4
prele equ PORTA ; управления реле
rele0 equ 0
rele1 equ 1
padc equ PORTA ; псевдоАЦП
adc equ 2
tris_adc equ TRISA
pkey equ PORTB ; порт клавиатуры
clop equ 7 ; кнопка на внутренней стороне ОТКР/ЗАКР
line0 equ 0 ; линия сканирования 0
line1 equ 1 ; линия сканирования 1
line2 equ 2 ; линия сканирования 2
line3 equ 3 ; линия сканирования 3
otkl0 equ 4 ; линия отклика 0
otkl1 equ 5 ; линия отклика 1
otkl2 equ 6 ; линия отклика 2
; ******************************
; ********** МАКРОСЫ ******************************
; ******************************
snd_on macro
banksel psnd
bsf psnd,snd
nop
endm
snd_off macro
banksel psnd
bcf psnd,snd
nop
endm
rele_off macro
banksel prele
bcf prele,rele0
nop
nop
bcf prele,rele1
nop
endm
rele_open macro
banksel prele
bsf prele,rele0
nop
nop
bcf prele,rele1
nop
endm
rele_close macro
banksel prele
bcf prele,rele0
nop
nop
bsf prele,rele1
nop
endm
adc_off macro ; выключим псевдоАЦП
banksel tris_adc
bcf tris_adc,adc ; как выход
banksel padc
nop
bcf padc,adc ; разряжаем конденсатор
nop
endm
adc_on macro ; инициализируем измерение
banksel tris_adc
bsf tris_adc,adc ; как вход
banksel padc
endm
;*****************************
;***************** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЙ ******************
;*****************************
ORG 0x000 ; processor reset vector
goto main ; go to beginning of program
ORG 0x004 ; interrupt vector location
movwf w_temp ; save off current W register
; contents
movf STATUS,w ; move status register into W
; register
movwf status_temp ; save off contents of STATUS
; register
; as a
;call subroutine elsewhere
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register
; contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register
; contents
retfie ; return from interrupt
;*****************************
;************** МЕСТО РАСПОЛОЖЕНИЯ ПОДПРОГРАММ ************************
;*****************************
; П/П ОПРОСА КЛАВИАТУРЫ
; Выходные: WREG и key_tmp - код нажатой кнопки или 0xFF, если не нажата
; при нажатии вырабатывается
короткий звуковой сигнал
; нажатия кнопки
keyboard
clrf key_tmp
clrf scan
movlw b'00001110'
movwf pkey
btfss pkey,otkl0
goto kkk1
btfss pkey,otkl1
goto kkk2
btfss pkey,otkl2
goto kkk3
movlw b'00001101'
btfss pkey,otkl0
goto kkk4
btfss pkey,otkl1
goto kkk5
btfss pkey,otkl2
goto kkk6
movlw b'00001011'
btfss pkey,otkl0
goto kkk7
btfss pkey,otkl1
goto kkk8
btfss pkey,otkl2
goto kkk9
movlw b'00000111'
btfss pkey,otkl1
goto kkk10
btfss pkey,otkl2
goto kkk11
goto keyboard_no
kkk11 incf key_tmp,f
kkk9 incf key_tmp,f
kkk8 incf key_tmp,f
kkk7 incf key_tmp,f
kkk6 incf key_tmp,f
kkk5 incf key_tmp,f
kkk4 incf key_tmp,f
kkk3 incf key_tmp,f
kkk2 incf key_tmp,f
kkk1 incf key_tmp,f
kkk10 goto keyboard_end
keyboard_no
movlw 0x0F
movwf pkey
movlw .10
call delay
movlw 0xFF ; не нажата
movwf key_tmp ; выходим молча
return
; П/П ЧТЕНИЯ ЕЕ
; Входные: EEADR - адрес читаемой ячейки
; Выходные: EEDATA - прочитанные данные
read_ee
banksel EECON1
bsf EECON1,RD
banksel EEDATA
return
; П/П ЗАПИСИ ЕЕ
; Входные: EEADR - адрес записываемой ячейки
; EEDATA - записываемые данные
write_ee
banksel EECON2
bsf EECON1,WREN
; bcf INTCON,GIE ; запрет прерывания
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2
bsf EECON1,WR
write_ee1 btfss EECON1,EEIF ; проверка окончания записи
goto write_ee1
bcf EECON1,WREN
; bsf INTCON,GIE ; разрешить прерывание
banksel EEDATA
return
; П/П ОТКРЫВАНИЯ ЗАМКА
open
movlw .10
call pisk
movlw .8
call pisk
movlw .6
call pisk
rele_open
movlw .40
call delay
rele_off
return
; П/П ЗАКРЫВАНИЯ ЗАМКА
close
movlw .10
call pisk
movlw .15
call delay
movlw .6
call pisk
rele_close
movlw .40
call delay
rele_off
return
;*****************************
;******************* НАЧАЛО ОСНОВНОГО КОДА ПРОГРАММЫ *****************
;*****************************
main
; инициализация порта А
; 1 - вход
PORTA_NAPR EQU B'00001000'
PORTB_NAPR EQU B'11110000'
BANKSEL PORTA
CLRF PORTA
BANKSEL TRISA
MOVLW PORTA_NAPR
MOVWF TRISA
BANKSEL PORTA
CLRF PORTA
; инициализация порта В
CLRF PORTB
BANKSEL TRISB
MOVLW PORTB_NAPR
MOVWF TRISB
BANKSEL PORTB
CLRF PORTB
; общие
CLRWDT
BANKSEL OPTION_REG
MOVLW B'01011111' ; предделитель перед WDT c коэф 1:128
MOVWF OPTION_REG ; подтягивающие резисторы включены
BANKSEL TMR0
clrf TMR0
; начальные установки
clrf cnt_body0
clrf cnt_body1
clrf flags
snd_off
rele_off
adc_off
clrf EEADR
movlw 0xFF
movwf pkey
;*****************************
;*********************** ТЕЛО РАБОЧЕГО ЦИКЛА **************************
;*****************************
body
banksel cnt_body0 ; счетчик количества проходов
incfsz cnt_body0,f ; счетчик двухбайтный
goto body1
incf cnt_body1,f
body1 btfss cnt_body1,5 ; проверка на достижение заданного
goto body3 ; интервала времени (bit3)
clrf cnt_body0
clrf cnt_body1
body2
clrf pkey ; подготовка ко сну
bcf INTCON,RBIF
bcf INTCON,GIE
bsf INTCON,RBIF
sleep
nop
body3 ; проверка флага состояния (1-закрыто)
btfsc flags,sost ; проверка действия при нажатии кнопки
goto body4
call keyboard ; считаем, что замок БЫЛ ОТКРЫТ
movwf key_tmp ; любая кнопка - закрыть!
incfsz key_tmp,f ; проверка нажатия основной клавиатуры
goto body5
btfsc pkey,clop ; проверка нажатия внутренней кнопки
goto body10 ; ничто не нажато
body5 call close ; процедура закрывания
bsf flags,sost
movlw .30
call delay
goto body10
body4 ; считаем, что замок БЫЛ ЗАКРЫТ
btfss pkey,clop ; проверка внутренней кнопки
goto body18
movlw .40
movwf cnt10 ; счетчик времени опроса
body6 call keyboard ; первая цифра кода
addlw 1
btfss STATUS,Z
goto body7
decfsz cnt10,f
goto body6
body8 movlw 1
call pisk ; отказ от дальнейшего ввода
movlw .15
call delay
movlw 6
call pisk ; отказ от дальнейшего ввода
movlw .15
call delay
movlw 1
call pisk ; отказ от дальнейшего ввода
movlw .15
call delay
goto body10
body7 movf key_tmp,w
movwf cod0
movlw .40
movwf cnt10
body9 call keyboard ; вторая цифра
addlw 1
btfss STATUS,Z
goto body11
decfsz cnt10,f
goto body9
goto body8
body11 movf key_tmp,w
movwf cod1
movlw .40
movwf cnt10
body13 call keyboard ; третья цифра
addlw 1
btfss STATUS,Z
goto body12
decfsz cnt10,f
goto body13
goto body8
body12 movf key_tmp,w
movwf cod2
movlw .40
movwf cnt10
body15 call keyboard ; четвертая цифра
addlw 1
btfss STATUS,Z
goto body14
decfsz cnt10,f
goto body15
goto body8
body14 movf key_tmp,w
movwf cod3
movlw .4 ; проверка на код в ЕЕ
movwf cnt10
movlw cod0
movwf FSR
movlw addr_cod
movwf EEADR
body16
call read_ee
movf INDF,w
subwf EEDATA,w
btfss STATUS,Z
goto body17 ; переход к проверке на другой код
incf FSR,f
incf EEADR,f
decfsz cnt10,f
goto body16
body18
movlw .5
call pisk
movlw .5
call pisk
movlw .5
call pisk
call open ; процедура ОТКРЫВАНИЯ
bcf flags,sost
movlw .30
call delay
goto body10
body17 ; проверка на код "ЛИЧНЫЙ"
movlw .1
subwf cod0,w
btfss STATUS,Z
goto body19
movlw .1
subwf cod1,w
btfss STATUS,Z
goto body19
movlw .2
subwf cod2,w
btfss STATUS,Z
goto body19
movlw .2
subwf cod3,w
btfss STATUS,Z
goto body19
goto body18
body19 ; проверка на КОД СМЕНЫ КОДА
movlw .1
subwf cod0,w
btfss STATUS,Z
goto body20
movlw .2
subwf cod1,w
btfss STATUS,Z
goto body20
movlw .3
subwf cod2,w
btfss STATUS,Z
goto body20
movlw .4
subwf cod3,w
btfss STATUS,Z
goto body20
movlw .1 ; процедура СМЕНЫ КОДА
call pisk
movlw .2
call pisk
movlw .3
call pisk
movlw .4
call pisk
movlw .5
call pisk
movlw .6
call pisk
movlw .7
call pisk
movlw .8
call pisk
movlw .9
call pisk
movlw 4 ; ввод нового кода и запись
movwf cnt10
movlw addr_cod
movwf EEADR
body22 call keyboard
incf key_tmp,w
btfsc STATUS,Z
goto body22
movf key_tmp,w
movwf EEDATA
call write_ee
incf EEADR,f
decfsz cnt10,f
goto body22
movlw .10
call pisk
movlw .9
call pisk
movlw .8
call pisk
movlw .7
call pisk
movlw .6
call pisk
movlw .5
call pisk
movlw .4
call pisk
movlw .3
call pisk
goto body10
body20 ; звук НЕПРАВИЛЬНОГО КОДА
movlw .10
call pisk
movlw .9
call delay
movlw .8
call pisk
movlw .7
call delay
movlw .6
call pisk
movlw .10
call pisk
goto body10 ; проверки всяких кодов закончились
body10 ; проверка состояния батарей
clrf cnt10
banksel tris_adc ; переключаем на вход
bsf tris_adc,adc
banksel padc
body23 incf cnt10,f
nop
btfss padc,adc
goto body23
movlw addr_razr ; читаем границу в ЕЕ
movwf EEADR
call read_ee
movf EEDATA,w ; сравниваем
subwf cnt10,w
bsf flags,razr
btfsc STATUS,C
bcf flags,razr
goto body
END