Автор работы: Пользователь скрыл имя, 13 Апреля 2014 в 23:40, курсовая работа
Кодовые замки являются эффективным средством предотвращения доступа посторонних лиц к охраняемым помещениям. К их достоинствам можно отнести простоту в обращении, надёжность, возможность обеспечить высокую степень защиты, относительную лёгкость смены кода (по сравнению со сменой обычного механического замка). Также немаловажными являются отсутствие необходимости изготовления ключей при предоставлении доступа большому количеству людей и невозможность физической потери ключа. Недостатком таких систем можно назвать возможность для злоумышленника подсмотреть код или подобрать его.
Введение………………………………………………………...…………….. 2
Разработка структурной схемы…………………………….……..……… 3
Принцип действия замка………………………………….….………. 4
Разработка принципиальной схемы………………...….……..…………. 6
Выбор элементов схемы…………………………………..………….. 7
Обоснование выбора микроконтроллера…………..……....………... 9
Разработка алгоритма управляющей программы.…………………….. 12
Разработка управляющей программы………………………………….. 13
Заключение………………………………………………………………….. 28
Список использованной литературы…………………………………….… 29
Приложение 1……...………………………………………………………… 30
Приложение 2…………………………………………………………...…… 31
Приложение 3………………………………………………………………… 32
В режиме Power Down сохраняется содержимое регистров, но приостанавливается работа внутреннего генератора и отключаются все остальные функции микросхемы. Выход из режима возможен по внешнему прерыванию или после системного сброса. Такое решение позволяет совмещать быстрый старт с низким энергопотреблением.
Микросхема изготовлена с использованием уникальной высокоточной технологии фирмы Atmel. Внутренняя Flash – память программ может быть перепрограммирована при помощи ISP – интерфейса без извлечения микроконтроллера из платы. Объединение 8 – разрядного RISC – процессора внутрисистемной перепрограммируемой Flash – памятью на одном кристалле делают микросхему ATtiny2313 мощным средством, которое обеспечивает очень гибкие и недорогие решения многих прикладных задач управления.
Рисунок 3.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,
;*****************************
;*
Таблица коэффициентов деления
;*****************************
tabkd: .dw 0
.dw 4748,4480,4228,3992,3768,