Добавил:
інстаграм _roman.kob, курсові роботи з тєрєхова в.в. для КІ Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

1

.pdf
Скачиваний:
2
Добавлен:
31.05.2020
Размер:
782.19 Кб
Скачать

Можливий варіант схеми замку наведено на рис. 1.1.кнопки Sl-S10 служать для набору коду. Перемикач S11 призначена для вибору режиму роботи. Якщо контакт перемикача S11 замкнутий, замок переходить в режим «Запис». розімкнуті контакти відповідають режиму «Робота».

Рис. 1.1. Схема кодового замка

2.2. Алгоритм роботи схеми Прискладанніданогоалгоритмунамнеобійтисябезтакогопоняття,як«код

стануклавіатури». Що такекод стану?. Всікнопки клавіатурипідключаютьсядо мікроконтролеру за допомогою портів введення-виведення. Для підключення десяти кнопок (Кнопки «О» - «9») одного порту недостатньо. кілька кнопок доведеться підключити до другого.

Контролер читає вміст цих портів і отримує код, ввідний їх станом. Кожній кнопці клавіатури в цьому коді буде відповідати свій окремий біт. Коли кнопка натиснута, відповідний біт буде дорівнює нулю. Коли відпущена -р одиниці. Томуприрізнихпоєднанняхнатиснутихівідпущенихкнопоккод стану клавіатури матиме різні значення.

У момент включення живлення всі кнопки замку повинні бути відпущені. Якщо це не так, то виникає невизначеність в роботі замку. Тому наш

- 11 -

алгоритм повинен починатися з процедури очікування відпускання всіх кнопок. Як тільки всі кнопки виявляться відпущеними або в разі, якщо вони взагалі не були натиснуті, починається інша процедура очікування. Цього разу програма очікує моменту натискання кнопок. Це як раз той режим роботи, в якому замок буде перебувати більшу частину часу. У момент натискання будьякий з кнопок починається цикл введення ключової комбінації.

Процедура введення ключової комбінації являє собою багатократно повторюваний процес, періодично зчитує код стану клавіатури. Щоразу після черговогозчитуваннякодупрограмаперевіряє,чинезмінивсяцейкод. Яктільки код зміниться, нове його значення записується в чергову колонку ОЗУ. В результаті, поки стан клавіатури не змінюється, програма знаходиться в режимі очікування.

Як тільки стан змінився, відбувається запис нового значення коду стану в пам'ять. Тому ключова комбінація, записана в ОЗУ, буде являти собою перерахування всіх значень коду стану клавіатури, яке він приймав в процесі введення ключової комбінації. Тривалість же утримання кнопок в кожному з станів в пам'ять не записується. Однак це лише приблизний алгоритм процедури введення ключової комбінації. Так би мовити, її кістяк. Насправді алгоритм трохи складніше. Виявившизміна стануклавіатури, програма не відразузаписує новий код в ОЗУ. З метою боротьби з дребезгом контактів, а також для компенсації неточності одночасного натискання кількох кнопок, програма спочатку витримує спеціальну захисну паузу, потім повторно рахує код стану клавіатури і лише після цього записує новий код в ОЗУ.

Тривалість захисноїпаузи обрано рівної48 мс. така пауза особливо корисна в разі, якщо при наборі ключової комбінації ви хочете використовувати одночасне натискання кнопок. Як би ви не намагалися натиснути кнопки одночасно, вам цього не вдасться.

- 12 -

Все одно буде якесь розбіжність в моменті замикання контактів. Причому порядок замикання контактів буде залежати від багатьох факторів і практично є випадковим.

Якщо не вжити спеціальних заходів, то в момент такого натискання програма зафіксує не одне, а кілька послідовних змін коду стану клавіатури. Якщо отримана таким проразом кодова комбінація буде записана в ЕЕРЯОМ, то відкрити такий замок буде практично неможливо. При спробі повторити ті ж натискання, замикання контактів будуть відбуватися в іншому порядку. Програмасприймейогоякзовсім іншийкод. Захиснапаузавирішуєцю проблему. В якому б порядку ні замикалися контакти при одночасному натисканні декількох кнопок, після паузи всі ці процеси закінчаться. Повторне зчитування дасть вже усталений код стану клавіатури. Повторити таку комбінацію не складе труднощів.

Крім захисної паузи, для боротьби з дребезгом застосовується багатократне зчитування коду стану. Тобто насправді кожен раз відбувається не одне, а кілька послідовних операцій з зчитування коду стану. Зчитування відбувається до тих пір, поки кілька разів поспіль буде отримано один і той же код.

Тепер поговоримо про те, як програма виходить з процедури введення ключової комбінації. Як вже говорилося раніше, для виходу з процедури використовується захисний проміжок часу.

Для формування цього проміжку застосовується таймер. Таймер повинен працювати в режиміNormal. Вцьомурежимівін просто рахує тактові імпульси.

Процедура введення кодової комбінації влаштована таким чином, що при кожному натисканні або відпуску будь-який з кнопок таймер скидається в нуль. У проміжку між натисканнями його поки пізнання збільшуються під дією тактового сигналу. Якщо протягом захисного проміжку часу і не натискати жодних одна кнопка, показання таймера збільшаться до контрольногомежі.

