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

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

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

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

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

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

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ "ЛЬВІВСЬКА ПОЛІТЕХНІКА" ІНСТИТУТ КОМП’ЮТЕРНИХ ТЕХНОЛОГІЙ, АВТОМАТИКИ ТА МЕТРОЛОГІЇ КАФЕДРА ”ЗАХИСТ ІНФОРМАЦІЇ”  Звіт до лабораторної роботи № 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:38

Коментарі

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

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

Нічого не вибрано
0%

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

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

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

Admin

26.02.2023 12:38

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