Кодовый замок на pic

Автор работы: Пользователь скрыл имя, 13 Апреля 2014 в 23:40, курсовая работа

Краткое описание

Кодовые замки являются эффективным средством предотвращения доступа посторонних лиц к охраняемым помещениям. К их достоинствам можно отнести простоту в обращении, надёжность, возможность обеспечить высокую степень защиты, относительную лёгкость смены кода (по сравнению со сменой обычного механического замка). Также немаловажными являются отсутствие необходимости изготовления ключей при предоставлении доступа большому количеству людей и невозможность физической потери ключа. Недостатком таких систем можно назвать возможность для злоумышленника подсмотреть код или подобрать его.

Содержание

Введение………………………………………………………...…………….. 2
Разработка структурной схемы…………………………….……..……… 3
Принцип действия замка………………………………….….………. 4
Разработка принципиальной схемы………………...….……..…………. 6
Выбор элементов схемы…………………………………..………….. 7
Обоснование выбора микроконтроллера…………..……....………... 9
Разработка алгоритма управляющей программы.…………………….. 12
Разработка управляющей программы………………………………….. 13
Заключение………………………………………………………………….. 28
Список использованной литературы…………………………………….… 29
Приложение 1……...………………………………………………………… 30
Приложение 2…………………………………………………………...…… 31
Приложение 3………………………………………………………………… 32

Вложенные файлы: 1 файл

Кодовый замок.docx

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

В режиме Power Down сохраняется содержимое регистров, но приостанавливается работа внутреннего генератора и отключаются все остальные функции микросхемы. Выход из режима возможен по внешнему прерыванию или после системного сброса. Такое решение позволяет совмещать быстрый старт с низким энергопотреблением.

Микросхема изготовлена с использованием уникальной высокоточной технологии фирмы Atmel. Внутренняя Flash – память программ может быть перепрограммирована при помощи ISP – интерфейса без извлечения микроконтроллера из платы. Объединение 8 – разрядного RISC – процессора внутрисистемной перепрограммируемой Flash – памятью на одном кристалле делают микросхему ATtiny2313 мощным средством, которое обеспечивает очень гибкие и недорогие решения многих прикладных задач управления.

 

 

 

 

 

 

  1. Разработка алгоритма управляющей программы

Рисунок 3.1 – Алгоритм управляющей программы

 

  1. Разработка управляющей программы

;------------------------- Псевдокоманды  управления

 

.include "tn2313def.inc" ; Присоединение файла описаний

.list     ; Включение листинга

.def drebL = R1   ; Буфер антидребезга младший байт

.def drebH = R2   ; Буфер антидребезга старший байт

.def temp1 = R3

.def temp = R16   ; Вспомогательный регистр

.def data = R17   ; Регистр передачи данных

.def flz = R18   ; Фаза работы замка

.def count = R19  ; Регистр передачи данных

.def addre = R20  ; Текущий адрес в EEPROM

.def prewcode = R21  ; Временный буфер кода

.def Key =  R22   ; Код клавиши

.def loop = R23   ; Регистр счетчика

.def fnota = R24  ; Частота текущей ноты

.def dnota = R25  ; Длительность текущей ноты

.DEF LastKey=r9

.DEF DelayVar=r7

;------------------------- Определение  констант

 

.equ bsize = 30   ; Размер буффера для хранения кода

.equ zad = 3000  ; Порог чувствительности

.equ kandr = 20   ; Константа антидребезга

 

;------------------------- Резервирование  ячеек памяти (SRAM)

.dseg   ; Выбираем сегмент ОЗУ

.org 0x60  ; Устанавливаем текущий адрес сегмента

bufr:  .byte bsize  ; Буфер для приема кода

melod: .byte 1  ; Номер текущей мелодии

 

;------------------------- Резервирование  ячеек памяти  (EEPROM)

 

.eseg   ; Выбираем сегмент ОЗУ

.org 0x08  ; Устанавливаем текущий адрес сегмента

klen:  .byte 1 ; Резервирование ячейки для хранения длины кода

bufe:  .byte bsize  ; Буфер для хранения кода

 

;------------------------- Начало программного  кода

 

.cseg   ; Выбор сегмента программного кода

.org 0  ; Устанеовка текущего адреса на ноль

start: rjmp init  ; Переход на начало программы

reti   ; Внешнее прерывание 0

reti   ; Внешнее прерывание 1

reti   ; Прерывание по захвату таймера T1

rjmp propr  ; Прерывание по совпадению T1

rjmp propr  ; Прерывание по переполнению T1

reti   ; Прерывание по переполнению T0

reti   ; Прерывание UART прием завершен

reti   ; Прерывание UART регистр данных пуст

