Проектирование электронного кодового замка с фиксированным кодом «00002» на микроконтроллере серии PIC

Автор работы: Пользователь скрыл имя, 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. Листинг программы …………………………………………………………..
Список использованной литературы....……………………………………..…….

Файлы: 1 файл

kursovaya_rabota_po_mikroprotsessoram.docx

— 504.11 Кб (Скачать файл)

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

                                        ; isr code can go here or be located

                          ; 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           

 

 

 

 

 

 

 

 

 

 


Информация о работе Проектирование электронного кодового замка с фиксированным кодом «00002» на микроконтроллере серии PIC