- 13 -

Програма постійно перевіряє цю умову. Як тільки свідчення лічильника перевищать контрольний межа, процедура введення кодової комбінації завершується. Величина контрольного проміжку часу дорівнює 1 с.

Подальші дії після виходу з процедури введення кодово комбінації визначаються станом перемикача режимів роботи. Якщо контакти перемикача замкнуті, програма переходить до процедури запису кодової комбінації в EEPROM. Спочатку в EEPROM записується довжина кодової комбінації. А потім байт за байтом і сама комбінація. Якщо контакти перевимикачів режиму роботи розімкнуті, то програма переходить до процедури перевірки коду. Ця процедура спочатку витягує з EEPROM записану раніше довжину кодової комбінації і порівнює її з довжиною тільки що введеної комбінації.

Якщо дві ці величини не рівні, процедура перевірки коду відразу ж завершується з негативним результатом. Якщо довжина обох комбінацій однакова, то програма приступає до побайтного їх порівняно. Для цього вона по черзі витягує з EEPROM раніше записані туди байти і порівнює кожен з них з відповідними байтами в ОЗУ. При першому ж розбіжності процес порівняння також завершується. І завершується негативно.

І тільки в тому випадку, якщо всі байти в ОЗУ і в EEPROM виявляться однаковими, порівняння вважається успішним. У разі успішного порівняння програма переходить до процедури відкриття замку.

Процедура відкриття починається з видачівідкриває сигналуна виконавчий механізм. Потім програма витримує паузу в 2 з і знімає сигнал. Цього часу достатньо для того, щоб відкрити двері. Потім замок переходить в початковий стан.

Електрична принципова схема містить мікроконтролер ATiny2313 D1, тактова частота якого визначається кварцовим резонатором Q1, до якого приєднані фазозсувні конденсатори С1 та С2. До виводів 2,3,6-9, 11-14, 19 приєднана клавіатура вводу коду і підтвердження, до виводу 16 через резистор R1 приєднаний транзистор, за допомогою якого, здійснюється комутація

- 14 -

електромагніту замка. Для захисту переходу колектор-емітер транзистора від зворотної ЕРС, що виникає під час вимкнення транзистора в результаті розмагнічування осердя електромагніту, паралельно катушці електромагніту приєднаний діод, атод якого приєднується до колектора транзистора, а катод - дод додатного виводу джерела живлення. На схемі не відображено живлення мікроконтролера, яке здійснюється від стабілізованого джерела живлення +5V. Живлення електромагніта здійснюється від окремого нестабілізованого джерела живлення +12V.

2.3. Розробка програмного коду Можливий варіант програми кодового замка на мові СІ приведений в

лістингу 1.20. Програма реалізує той же самий алгоритм, що і наведена вище програма на Асемблері. У тексті цієї програми були використані кілька нових для нас елементів мови СІ. Розглянемо їх по порядку.

#define

Директива присвоєння символьного імені будь-якої константи. Це класичний елемент мови СІ, який підтримується будь версією мови. Директива має два параметри. перший параметр - ім'я константи. Другий параметр - її значення. У рядку 2 програми (лістинг 1.20) числовий константі 0x77F присвоюється ім'я klfree. Після цього в будь-якому місці програми, де потрібно використовувати число 0x77F, його можна замінити ім'ям klfree.

Як значення константи може виступати не тільки число, але і будь-яка комбінація чисел і букв. І навіть комбінація, лише тільки з букв. Застосування іменованих констант робить програму більш наочною. Крім того, змінювати значення такої константи стає зручніше. Досить замінити значення константи в одному тільки місці (в рядку опису). І відразу ж нове значення буде враховано по всій програмі.

- 15 -

#pragma

Директива, що задає спеціальні команди для компілятора. В якості параметра в директиві зазначається задається команда. Нижче наведено ряд прикладів використання цієї директиви.

Включення / відключення повідомлень про помилки.

#pragma warn- // Вимикає попереджувальні повідомлення.

#pragma warn + // Включає попереджувальні повідомлення.

Включення / відключення оптимізації результуючого коду.

#pragma opt- // Вимикає оптимізацію.

#pragma opt + // Включає оптимізацію.

Включення / відключення оптимізації щодо мінімального розміру

результуючого коду.

#pragma optsize- // Вимикає оптимізацію за розміром.

#pragma optsize + // Включає оптимізацію за розміром.

І так далі. Повний список всіх команд, що передаються безпосередньо цієї директиви, ви можете знайти в файлі допомоги програми CodeVision в розділі

«Препроцесор» ( «The Preprocessor»).

eeprom

Керуючий слово, яке використовується при описі змінних (масивів), яке вказує транслятора, що дана змінна (Масив) буде розташовуватися в незалежній пам'яті даних (Берн). Наприклад, в рядку 9 програми знаходиться опис змінної к1еn, призначеної для зберігання довжини кодової комбінації, а в рядку 10

- 16 -