reti   ; Прерывание UART передача завершена

reti   ; Прерывание по компаратору

reti   ; Прерывание по изменению на любом контакте

reti   ; Таймер/счетчик 1. Совпадение B

reti   ; Таймер/счетчик 0. Совпадение B

reti   ; Таймер/счетчик 0. Совпадение A

reti   ; USI Стартовая готовность

reti   ; USI Переполнение

reti   ; EEPROM Готовность

reti   ; Переполнение охранного таймера

 

 

;******************************************************

;*                Модуль инициализации                *

;******************************************************

init:

;-------------------------- Инициализация  стека

 

ldi  temp, RAMEND ; Выбор адреса вершины стека

out  SPL, temp  ; Запись его в регистр стека

 

;-------------------------- Инициализация  портов В/В

 

ldi  temp,0x18  ; Инициализация порта PB

out  DDRB,temp

ldi  temp,0xE7

out  PORTB,temp

ldi  temp, 0x0F  ; Инициализация порта PD

out  DDRD, temp

ldi  temp, 0x7F  

out  PORTD, temp

 

;------------------------ Инициализация (выключение) компаратора

ldi  temp, 0x80

out  ACSR, temp

 

;--------------------------- Номер мелодии

ldi  temp,0

sts  melod,temp

 

;******************************************************

;*              Начало основной программы             *

;******************************************************

 

main:

;--------------------------- Инициализация  таймера

 

ldi  temp,high(zad) ; Записываем коэффициент задержки

out  OCR1AH,temp

ldi  temp,low(zad)

out  OCR1AL,temp

ldi  temp,0x03  ; Режим работы таймера

out  TCCR1B,temp

m0:  rcall incod    ; Ввод и проверка кода клавиш

brne m0

m1:  in  temp,PINB  ; Проверка кнопки звонка

sbrs temp,6

rjmp kk1  ; Если нажата, переходим к звуковой части

m2:  ldi  ZH,high(bufr) ; Установка указателя

ldi  ZL,low(bufr) ; на начало буфера

clr  count   ; Сброс счетчика байт

 

;---------------------- Цикл ввода  кода

 

m3:  cli     ; Запретить все прерывания

ldi  data,1  ; Вызываем задержку первого типа

rcall wait    ; К подпрограмме задержки

m5:  rcall incod    ; Ввод и проверка кода кнопок

st  Z+,Key  ; Записываем его в буфер

inc  count   ; Увеличение счетчика байтов

cpi  count,bsize ; Проверяем не конец ли буфера

brsh m7    ; Если конец, завершаем ввод кода

mov  prewcode,Key ; Записываем код как старый

ldi  data,2  ; Вызываем задержку второго типа

(подготовка к задержке)

rcall wait

m6:  rcall incod    ; Ввод и проверка кода кнопок

cp  Key,prewcode

brne m3   ; Если изменилось, записываем в буфер

cpi  flz,1  ; Проверка окончания фазы ввода кода

brne  m6

m7:  sbic PINB,7  ; Проверка состояния тумблера

rjmp m9   ; Если тумблер в режиме"работы", то на проверку кода

ldi  addre,0x08 ; Адрес начала хранения кода

rcall eerd   ; Чтение значения ячейки из EEPROM

cpi  data,0xFF ; Сравнение со значением FF(пусто)

breq eewrite  ; Если равны, то пропускаем проверку и переходим к записи

 

; ----------------------------- Процедура  проверки кода

m9:

ldi  addre,klen  ; Адрес хранения длины кода

rcall eerd    ; Чтение длины кода из EEPROM

cp  count,data  ; Сравнение с новым значением

brne m13    ; Если не равны, к началу

ldi  addre,bufe  ; В YL начало буфера в EEPROM

ldi  ZH,high(bufr) ; В регистровую пару Z записываем

ldi  ZL,low(bufr) ; адрес начала буфера в ОЗУ

m10:  rcall eerd   ; Читаем байт из EEPROM и

ld  temp,Z+ ; Читаем байт из ОЗУ и

cp  data,temp ; Сравниваем байты разных кодов

brne  m13   ; Если не равны, переходим к началу

dec  count  ; Уменьшаем содержимое счетчика байтов

brne m10

rjmp    m11

; ----------------------------- Режим записи  кода

eewrite:

mov  data,count   ; Помещаем длину кода в data

ldi  addre,klen  ; Адрес хранения длины кода

rcall eewr    ; Записываем в длину кода EEPROM

ldi  addre,bufe  ; В регистр адреса начало буфера

ldi  ZH,high(bufr) ; В регистровую пару Z записываем

ldi  ZL,low(bufr) ; адрес начала буфера в ОЗУ

