Побудова охоронних систем з GSM-сигналізацією на AVR-мікроконтролерах

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Інститут комп’ютерних технологій, автоматики та метрології
Факультет:
Не вказано
Кафедра:
Захист інформації

Інформація про роботу

Рік:
2024
Тип роботи:
Звіт до лабораторної роботи
Предмет:
Мікропроцесори

Частина тексту файла (без зображень, графіків і формул):

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ "ЛЬВІВСЬКА ПОЛІТЕХНІКА" ІНСТИТУТ КОМП’ЮТЕРНИХ ТЕХНОЛОГІЙ, АВТОМАТИКИ ТА МЕТРОЛОГІЇ КАФЕДРА ”ЗАХИСТ ІНФОРМАЦІЇ”  Звіт до лабораторної роботи № 4 з курсу: "Мікропроцесори в системах технічного захисту інформації" на тему: “ Побудова охоронних систем з GSM-сигналізацією на AVR-мікроконтролерах” Варіант – 5 Мета роботи: Ознайомитись з принципами побудови охоронних систем з GSM-сигналізацією і їх програмно-апаратною реалізацією на AVR-мікроконтролерах. Отримати навики написання програм для AVR-мікроконтролерів на мові С в середовищі CodeVisionAVR. Текст завдання: Домашня підготовка до роботи: 1. Вивчити теоретичний матеріал. 2. Вивчити основні властивості мікроконтролера AT90S2313, принципи побудови GSM сигналізацій та функціонування GSM-модемів необхідні для виконання лабораторної роботи. 3. Підготовити програму функціонування GSM-сигналізації згідно індивідуального завдання в Табл. Виконання в лабораторії: 1. Створити проект в CodeVisionAVR, ввести свою програму, провести її компіляцію. 2. Відкрити файл LR_4.dsn в програмі Proteus, внести зміни у схему відповідно до свого індивідуального завдання, підключити до МК отриманий в CodeVisionAVR hex-файл. 3. Запустити режим симуляції схеми та перевірити правильність функціонування GSM- сигналізації у всіх режимах роботи: постановка і зняття з охорони, спрацювання охоронних давачів. № Тактова частота, МГц Тз1, с F1, Гц Тз2, с F2, Гц Тип шлейфу 1 Тип шлейфу 2 Виводи для підключення шлейфу No 1 Виводи для підключення шлейфу No 2 Вивід МК для підключення світлодіода Вивід МК для підключення кнопки  17 10 10 1,5 40 15 НЗ НЗ PD2 PB2 PB3 PB5   Лістинг програми одержаної в AVR Studio та необхідні розрахунки: Файл gsm.h // Бібліотечні файли #include <90S2313.h> #include <delay.h> #include <stdio.h> #include <sleep.h> //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// // Константи // Службові символи для обміну даними з GSM-модемом #define ASCII_CR 0x0D #define ASCII_LF 0x0A #define ASCII_CTRL_Z 0x1A // Константи ініціалізації таймерів та UART // Період мигання світлодіоду з частотою 2 Гц таймером Т1 в режимі порівняння DIV = 256 // TimerT1_2Hz = (F * T/DIV) - 1 #define TimerT1_2Hz 19530 // Період мигання світлодіоду з частотою 10 Гц DIV = 256 #define TimerT1_11Hz 3905 // Швидкість передачі даних 9600 Бод #define BAUD_RATE_9600 64 // Регістри вводу-виводу МК AT90S2313 // Модуль UART // Регістр статусу USR #define RXC 7 #define TXC 6 #define UDRE 5 // Регістр управління UСR #define RXCIE 7 #define TXCIE 6 #define UDRIE 5 #define RXEN 4 #define TXEN 3 // Таймери // Регістр управління TCCR0 таймера Т0 #define CS02 2 #define CS01 1 #define CS00 0 // Регістр управління TCCR1A таймера Т1 #define COM1A1 7 #define COM1A0 6 // Регістр управління TCCR1B таймера Т1 #define CTC1 3 #define CS12 2 #define CS11 1 #define CS10 0 // Регістр дозволу переривань від таймерів TIMSK #define TOIE1 7 #define OCIE1A 6 #define TOIE0 1 // Підключення охоронних шлейфів #define SCHLEIF_1_PORT PORTD #define SCHLEIF_1_DDR DDRD #define SCHLEIF_1_PIN PIND #define SCHLEIF_1_NC 5 #define SCHLEIF_2_PORT PORTB #define SCHLEIF_2_DDR DDRB #define SCHLEIF_2_PIN PINB #define SCHLEIF_2_NO 5 // Підключення світлодіода #define LED_PORT PORTB #define LED_DDR DDRB #define LED_PIN PINB #define LED 3 // Підключення секретної кнопки постановки/зняття з охорони #define SW_PORT PORTB #define SW_DDR DDRB #define SW_PIN PINB #define SW 6 // Час постановки на охорону в секундах #define T_ALARM_ON 3 // Час зняття з охорони в секундах #define T_ALARM_OFF 3 // Стан GSM-сигналізації: STATE_OFF - виключена, STATE_ON - включена #define STATE_OFF 0 #define STATE_ON 1 // Стан шлейфу: NO_ALARM- немає спрацювання, ALARM - є спрацювання, NO_ACTIVE - шлейф не контролюється #define NO_ALARM 0 #define ALARM 1 #define NO_ACTIVE 2 ///////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////// // Тип даних користувача typedef unsigned char byte; // Типи SMS-повідомлень enum SMS_Type{Security_On, Security_Off, Alarm_Schleif_1, Alarm_Schleif_2}; ///////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////// // Глобальні змінні // Поточний стан GSM-сигналізації volatile byte State = STATE_OFF; // Стан шлейфу 1 з нормально розімкненими контактами byte Schleif1_NC_Status = NO_ALARM; // Стан шлейфу 2 з нормально замкненими контактами byte Schleif2_NO_Status = NO_ALARM; // Номер адміністратора у форматі 0хх1234567 byte AdminNumber[10] = {'0', '6', '7', '1', '2', '3', '4', '5', '6', '7'}; ///////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////// void Pin_Init(void); void SMS_Send(char* cmd, byte type); Файл my_lab_4.c #include <gsm.h> ////////////////////////////////////////////////////////////////// // П/п обробки перерривання від таймера Т0, яка здійснює опитування секретної кнопки interrupt [7] void Timer0_Ovf(void) { byte temp; // Прочитати стан секретної кнопки temp = SW_PIN; temp = (temp & (1<<SW)) && 1; if (State == STATE_OFF) { if (temp == 0) State = STATE_ON; } else { if (temp == 1) State = STATE_OFF; } }; // Якщо охорона виключена // Якщо кнопка натиснута - // включити охорону // Якщо охорона включена // Якщо кнопка ненатиснута - // виключити охорону ////////////////////////////////////////////////////////////////// void main(void) { byte LFCount, Responce, temp; // Масив для відправки АТ-команд byte CMD[25]; ////////////////////////////////////////////////////////////////////////////////// // Ініціалізація МК // Налаштування виводів МК Pin_Init(); // Задати швидкість передачі 9600 Бод UBRR = BAUD_RATE_9600; // Дозволити прийом і передачу даних: 8 біт, 1 стоп-біт, 1 старт-біт. UCR = (1<<RXEN) | (1<<TXEN); // Дозволити перехід в режим пониженого енергоспоживання sleep_enable(); ////////////////////////////////////////////////////////////////////////////////// // Ініціалізація GSM-модему // Затримка 4 секунди для переходу GSM-модему в робочий режим delay_ms(4000); // Послати команду АТЕ0 - відключення еха CMD[0] = 'A'; CMD[1] = 'T'; CMD[2] = 'E', CMD[3] = '0'; CMD[4] = ASCII_CR; CMD[5] = 0; // Відіслати команду puts(CMD); // Прийом відповіді //LFCount = 0; //while(1) //{ //Responce = getchar(); //if(Responce == ASCII_LF) //LFCount++; // Отримати символ // Якщо це символ нового рядку //if(LFCount == 2) // Якщо отримано два LF - //break; // прийом відповіді завершено //}; // Послати команду АТ+СMGS=1 - задати текстовий режим відправлення SMS CMD[0] = 'A'; CMD[1] = 'T'; CMD[2] = '+'; CMD[3] = 'C'; CMD[4] = 'M'; CMD[5] = 'G'; CMD[6] = 'F'; CMD[7] = '='; CMD[8] = '1'; CMD[9] = ASCII_CR; CMD[10] = 0; // Відіслати команду puts(CMD); // Прийом відповіді //LFCount = 0; //while(1) //{ //Responce = getchar(); //if(Responce == ASCII_LF) // Якщо це символ нового рядку //LFCount++; //if(LFCount == 2) // Якщо отримано два LF - //break; // прийом відповіді завершено //}; /////////////////////////////////////////////////////////////////////////////// // Ініціалізації охоронної сигналізації SecurityInit: // Стан - охорона виключена State = STATE_OFF; // Стан шлейфів - не було спрацювань Schleif1_NC_Status = NO_ALARM; Schleif2_NO_Status = NO_ALARM; // Опитування секретної кнопки з періодом 0.1 с. // Дозволити переривання від таймера Т0 по переповненню TIMSK = (1<<TOIE0); // Коефіцієнт ділення - 1024. Період опитування = 1024 * 256/4000000 = 0.06 с. TCCR0 = (1<<CS02) | (1<<CS00); // Дозволити переривання #asm("sei"); /////////////////////////////////////////////////////////////////////////////// // Очікування переходу в режим охорони while(1) { idle(); if(State == STATE_ON) break; }; /////////////////////////////////////////////////////////////////////////////// // Режим охорони активований // Зупинити таймер Т0 TCCR0 = 0; // Затримка Т1 для виходу з об'єкту for(temp = 0; temp < T_ALARM_ON; temp++) delay_ms(1000); // Відіслати SMS-повідомлення Security_On SMS_Send(CMD, Security_On); delay_ms(10); // Мигати світлодіодом з частотою F1 OCR1 = TimerT1_2Hz; TCCR1A = (1<<COM1A0); TCCR1B = (1<<CS12) | (1<<CTC1); // Стан виводу РВ3 інвертується // Режим порівняння з обнуленням, DIV = 256 // Опитувати кнопку з частотою 15 Гц TCCR0 = (1<<CS02) | (1<<CS00); // DIV = 1024 /////////////////////////////////////////////////////////////////////////////// // Режим охорони while(1) { idle(); // Перейти в режим пониженого енергоспоживання Idle if(State == STATE_OFF) { TCCR0 = 0; SMS_Send(CMD, Security_Off); TCCR1B = 0; TCCR1A = 0; LED_PORT.LED = 0; delay_ms(3000); LED_PORT.LED = 1; // Якщо охорона була відключена // Зупинити таймер Т0 // Відправити SMS-повідомлення Security_Off // Зупинити таймер Т1 // Включити світлодіод // Затримка 3 секунди // Виключити світлодіод break; // Вийти з режиму охорони } else // Якщо охорона включена { // Опитати охоронний шлейф 1 temp = SCHLEIF_1_PIN; temp = (temp & (1<<SCHLEIF_1_NC)) && 1; // Якщо є спрацювання шлейфу 1 і шлейф контролюється if((temp == 1) && (Schleif1_NC_Status == NO_ALARM)) Schleif1_NC_Status = ALARM; // Встановити статус тривога if(Schleif1_NC_Status == NO_ACTIVE) { if(temp == 0) Schleif1_NC_Status = NO_ALARM; } // Якщо шлейф неконтролюється // і шлейф відновився // почати його контролювати // Опитати охоронний шлейф 2 temp = SCHLEIF_2_PIN; temp = (temp & (1<<SCHLEIF_2_NO)) && 1; // Якщо є спрацювання шлейфу 2 і шлейф контролюється if((temp == 1) && (Schleif2_NO_Status == NO_ALARM)) Schleif2_NO_Status = ALARM; // Встановити статус тривога if(Schleif2_NO_Status == NO_ACTIVE) { if(temp == 0) Schleif2_NO_Status = NO_ALARM; } // Якщо шлейф неконтролюється // і шлейф відновився // почати його контролювати // Якщо є спрацювання хоча б 1-го шлейфу if((Schleif1_NC_Status == ALARM) || (Schleif2_NO_Status == ALARM)) { OCR1 = TimerT1_11Hz; // Мигати світлодіодом з частотою F2 TCNT1 = 0; // Зупитини опитування кнопки і шлейфів TCCR0 = 0; for(temp = 0; temp < T_ALARM_OFF; temp++) // Затримка Т2 для виключення охорони delay_ms(1000); temp = SW_PIN; temp = (temp & (1<<SW)) && 1; // Перевірити стан кнопки if(temp == 0) // Якщо охорону не встигли відключити { if(Schleif1_NC_Status == ALARM) // Якщо спрацював перший шлейф { SMS_Send(CMD, Alarm_Schleif_1); // Відправити SMS-повідомлення Schleif 1 delay_ms(10); Schleif1_NC_Status = NO_ACTIVE; // Спрацювавший шлейф не контролюється } if(Schleif2_NO_Status == ALARM) // Якщо спрацював другий шлейф { SMS_Send(CMD, Alarm_Schleif_2);// Відправити SMS-повідомлення Schleif 2 delay_ms(10); Schleif2_NO_Status = NO_ACTIVE;// Спрацювавший шлейф не контролюється } delay_ms(4000); // Затримка для відновлення шлейфів TCCR0 = (1<<CS02) | (1<<CS00); // Продовжити опитування кнопки і шлейфів } else // Якщо охорону встигли відключити { State = STATE_OFF; // Перейти в неактивний режим TCCR0 = 0; // Зупитини опитування кнопки і шлейфів SMS_Send(CMD, Security_Off); // Відправити SMS-повідомлення Security_Off delay_ms(10); TCCR1B = 0; // Виключити блимання світлодіодом TCCR1A = 0; LED_PORT.LED = 0; delay_ms(3000); LED_PORT.LED = 1; break; // Включити світлоідод на 3 сек // Виключити світлодіод // Вийти з режиму охорони } } } }; goto SecurityInit; // Перейти до ініціалізації охоронної системи }; ////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////// // Функція ініціалізації виводів мікроконтролера void Pin_Init(void) { SCHLEIF_1_PORT.SCHLEIF_1_NC = 0; // Шлейф 1 - вхід SCHLEIF_1_DDR.SCHLEIF_1_NC = 0; SCHLEIF_2_PORT.SCHLEIF_2_NO = 0; // Шлейф 2 - вхід SCHLEIF_2_DDR.SCHLEIF_2_NO = 0; LED_PORT.LED = 1; // Світлодіод - вихід, виключений LED_DDR.LED = 1; SW_PORT.SW = 1; // Кнопка - вхід, внутрішній резистор SW_DDR.SW = 0; }; ////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////// // Функція відправлення SMS-повідомлення // Вхідні параметри: // cmd - масив для запису АТ-команди; // type - тип повідомлення. void SMS_Send(char* cmd, byte type) { byte Responce; // Заборонити переривання #asm("cli") // Задаємо команду відправлення SMS-повідомлення AT+CMGS=номер cmd[0] = 'A'; cmd[1] = 'T'; cmd[2] = '+'; cmd[3] = 'C'; cmd[4] = 'M'; cmd[5] = 'G'; cmd[6] = 'S'; cmd[7] = '='; cmd[8] = AdminNumber[0]; cmd[9] = AdminNumber[1]; cmd[10] = AdminNumber[2]; cmd[11] = AdminNumber[3]; cmd[12] = AdminNumber[4]; cmd[13] = AdminNumber[5]; cmd[14] = AdminNumber[6]; cmd[15] = AdminNumber[7]; cmd[16] = AdminNumber[8]; cmd[17] = AdminNumber[9]; cmd[18] = ASCII_CR; cmd[19] = 0; // Відправляємо команду в GSM-модем puts(cmd); // Очікуємо від GSM-модему запрошення > на ввід тексту //while(1) //{ //Responce = getchar(); // Прийняти символ //if(Responce == '>') // Якщо це символ > - запрошення отримано, вийти з циклу //break; //}; //Responce = getchar(); // Прийняти від GSM-модему символ пробілу після > // Задати текст SMS-повідомлення if((type == Alarm_Schleif_1) || (type == Alarm_Schleif_2)) // Якщо спрацював шлейф { cmd[0] = 'S'; cmd[1] = 'l'; cmd[2] = 'e'; cmd[3] = 'i'; cmd[4] = 'f'; cmd[5] = ' '; if(type == Alarm_Schleif_1) cmd[6] = '1'; else cmd[6] = '2'; //Якщо спрацював перший шлейф - //повідомлення Schleif 1 //Якщо спрацював другий шлейф - //повідомлення Schleif 2 cmd[7] = ASCII_CTRL_Z; cmd[8] = ASCII_CR; cmd[9] = 0; } else if((type==Security_On) || (type==Security_Off)) // Якщо поставлено/знято з охорони { cmd[0] = 'S'; cmd[1] = 'e'; cmd[2] = 'c', cmd[3] = 'u'; cmd[4] = 'r'; cmd[5] = 'i'; cmd[6] = 't'; cmd[7] = 'y'; cmd[8] = ' '; cmd[9] = 'O'; if(type == Security_On) { cmd[10] = 'n'; cmd[11] = ASCII_CTRL_Z; cmd[12] = ASCII_CR; cmd[13] = 0; } else { cmd[10] = 'f'; cmd[11] = 'f'; cmd[12] = ASCII_CTRL_Z; cmd[13] = ASCII_CR; cmd[14] = 0; } } // Відправити текст повідомлення puts(cmd); // Затримка для отримання відповіді від GSM-модему delay_ms(100); // Дозволити переривання #asm("sei") }; ////////////////////////////////////////////////////////////////////////////////////// Схема симуляції в Proteus:  Висновок: Під час виконання даної лабораторної роботи ми ознайомились з принципами побудови GSM-сигналізації на AVR-мікроконтролерах. GSM-системи, оскільки вони ідеально підходять для охорони будь-яких віддалених об’єктів. GSM-сигналізація представляє собою певний блок (контролер), до якого підключаються охоронні давачі та GSM-модем. Принцип дії GSM-сигналізації полягає в отриманні і обробці контролером даних з встановлених на об’єкті давачів і у випадку спрацювання давача активується GSM-модем, який передає тривожні SMS-повідомлення, або ініціює дзвінок на телефон адміністратора, а також виконує наперед запрограмований алгоритм протидії (включення звукової та світлової сигналізації і т. п.). Адміністратором може виступати будь-яка особа, яка має стільниковий або стаціонарний телефонний апарат.. Також виконуючи дану роботу ми ознайомились з принципами роботи універсального асинхронного приймача/передавача UART, керуванням GSM-модемом за допомогою AT-команд та отримали навики написання програм для AVR-мікроконтролерів на мові С в середовищі CodeVisionAVR.
Антиботан аватар за замовчуванням

12.02.2013 22:02-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!