описується масив, в якому буде зберігатися сама комбінація. І змінна, і масив розміщуються в ЕЕРROM.

return

Команда повернення значення. Якщо функція мови СІ повинна повертати значення, останньою командою в тілі цієї функції повинна бути команда return. Як параметр цієї команди вказується значення, що повертається.

Прикладом може служити функція incod(), що займає в нашій програмі (лістинг 1.20) рядка 16-26. Функція виробляє визначення коду стану клавіатури з використаням процедури антидребезга. За результатами своєї роботи функція повинна повертати код стану клавіатури »Тому остання команда в тілі функції (рядок 26) - це команда return. В якості параметра ця команда використовує змінну codl, яка і містить сформований код стану.

Крімновихкоманд,втекстіпрограми (лістинг 1.20)використовуєтьсяодин, поки ще не знайомий нам цікавий прийом. подивіться, будь ласка, на рядок 54 програми. У цьому рядку записано вираз, який присвоює елементу масиву bufr значеннязмінноїcodS. Однаквякостіномераелементамасивувикористовується не просто змінна ii, а вираз ii + +. це і є ще одна оригінальна особливість мови СІ.

Мова СІ допускає одночасно використовувати змінну в будь-якому вираженні і змінювати її значення. Так, при обчисленні вираження bufг [ii + +]= codSспочаткуелементумасивузномером iiприсвоюється значенняcods,апотім значення змінної ii збільшується на одиницю. Такий же прийом допускається при використанні змінних в якості параметрів функцій або в складі будь-яких інших виразів. Крім команди збільшення, можна використовувати команду зменшення, а також змінювати порядок обчислень. Ось кілька прикладів таких виразів:

a = MyBuffer [++ ii] ; b = MyFunction (ii--) ; c = 85 + (- -ii) / 2;

- 17 -

У будь-якому випадку, при використанні даного прийому виконуютьсятакі правила:

ii ++ означає: використовувати значення, а потім збільшити його на одиницю.

++ іі означає: збільшити значення на одиницю, а потім використовувати його.

і + і - означає: використовувати значення, а потім зменшити його на одиницю.

--ііозначає:зменшити значення наодиницю, а потім використовувати його.

Природно,замістьзмінноїiiможевикористовуватисябудь-яка іншазмінна.

Опис програми (лістинг 1.20)

Кардинальною відмінністю програми на мові СІ є той факт, що всі шістнадцятирозрядні значення, використовувані в програмі, тепер не потрібно розбивати на окремі байти. Для зберігання кожної такої величини програма використовує або зммінну, або константу відповідного типу.

Наприклад, для зберігання різних варіантів коду стану клавіатури в програмі використовується кілька змінних:

cod0 - рядок 17;

codl - рядок 18;

- 18 -

codS - рядок 37.

Лістинг 1.20

/*******************************************

Project : Зразок 10

Version : 1

Date : 07/=.03.2006.

Author : Belov

Company : Home

Comments :

Кодовий замок

Chip type

: ATtiny2313

Clock frequency

: 4, 000000 MHz

Memory model

: Tiny

Data Stack size

32

********************************************/

1# include <tiny2313.h>

2

#define klfree 0x77F

//Код стану при повністю відпущенихкнопках

3

#define kzad 3000

//Код затримки при скануванні

4

#define kandr 20

//Константа антидребезга

5

#define bsize 30

//Розмір буфета для зберігання коду

6

unsigned char flz;

//Прапор затримки

7

unsigner int bufr [bsize];

//Буфер в ОЗУ для зберігання коду

8#pragma warn –

9eeprom unsigned char klen ; //Комірки для зберігання довжини коду

10 eeprom unsigned int bufe [bsize]; //Буфер в EEPROM для зберігання коду

- 19 -

11#pragma warn-

// Переривання по переповненні таймера 1

12interrupt [TIM1_0VF] void timer1_ovf_isr(void)

{

13flz=1;

}

//Переривання по співпадінню в каналі А Таймера 1

14interrupt [TIM1_COMPA] void timer1_compa_isr(void)

{

15flz=1;

}

//Функція запиту клавіатури і антидребезга

16unsigned intincod (void)

 

{

//Створюємо локальні змінні

17

unsigned int cod0=0;

//Допоміжна змінна

18

unsigned int cod1;

//Ще одна допоміжна змінна

19

unsigned char k;

//Параметр циклу антидребзга

20

for (k=0; k<kandr; k++)

// Цикл антидребезга

 

{

 

21

cod1=PINB&0x7;

//Формує перший байт коду

22

cod1=(cod1<<8)+(PIND&0x7F); //Формує повний код стануклавіатур

23

if (cod0!=cod1)

//Порівнюємо з початковим кодом

 

{

 

24

k=0;

//Якщо не рівні , скидаємо лічильник

25

cod0=cod1 ;

//Нове значення початкового коду

 

}

 

 

}

 

26return cod1;

}

//Процедура формування затримки

27void wait (unsigned char kodz)

{

28

if (kodz==1) TIMSK=0x40;

//Вибір маски переривань по таймеру

- 20 -

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]