m8:  ld  data, Z+ ; Читаем очередной байт из ОЗУ

rcall eewr   ; Запись байта в EEPROM

dec  count  ; Декримент счетчика байтов

brne m8

; ----------------------------- Открывание  замка

m11:  

sbi  PORTB,4  ; Команда "Открыть замок"

ldi  data,3  ; Вызываем задержку третьего типа

rcall wait

cbi  PORTB,4  ; Команда "Закрыть замок"

m13:  rjmp main

 

;******************************************************

;*              Вспомогательные процедуры             *

;******************************************************

; Проверка прием данных  от клавиатуры.

incod:

clr r31

clt              ; Сброс признака что была нажата клавиша.

ldi r31,$0E   ; Младьшая тетрада-запрос в порт, старшая

rcall GetKeyAnswer ; смещение ответа.

brne KeyPressed

ldi r31,$3D

rcall GetKeyAnswer

brne KeyPressed

ldi r31,$6B

rcall GetKeyAnswer

brne KeyPressed

ldi r31,$97

rcall GetKeyAnswer

brne KeyPressed

ret

KeyPressed:

set

swap r31

andi r31,$0F

swap Key

andi Key,$07

CCFind: inc r31 ; Поиск какой конкретно бит установлен.

lsr Key

brcc CCFind

breq NoMul

clt ; Если нажато несколько клавиш то не нажата ни одна.

NoMul: mov Key,r31

ret

; Сканирование клавиатуры: установка  на выходных линиях заданого кода и прием

; ответа вызыватеся из функции GetKey.

GetKeyAnswer:

mov Key,r31

andi Key,$0F

out PORTD,Key

clr DelayVar

Delay1: dec DelayVar

brne Delay1

in Key,PIND

com Key

andi Key,$70 ; Если что то было найдено флаг Z нулевой.

Ret

 

; ------------------------------ Подпрограмма  задержки

wait:

cpi  data,1  ; Проверяем код задержки

brne w1

ldi  temp,0x40  ; Разрешаем прерывание по совпадению

rjmp w2

w1:  ldi  temp,0x80  ; Разрешаем прерывания по переполнению

w2:  out  TIMSK,temp  ; Записываем маску

clr  temp    ; Обнуляем таймер

out  TCNT1H,temp

out  TCNT1L,temp

ldi  flz,0   ; Сбрасываем флаг задержки

sei     ; Разрешаем прерывания

cpi  data,2  ; Если это задержка 2-го типа

breq w4    ; Завершаем подпрограмму

w3:  cpi  flz,1   ; Ожидание окончания задержки

brne  w3

w4:  ret

 

; ------------------------------ Запись  байта в ячейку EEPROM

eewr:

sbic  EECR,EEWE   ; Проверяем готовность EEPROM

rjmp eewr    ; Если не готов ждем

out  EEAR,addre  ; Записываем адрес в регистр адреса

out  EEDR,data  ; Записываем данные в регистр данных

sbi  EECR,EEMWE ; Устанавливаем бит разрешения записи

 

sbi  EECR,EEWE  ; Устанавливаем бит записи

inc  addre   ; Увеличиваем адрес в EEPROM

ret

 

; ------------------------------ Чтение  байта из ячейки EEPROM

eerd: 

sbic EECR,EEWE   ; Проверяем готовность EEPROM

rjmp eerd    ; Если не готов ждем

out  EEAR,addre  ; Записываем адрес в регистр адреса

sbi  EECR,EERE  ; Устанавливаем бит инициализации чтения

in  data, EEDR  ; Помещаем прочитанный байт в temp

inc  addre   ; Увеличиваем адрес в EEPROM

ret

 

;******************************************************

;*           Процедура обработки прерываний           *

;******************************************************

 

propr: ldi  flz,1   ; Установка флага задержки

reti     ; Завершаем обработку прерывания

 

;******************************************************

;*                  Мелодичный звонок                 *

;******************************************************

kk1:

 

;--------------------------- Инициализация  таймера T1

 

ldi  temp, 0x09   ; Включаем режим CTC

out  TCCR1B, temp

km1:  ldi  temp, 0x00   ; Выключаем звук

out  TCCR1A, temp

 

 

;-------------------------- Вычисление  номера нажатой кнопки

 

lds  count,melod ; Читаем код текущей мелодии

inc  count   ; Увеличение номера мелодии на 1

cpi  count,4  ; Проверка не последняя ли мелодия

brne km2    ; Если не последняя, переход

clr  count   ; Обнуление счетчика

km2:  sts  melod,count ; Помещаем номер в ячейку памяти

 

;-------------------------- Выбор мелодии

km3:

mov  YL, count  ; Вычисляем адрес, где

ldi  ZL, low(tabm*2) ; хранится начало мелодии

ldi  ZH, high(tabm*2)

rcall addw  ; К подпрограмме 16-разрядного сложения

lpm  XL, Z+  ; Извлекаем адреса из таблицы

lpm  XH, Z   ; и помещаем в X

 

;--------------------------- Воспроизведение  мелодии

 

km4:  mov  ZH, XH  ; Записываем в Z начало мелодии

mov  ZL, XL

km5:  in  temp, PINB  ; Читаем содержимое порт B  

sbrc temp, 6   ; Проверяем нажата ли еще кнопка звонка

rjmp km6    ; Если равно (кнопки отпущены) в начало

lpm  temp, Z  ; Извлекаем код ноты

cpi  temp, 0xFF  ; Проверяем не конец ли мелодии

breq km4    ; Если конец, начинаем мелодию сначала

andi temp, 0x1F   ; Отделяем от кода частоту

mov  fnota, temp ; Записываем в регистр частоту ноты

lpm  temp, Z+  ; Еще раз берем код ноты

rol  temp   ; Сдвигаем так, что бы три старших

rol  temp   ; разряда стали младшими

rol  temp

rol  temp

andi temp, 0x07  ; Извлекаем код длительности задержки

mov  dnota, temp; Помещаеем ее в ячейку длительности

rcall nota   ; К подпрограмме воспроизведения ноты

rjmp km5   ; В начало цикла (следующая нота)

km6:  ldi  temp, 0x00  ; Выключаем звук

out  TCCR1A, temp

rjmp main

 

;******************************************************

;*          Вспомогательные подпрограммы              *

;******************************************************

; ---------------------- Подпрограмма 16-ти разрядного сложения

 

addw:  push YH  

lsl  YL  ; Умножение первого слагаемого на 2

ldi  YH, 0  ; Второй байт первого слагаемого = 0

add  ZL, YL ; Складываем два слагаемых

adc  ZH, YH

pop  YH

ret

;----------------------- Подпрограмма  исполнения одной ноты

nota:  push ZH

push ZL

push YL

push temp

cpi  fnota, 0x00 ; Проверка не пауза ли

breq nt1  ; Если пауза, переходим сразу к задержке

mov  YL, fnota  ; Вычисляем адрес, где хранится

ldi  ZL, low(tabkd*2) ; коэффициент деления для текущей ноты

ldi  ZH, high(tabkd*2)

rcall addw  ; К подпрограмме 16-разрядного сложения

lpm  temp, Z+ ; Извлекаем мл. разр. КД для текущей ноты

lpm  temp1, Z ; Извлекаем ст. разр. КД для текущей ноты

out  OCR1AH, temp1 ; Записать в старш. часть регистра совпадения

out  OCR1AL, temp ; Записать в младш. часть регистра совпадения

ldi  temp, 0x40  ; Включить звук

out  TCCR1A, temp

nt1:  rcall wait1    ; Задержка

ldi  temp, 0x00  ; Выключить звук

out  TCCR1A, temp

ldi  dnota,0  ; Сбрасываем задержку

rcall wait1    ; Пауза между нотами

pop  temp

pop  YL

pop  ZL

pop  ZH

ret

;----------------------- Подпрограмма задержки

wait1: push ZH

push ZL

push YH

push YL

mov  YL, dnota  ; Вычисляем адрес, где хранитсяldi  ZL, low(tabz*2) ; нужный коэффициент задержкиl

di  ZH, high(tabz*2)

rcall addw     ; К подпрограмме 16-разрядного сложения

lpm  YL, Z+ ; Читаем первый байт коэффициента задержки

lpm  YH, Z   ; Читаем второй байт коэффициента задержки

clr  ZL   ; Обнуляем регистровую пару Z

clr  ZH   ; Цикл задержки

ww1:  ldi  loop,255  ; Пустой внутренний цикл

ww2:  dec  loop

brne  ww2

adiw R30, 1  ; Увеличиваем регистр Z на единицу

cp  YL, ZL ; Проверка младшего разряда

brne ww1

cp  YH, ZH ; Проверка старшего разряда

brne ww1

pop  YL  ; Завершение подпрограммы

pop  YH

pop  ZL

pop  ZH

ret

 

;******************************************************

;*                Таблица задержек                    *

;******************************************************

 

tabz:    .dw      128,256,512,1024,2048,4096,8192

 

;******************************************************

;*          Таблица коэффициентов деления             *

;******************************************************

tabkd: .dw  0

.dw  4748,4480,4228,3992,3768,3556,3356,3168,2990,2822,2664,2514

Информация о работе Кодовый замок на pic